From 940b4d1848e8c70ab7642901a68594e8016caffc Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 27 Apr 2024 18:51:28 +0200 Subject: Adding upstream version 1:7.0.4. Signed-off-by: Daniel Baumann --- sfx2/AllLangMoTarget_sfx2.mk | 13 + sfx2/CppunitTest_sfx2_classification.mk | 46 + sfx2/CppunitTest_sfx2_controlleritem.mk | 25 + sfx2/CppunitTest_sfx2_dialogs_test.mk | 69 + sfx2/CppunitTest_sfx2_metadatable.mk | 37 + sfx2/CppunitTest_sfx2_misc.mk | 44 + sfx2/CustomTarget_classification.mk | 28 + sfx2/IwyuFilter_sfx2.yaml | 154 + sfx2/JunitTest_sfx2_complex.mk | 62 + sfx2/JunitTest_sfx2_unoapi.mk | 24 + sfx2/Library_sfx.mk | 363 + sfx2/Makefile | 7 + sfx2/Module_sfx2.mk | 58 + sfx2/Package_classification.mk | 22 + sfx2/Package_emoji.mk | 16 + sfx2/PythonTest_sfx2_python.mk | 21 + sfx2/README | 28 + sfx2/UIConfig_sfx.mk | 71 + sfx2/classification/CommonTypes.xsd | 103 + sfx2/classification/README | 7 + sfx2/classification/baf.xsd | 299 + sfx2/classification/baf_loext.xsd | 19 + sfx2/classification/example.xml | 89 + sfx2/classification/example_ca-ES.xml | 71 + sfx2/classification/example_fr-FR.xml | 84 + sfx2/classification/example_hu-HU.xml | 71 + sfx2/classification/example_nl-NL.xml | 71 + sfx2/classification/example_pt-BR.xml | 71 + sfx2/classification/example_sl-SI.xml | 76 + sfx2/classification/xAL-types.xsd | 510 + sfx2/classification/xAL.xsd | 671 + sfx2/classification/xNL-types.xsd | 221 + sfx2/classification/xNL.xsd | 283 + sfx2/classification/xlink-2003-12-31.xsd | 89 + sfx2/doc/sfx2doc.html | 77 + sfx2/doc/sfx2doc0001.svg | 99 + sfx2/emojiconfig/emoji.json | 26822 +++++++++++++++++++ sfx2/inc/SfxRedactionHelper.hxx | 145 + sfx2/inc/arrdecl.hxx | 30 + sfx2/inc/autoredactdialog.hxx | 177 + sfx2/inc/bitmaps.hlst | 94 + sfx2/inc/bitset.hxx | 49 + sfx2/inc/bluthsndapi.hxx | 28 + sfx2/inc/charmapcontrol.hxx | 66 + sfx2/inc/checkin.hxx | 31 + sfx2/inc/dinfdlg.hrc | 79 + sfx2/inc/doctempl.hrc | 43 + sfx2/inc/emojicontrol.hxx | 51 + sfx2/inc/emojiview.hxx | 78 + sfx2/inc/emojiviewitem.hxx | 35 + sfx2/inc/fwkhelper.hxx | 33 + sfx2/inc/guisaveas.hxx | 83 + sfx2/inc/inettbc.hxx | 64 + sfx2/inc/notebookbar/NotebookbarTabControl.hxx | 47 + sfx2/inc/pch/precompiled_sfx.cxx | 12 + sfx2/inc/pch/precompiled_sfx.hxx | 481 + sfx2/inc/preventduplicateinteraction.hxx | 338 + sfx2/inc/recentdocsview.hxx | 99 + sfx2/inc/saveastemplatedlg.hxx | 58 + sfx2/inc/sfxbasecontroller_internal.hxx | 19 + sfx2/inc/sidebar/Accessible.hxx | 60 + sfx2/inc/sidebar/AccessibleTitleBar.hxx | 44 + sfx2/inc/sidebar/ContextChangeBroadcaster.hxx | 67 + sfx2/inc/sidebar/ContextList.hxx | 66 + sfx2/inc/sidebar/ControlFactory.hxx | 51 + sfx2/inc/sidebar/ControllerFactory.hxx | 71 + sfx2/inc/sidebar/DeckDescriptor.hxx | 53 + sfx2/inc/sidebar/DeckLayouter.hxx | 48 + sfx2/inc/sidebar/DeckTitleBar.hxx | 52 + sfx2/inc/sidebar/DrawHelper.hxx | 47 + sfx2/inc/sidebar/MenuButton.hxx | 45 + sfx2/inc/sidebar/Paint.hxx | 73 + sfx2/inc/sidebar/PanelDescriptor.hxx | 50 + sfx2/inc/sidebar/PanelTitleBar.hxx | 62 + sfx2/inc/sidebar/TabItem.hxx | 46 + sfx2/inc/sidebar/TitleBar.hxx | 76 + sfx2/inc/sidebar/Tools.hxx | 63 + sfx2/inc/sidebar/UnoDeck.hxx | 62 + sfx2/inc/sidebar/UnoDecks.hxx | 54 + sfx2/inc/sidebar/UnoPanel.hxx | 69 + sfx2/inc/sidebar/UnoPanels.hxx | 57 + sfx2/inc/sidebar/UnoSidebar.hxx | 54 + sfx2/inc/sorgitm.hxx | 44 + sfx2/inc/srchdlg.hxx | 73 + sfx2/inc/strings.hxx | 58 + sfx2/inc/templatecontaineritem.hxx | 27 + sfx2/inc/templatedefaultview.hxx | 33 + sfx2/inc/templateviewitem.hxx | 45 + sfx2/inc/thumbnailviewitem.hxx | 137 + sfx2/inc/unoctitm.hxx | 145 + sfx2/qa/complex/sfx2/DocumentEvents.java | 221 + sfx2/qa/complex/sfx2/DocumentMetadataAccess.java | 1228 + sfx2/qa/complex/sfx2/DocumentProperties.java | 516 + sfx2/qa/complex/sfx2/GlobalEventBroadcaster.java | 249 + sfx2/qa/complex/sfx2/UndoManager.java | 1457 + sfx2/qa/complex/sfx2/testdocuments/CUSTOM.odt | Bin 0 -> 1021 bytes sfx2/qa/complex/sfx2/testdocuments/TEST.odt | Bin 0 -> 13803 bytes sfx2/qa/complex/sfx2/testdocuments/TESTRDFA.odt | Bin 0 -> 7540 bytes sfx2/qa/complex/sfx2/testdocuments/empty.rdf | 13 + sfx2/qa/complex/sfx2/tools/TestDocument.java | 34 + sfx2/qa/complex/sfx2/tools/WriterHelper.java | 210 + sfx2/qa/complex/sfx2/undo/CalcDocumentTest.java | 113 + sfx2/qa/complex/sfx2/undo/ChartDocumentTest.java | 257 + sfx2/qa/complex/sfx2/undo/DocumentTest.java | 77 + sfx2/qa/complex/sfx2/undo/DocumentTestBase.java | 44 + sfx2/qa/complex/sfx2/undo/DrawDocumentTest.java | 35 + .../undo/DrawingOrPresentationDocumentTest.java | 207 + sfx2/qa/complex/sfx2/undo/ImpressDocumentTest.java | 35 + sfx2/qa/complex/sfx2/undo/WriterDocumentTest.java | 121 + sfx2/qa/cppunit/misc/hello.odt | Bin 0 -> 8159 bytes sfx2/qa/cppunit/test_classification.cxx | 144 + sfx2/qa/cppunit/test_controlleritem.cxx | 58 + sfx2/qa/cppunit/test_metadatable.cxx | 249 + sfx2/qa/cppunit/test_misc.cxx | 198 + sfx2/qa/python/check_sidebar.py | 169 + sfx2/qa/python/check_sidebar_registry.py | 89 + sfx2/qa/unit/data/sfx2-dialogs-test.txt | 72 + sfx2/qa/unit/sfx2-dialogs-test.cxx | 63 + sfx2/qa/unoapi/knownissues.xcl | 5 + sfx2/qa/unoapi/sfx.sce | 4 + .../testdocuments/SfxStandaloneDocInfoObject.sdw | Bin 0 -> 8192 bytes sfx2/qa/unoapi/testdocuments/report.stw | Bin 0 -> 11186 bytes sfx2/qa/unoapi/testdocuments/report2.stw | Bin 0 -> 11000 bytes sfx2/sdi/appslots.sdi | 315 + sfx2/sdi/docslots.sdi | 271 + sfx2/sdi/frmslots.sdi | 310 + sfx2/sdi/sfx.sdi | 5626 ++++ sfx2/sdi/sfxitems.sdi | 118 + sfx2/sdi/sfxslots.sdi | 33 + sfx2/sdi/viwslots.sdi | 93 + sfx2/source/accessibility/AccessibilityCheck.cxx | 21 + sfx2/source/accessibility/AccessibilityIssue.cxx | 29 + sfx2/source/appl/app.cxx | 516 + sfx2/source/appl/appbas.cxx | 154 + sfx2/source/appl/appbaslib.cxx | 188 + sfx2/source/appl/appcfg.cxx | 820 + sfx2/source/appl/appchild.cxx | 138 + sfx2/source/appl/appdata.cxx | 140 + sfx2/source/appl/appdde.cxx | 567 + sfx2/source/appl/appdispatchprovider.cxx | 232 + sfx2/source/appl/appinit.cxx | 244 + sfx2/source/appl/appmain.cxx | 38 + sfx2/source/appl/appmisc.cxx | 210 + sfx2/source/appl/appopen.cxx | 1133 + sfx2/source/appl/appquit.cxx | 111 + sfx2/source/appl/appreg.cxx | 108 + sfx2/source/appl/appserv.cxx | 1666 ++ sfx2/source/appl/appuno.cxx | 1843 ++ sfx2/source/appl/childwin.cxx | 739 + sfx2/source/appl/childwinimpl.cxx | 73 + sfx2/source/appl/fileobj.cxx | 434 + sfx2/source/appl/fileobj.hxx | 82 + sfx2/source/appl/flatpak.cxx | 99 + sfx2/source/appl/fwkhelper.cxx | 52 + sfx2/source/appl/getbasctlfunction.cxx | 64 + sfx2/source/appl/getbasctlfunction.hxx | 38 + sfx2/source/appl/helpdispatch.cxx | 105 + sfx2/source/appl/helpdispatch.hxx | 47 + sfx2/source/appl/helpinterceptor.cxx | 265 + sfx2/source/appl/helpinterceptor.hxx | 141 + sfx2/source/appl/impldde.cxx | 348 + sfx2/source/appl/impldde.hxx | 72 + sfx2/source/appl/linkmgr2.cxx | 710 + sfx2/source/appl/linksrc.cxx | 416 + sfx2/source/appl/lnkbase2.cxx | 612 + sfx2/source/appl/macroloader.cxx | 338 + sfx2/source/appl/module.cxx | 260 + sfx2/source/appl/newhelp.cxx | 2701 ++ sfx2/source/appl/newhelp.hxx | 518 + sfx2/source/appl/opengrf.cxx | 282 + sfx2/source/appl/openuriexternally.cxx | 126 + sfx2/source/appl/preventduplicateinteraction.cxx | 220 + sfx2/source/appl/sfxhelp.cxx | 1367 + sfx2/source/appl/sfxpicklist.cxx | 235 + sfx2/source/appl/shellimpl.cxx | 127 + sfx2/source/appl/shutdownicon.cxx | 736 + sfx2/source/appl/shutdownicon.hxx | 160 + sfx2/source/appl/shutdowniconaqua.mm | 509 + sfx2/source/appl/shutdowniconw32.cxx | 811 + sfx2/source/appl/workwin.cxx | 2454 ++ sfx2/source/appl/xpackcreator.cxx | 172 + sfx2/source/bastyp/bitset.cxx | 108 + sfx2/source/bastyp/fltfnc.cxx | 1122 + sfx2/source/bastyp/fltlst.cxx | 118 + sfx2/source/bastyp/fltlst.hxx | 50 + sfx2/source/bastyp/frmhtml.cxx | 101 + sfx2/source/bastyp/frmhtmlw.cxx | 306 + sfx2/source/bastyp/helper.cxx | 235 + sfx2/source/bastyp/mieclip.cxx | 100 + sfx2/source/bastyp/progress.cxx | 401 + sfx2/source/bastyp/sfxhtml.cxx | 343 + sfx2/source/bastyp/sfxresid.cxx | 28 + sfx2/source/config/evntconf.cxx | 219 + sfx2/source/control/asyncfunc.cxx | 28 + sfx2/source/control/bindings.cxx | 1767 ++ sfx2/source/control/charmapcontrol.cxx | 200 + sfx2/source/control/charwin.cxx | 270 + sfx2/source/control/ctrlfactoryimpl.cxx | 62 + sfx2/source/control/ctrlitem.cxx | 351 + sfx2/source/control/dispatch.cxx | 2064 ++ sfx2/source/control/emojicontrol.cxx | 180 + sfx2/source/control/emojipopup.cxx | 65 + sfx2/source/control/emojiview.cxx | 219 + sfx2/source/control/emojiviewitem.cxx | 86 + sfx2/source/control/itemdel.cxx | 84 + sfx2/source/control/minfitem.cxx | 71 + sfx2/source/control/msg.cxx | 56 + sfx2/source/control/msgpool.cxx | 336 + sfx2/source/control/objface.cxx | 465 + sfx2/source/control/recentdocsview.cxx | 428 + sfx2/source/control/recentdocsviewitem.cxx | 223 + sfx2/source/control/recentdocsviewitem.hxx | 67 + sfx2/source/control/request.cxx | 754 + sfx2/source/control/sfxstatuslistener.cxx | 226 + sfx2/source/control/shell.cxx | 726 + sfx2/source/control/sorgitm.cxx | 88 + sfx2/source/control/statcach.cxx | 499 + sfx2/source/control/templatecontaineritem.cxx | 24 + sfx2/source/control/templatedefaultview.cxx | 92 + sfx2/source/control/templatelocalview.cxx | 1344 + sfx2/source/control/templatesearchview.cxx | 245 + sfx2/source/control/templateviewitem.cxx | 123 + sfx2/source/control/thumbnailview.cxx | 2296 ++ sfx2/source/control/thumbnailviewacc.cxx | 1359 + sfx2/source/control/thumbnailviewacc.hxx | 312 + sfx2/source/control/thumbnailviewitem.cxx | 278 + sfx2/source/control/unoctitm.cxx | 1266 + sfx2/source/dialog/alienwarn.cxx | 75 + sfx2/source/dialog/backingcomp.cxx | 743 + sfx2/source/dialog/backingwindow.cxx | 804 + sfx2/source/dialog/backingwindow.hxx | 130 + sfx2/source/dialog/basedlgs.cxx | 323 + sfx2/source/dialog/bluthsnd.cxx | 50 + sfx2/source/dialog/charmappopup.cxx | 75 + sfx2/source/dialog/checkin.cxx | 40 + sfx2/source/dialog/dialoghelper.cxx | 49 + sfx2/source/dialog/dinfdlg.cxx | 2347 ++ sfx2/source/dialog/dockwin.cxx | 1555 ++ sfx2/source/dialog/documentfontsdialog.cxx | 113 + sfx2/source/dialog/filedlghelper.cxx | 2770 ++ sfx2/source/dialog/filedlgimpl.hxx | 219 + sfx2/source/dialog/filtergrouping.cxx | 1166 + sfx2/source/dialog/filtergrouping.hxx | 96 + sfx2/source/dialog/infobar.cxx | 514 + sfx2/source/dialog/inputdlg.cxx | 39 + sfx2/source/dialog/mailmodel.cxx | 846 + sfx2/source/dialog/mgetempl.cxx | 648 + sfx2/source/dialog/mgetempl.hxx | 94 + sfx2/source/dialog/navigat.cxx | 74 + sfx2/source/dialog/newstyle.cxx | 92 + sfx2/source/dialog/partwnd.cxx | 175 + sfx2/source/dialog/passwd.cxx | 195 + sfx2/source/dialog/printopt.cxx | 294 + sfx2/source/dialog/recfloat.cxx | 122 + sfx2/source/dialog/securitypage.cxx | 431 + sfx2/source/dialog/securitypage.hxx | 42 + sfx2/source/dialog/sfxdlg.cxx | 32 + sfx2/source/dialog/splitwin.cxx | 1153 + sfx2/source/dialog/srchdlg.cxx | 134 + sfx2/source/dialog/styfitem.cxx | 32 + sfx2/source/dialog/styledlg.cxx | 124 + sfx2/source/dialog/tabdlg.cxx | 1172 + sfx2/source/dialog/templdlg.cxx | 2334 ++ sfx2/source/dialog/titledockwin.cxx | 276 + sfx2/source/dialog/tplcitem.cxx | 169 + sfx2/source/dialog/tplpitem.cxx | 86 + sfx2/source/dialog/versdlg.cxx | 472 + sfx2/source/doc/DocumentMetadataAccess.cxx | 1384 + sfx2/source/doc/DocumentSigner.cxx | 121 + sfx2/source/doc/Metadatable.cxx | 1603 ++ sfx2/source/doc/QuerySaveDocument.cxx | 38 + sfx2/source/doc/SfxDocumentMetaData.cxx | 2155 ++ sfx2/source/doc/SfxRedactionHelper.cxx | 571 + sfx2/source/doc/autoredactdialog.cxx | 783 + sfx2/source/doc/docfac.cxx | 355 + sfx2/source/doc/docfile.cxx | 4292 +++ sfx2/source/doc/docfilt.cxx | 199 + sfx2/source/doc/docinf.cxx | 324 + sfx2/source/doc/docinsert.cxx | 291 + sfx2/source/doc/docmacromode.cxx | 421 + sfx2/source/doc/docstoragemodifylistener.cxx | 73 + sfx2/source/doc/doctempl.cxx | 1740 ++ sfx2/source/doc/doctemplates.cxx | 2763 ++ sfx2/source/doc/doctemplateslocal.cxx | 215 + sfx2/source/doc/doctemplateslocal.hxx | 77 + sfx2/source/doc/docundomanager.cxx | 424 + sfx2/source/doc/exoticfileloadexception.cxx | 40 + sfx2/source/doc/exoticfileloadexception.hxx | 43 + sfx2/source/doc/frmdescr.cxx | 57 + sfx2/source/doc/graphhelp.cxx | 266 + sfx2/source/doc/graphhelp.hxx | 66 + sfx2/source/doc/guisaveas.cxx | 1855 ++ sfx2/source/doc/iframe.cxx | 415 + sfx2/source/doc/new.cxx | 349 + sfx2/source/doc/objcont.cxx | 663 + sfx2/source/doc/objembed.cxx | 245 + sfx2/source/doc/objitem.cxx | 105 + sfx2/source/doc/objmisc.cxx | 1915 ++ sfx2/source/doc/objserv.cxx | 1955 ++ sfx2/source/doc/objstor.cxx | 3718 +++ sfx2/source/doc/objstor.hxx | 29 + sfx2/source/doc/objxtor.cxx | 1112 + sfx2/source/doc/oleprops.cxx | 1241 + sfx2/source/doc/oleprops.hxx | 389 + sfx2/source/doc/ownsubfilterservice.cxx | 121 + sfx2/source/doc/printhelper.cxx | 817 + sfx2/source/doc/printhelper.hxx | 70 + sfx2/source/doc/saveastemplatedlg.cxx | 180 + sfx2/source/doc/sfxbasemodel.cxx | 4519 ++++ sfx2/source/doc/sfxmodelfactory.cxx | 205 + sfx2/source/doc/signaturestate.cxx | 59 + sfx2/source/doc/syspath.cxx | 37 + sfx2/source/doc/syspath.hxx | 32 + sfx2/source/doc/syspathw32.cxx | 69 + sfx2/source/doc/syspathw32.hxx | 33 + sfx2/source/doc/templatedlg.cxx | 1419 + sfx2/source/doc/watermarkitem.cxx | 82 + sfx2/source/doc/zoomitem.cxx | 169 + sfx2/source/explorer/nochaos.cxx | 186 + sfx2/source/inc/alienwarn.hxx | 39 + sfx2/source/inc/appbaslib.hxx | 98 + sfx2/source/inc/appdata.hxx | 148 + sfx2/source/inc/appopen.hxx | 37 + sfx2/source/inc/asyncfunc.hxx | 36 + sfx2/source/inc/childwinimpl.hxx | 63 + sfx2/source/inc/ctrlfactoryimpl.hxx | 58 + sfx2/source/inc/documentfontsdialog.hxx | 46 + sfx2/source/inc/docundomanager.hxx | 159 + sfx2/source/inc/eventsupplier.hxx | 85 + sfx2/source/inc/fltoptint.hxx | 62 + sfx2/source/inc/helper.hxx | 42 + sfx2/source/inc/helpids.h | 48 + sfx2/source/inc/hintpost.hxx | 59 + sfx2/source/inc/itemdel.hxx | 30 + sfx2/source/inc/macroloader.hxx | 86 + sfx2/source/inc/nochaos.hxx | 35 + sfx2/source/inc/objshimp.hxx | 153 + sfx2/source/inc/openflag.hxx | 34 + sfx2/source/inc/openuriexternally.hxx | 34 + sfx2/source/inc/openurlhint.hxx | 38 + sfx2/source/inc/partwnd.hxx | 76 + sfx2/source/inc/preview.hxx | 41 + sfx2/source/inc/recfloat.hxx | 55 + sfx2/source/inc/sfxpicklist.hxx | 42 + sfx2/source/inc/sfxtypes.hxx | 53 + sfx2/source/inc/sfxurlrelocator.hxx | 52 + sfx2/source/inc/shellimpl.hxx | 96 + sfx2/source/inc/slotserv.hxx | 59 + sfx2/source/inc/splitwin.hxx | 127 + sfx2/source/inc/statcach.hxx | 154 + sfx2/source/inc/templatesearchview.hxx | 68 + sfx2/source/inc/templatesearchviewitem.hxx | 27 + sfx2/source/inc/templdgi.hxx | 313 + sfx2/source/inc/tplcitem.hxx | 45 + sfx2/source/inc/versdlg.hxx | 94 + sfx2/source/inc/workwin.hxx | 302 + sfx2/source/inet/inettbc.cxx | 296 + sfx2/source/notebookbar/ContextVBox.cxx | 76 + sfx2/source/notebookbar/DropdownBox.cxx | 126 + sfx2/source/notebookbar/DropdownBox.hxx | 49 + sfx2/source/notebookbar/NotebookbarPopup.cxx | 159 + sfx2/source/notebookbar/NotebookbarPopup.hxx | 57 + sfx2/source/notebookbar/NotebookbarTabControl.cxx | 386 + sfx2/source/notebookbar/PriorityHBox.cxx | 202 + sfx2/source/notebookbar/PriorityHBox.hxx | 64 + sfx2/source/notebookbar/PriorityMergedHBox.cxx | 113 + sfx2/source/notebookbar/SfxNotebookBar.cxx | 550 + sfx2/source/notify/eventsupplier.cxx | 443 + sfx2/source/notify/globalevents.cxx | 548 + sfx2/source/notify/hintpost.cxx | 53 + sfx2/source/notify/openurlhint.cxx | 32 + sfx2/source/safemode/safemode.cxx | 84 + sfx2/source/sidebar/Accessible.cxx | 52 + sfx2/source/sidebar/AccessibleTitleBar.cxx | 60 + sfx2/source/sidebar/AsynchronousCall.cxx | 71 + sfx2/source/sidebar/Context.cxx | 85 + sfx2/source/sidebar/ContextChangeBroadcaster.cxx | 130 + sfx2/source/sidebar/ContextList.cxx | 104 + sfx2/source/sidebar/ControlFactory.cxx | 38 + sfx2/source/sidebar/ControllerFactory.cxx | 265 + sfx2/source/sidebar/ControllerItem.cxx | 73 + sfx2/source/sidebar/Deck.cxx | 447 + sfx2/source/sidebar/DeckDescriptor.cxx | 62 + sfx2/source/sidebar/DeckLayouter.cxx | 634 + sfx2/source/sidebar/DeckTitleBar.cxx | 145 + sfx2/source/sidebar/DrawHelper.cxx | 127 + sfx2/source/sidebar/FocusManager.cxx | 633 + sfx2/source/sidebar/IContextChangeReceiver.cxx | 29 + sfx2/source/sidebar/ILayoutableWindow.cxx | 29 + sfx2/source/sidebar/MenuButton.cxx | 102 + sfx2/source/sidebar/Paint.cxx | 102 + sfx2/source/sidebar/Panel.cxx | 191 + sfx2/source/sidebar/PanelDescriptor.cxx | 62 + sfx2/source/sidebar/PanelLayout.cxx | 121 + sfx2/source/sidebar/PanelTitleBar.cxx | 207 + sfx2/source/sidebar/ResourceManager.cxx | 789 + sfx2/source/sidebar/Sidebar.cxx | 93 + sfx2/source/sidebar/SidebarChildWindow.cxx | 95 + sfx2/source/sidebar/SidebarController.cxx | 1617 ++ sfx2/source/sidebar/SidebarDockingWindow.cxx | 318 + sfx2/source/sidebar/SidebarModelUpdate.cxx | 20 + sfx2/source/sidebar/SidebarPanelBase.cxx | 199 + sfx2/source/sidebar/SidebarToolBox.cxx | 351 + sfx2/source/sidebar/TabBar.cxx | 417 + sfx2/source/sidebar/TabItem.cxx | 109 + sfx2/source/sidebar/Theme.cxx | 1047 + sfx2/source/sidebar/TitleBar.cxx | 172 + sfx2/source/sidebar/Tools.cxx | 139 + sfx2/source/sidebar/UnoDeck.cxx | 278 + sfx2/source/sidebar/UnoDecks.cxx | 149 + sfx2/source/sidebar/UnoPanel.cxx | 290 + sfx2/source/sidebar/UnoPanels.cxx | 161 + sfx2/source/sidebar/UnoSidebar.cxx | 101 + sfx2/source/statbar/stbitem.cxx | 584 + sfx2/source/styles/StyleManager.cxx | 35 + sfx2/source/toolbox/tbxitem.cxx | 569 + sfx2/source/toolbox/weldutils.cxx | 202 + sfx2/source/view/classificationcontroller.cxx | 368 + sfx2/source/view/classificationhelper.cxx | 988 + sfx2/source/view/frame.cxx | 738 + sfx2/source/view/frame2.cxx | 404 + sfx2/source/view/frmload.cxx | 771 + sfx2/source/view/impframe.hxx | 71 + sfx2/source/view/impviewframe.hxx | 81 + sfx2/source/view/ipclient.cxx | 1119 + sfx2/source/view/lokcharthelper.cxx | 367 + sfx2/source/view/lokhelper.cxx | 614 + sfx2/source/view/printer.cxx | 189 + sfx2/source/view/prnmon.hxx | 55 + sfx2/source/view/sfxbasecontroller.cxx | 1545 ++ sfx2/source/view/userinputinterception.cxx | 270 + sfx2/source/view/viewfac.cxx | 56 + sfx2/source/view/viewfrm.cxx | 3377 +++ sfx2/source/view/viewfrm2.cxx | 380 + sfx2/source/view/viewimp.hxx | 66 + sfx2/source/view/viewprn.cxx | 910 + sfx2/source/view/viewsh.cxx | 2025 ++ sfx2/uiconfig/ui/addtargetdialog.ui | 275 + sfx2/uiconfig/ui/alienwarndialog.ui | 86 + sfx2/uiconfig/ui/autoredactdialog.ui | 321 + sfx2/uiconfig/ui/bookmarkdialog.ui | 140 + sfx2/uiconfig/ui/bookmarkmenu.ui | 39 + sfx2/uiconfig/ui/charmapcontrol.ui | 508 + sfx2/uiconfig/ui/charviewmenu.ui | 25 + sfx2/uiconfig/ui/checkin.ui | 154 + sfx2/uiconfig/ui/classificationbox.ui | 49 + sfx2/uiconfig/ui/cmisinfopage.ui | 46 + sfx2/uiconfig/ui/cmisline.ui | 142 + sfx2/uiconfig/ui/custominfopage.ui | 126 + sfx2/uiconfig/ui/descriptioninfopage.ui | 125 + sfx2/uiconfig/ui/dockingwindow.ui | 19 + sfx2/uiconfig/ui/documentfontspage.ui | 166 + sfx2/uiconfig/ui/documentinfopage.ui | 414 + sfx2/uiconfig/ui/documentpropertiesdialog.ui | 344 + sfx2/uiconfig/ui/editdocumentdialog.ui | 70 + sfx2/uiconfig/ui/editdurationdialog.ui | 363 + sfx2/uiconfig/ui/emojicontrol.ui | 254 + sfx2/uiconfig/ui/errorfindemaildialog.ui | 35 + sfx2/uiconfig/ui/floatingrecord.ui | 65 + sfx2/uiconfig/ui/helpbookmarkpage.ui | 102 + sfx2/uiconfig/ui/helpcontentpage.ui | 70 + sfx2/uiconfig/ui/helpcontrol.ui | 244 + sfx2/uiconfig/ui/helpindexpage.ui | 138 + sfx2/uiconfig/ui/helpmanual.ui | 80 + sfx2/uiconfig/ui/helpsearchpage.ui | 174 + sfx2/uiconfig/ui/helpwindow.ui | 207 + sfx2/uiconfig/ui/inputdialog.ui | 126 + sfx2/uiconfig/ui/licensedialog.ui | 98 + sfx2/uiconfig/ui/linefragment.ui | 238 + sfx2/uiconfig/ui/linkeditdialog.ui | 209 + sfx2/uiconfig/ui/loadtemplatedialog.ui | 410 + sfx2/uiconfig/ui/managestylepage.ui | 253 + sfx2/uiconfig/ui/newstyle.ui | 197 + sfx2/uiconfig/ui/notebookbar.ui | 94 + sfx2/uiconfig/ui/notebookbarpopup.ui | 29 + sfx2/uiconfig/ui/optprintpage.ui | 636 + sfx2/uiconfig/ui/password.ui | 334 + sfx2/uiconfig/ui/printeroptionsdialog.ui | 91 + sfx2/uiconfig/ui/querysavedialog.ui | 83 + sfx2/uiconfig/ui/safemodequerydialog.ui | 70 + sfx2/uiconfig/ui/saveastemplatedlg.ui | 237 + sfx2/uiconfig/ui/searchdialog.ui | 202 + sfx2/uiconfig/ui/securityinfopage.ui | 106 + sfx2/uiconfig/ui/singletabdialog.ui | 87 + sfx2/uiconfig/ui/startcenter.ui | 558 + sfx2/uiconfig/ui/stylecontextmenu.ui | 49 + sfx2/uiconfig/ui/templatecategorydlg.ui | 225 + sfx2/uiconfig/ui/templatedlg.ui | 481 + sfx2/uiconfig/ui/templatepanel.ui | 326 + sfx2/uiconfig/ui/urlbox.ui | 29 + sfx2/uiconfig/ui/versioncommentdialog.ui | 163 + sfx2/uiconfig/ui/versionscmis.ui | 264 + sfx2/uiconfig/ui/versionsofdialog.ui | 346 + sfx2/util/sfx.component | 97 + 494 files changed, 194027 insertions(+) create mode 100644 sfx2/AllLangMoTarget_sfx2.mk create mode 100644 sfx2/CppunitTest_sfx2_classification.mk create mode 100644 sfx2/CppunitTest_sfx2_controlleritem.mk create mode 100644 sfx2/CppunitTest_sfx2_dialogs_test.mk create mode 100644 sfx2/CppunitTest_sfx2_metadatable.mk create mode 100644 sfx2/CppunitTest_sfx2_misc.mk create mode 100644 sfx2/CustomTarget_classification.mk create mode 100644 sfx2/IwyuFilter_sfx2.yaml create mode 100644 sfx2/JunitTest_sfx2_complex.mk create mode 100644 sfx2/JunitTest_sfx2_unoapi.mk create mode 100644 sfx2/Library_sfx.mk create mode 100644 sfx2/Makefile create mode 100644 sfx2/Module_sfx2.mk create mode 100644 sfx2/Package_classification.mk create mode 100644 sfx2/Package_emoji.mk create mode 100644 sfx2/PythonTest_sfx2_python.mk create mode 100644 sfx2/README create mode 100644 sfx2/UIConfig_sfx.mk create mode 100644 sfx2/classification/CommonTypes.xsd create mode 100644 sfx2/classification/README create mode 100644 sfx2/classification/baf.xsd create mode 100644 sfx2/classification/baf_loext.xsd create mode 100644 sfx2/classification/example.xml create mode 100644 sfx2/classification/example_ca-ES.xml create mode 100644 sfx2/classification/example_fr-FR.xml create mode 100644 sfx2/classification/example_hu-HU.xml create mode 100644 sfx2/classification/example_nl-NL.xml create mode 100644 sfx2/classification/example_pt-BR.xml create mode 100644 sfx2/classification/example_sl-SI.xml create mode 100644 sfx2/classification/xAL-types.xsd create mode 100644 sfx2/classification/xAL.xsd create mode 100644 sfx2/classification/xNL-types.xsd create mode 100644 sfx2/classification/xNL.xsd create mode 100644 sfx2/classification/xlink-2003-12-31.xsd create mode 100644 sfx2/doc/sfx2doc.html create mode 100644 sfx2/doc/sfx2doc0001.svg create mode 100644 sfx2/emojiconfig/emoji.json create mode 100644 sfx2/inc/SfxRedactionHelper.hxx create mode 100644 sfx2/inc/arrdecl.hxx create mode 100644 sfx2/inc/autoredactdialog.hxx create mode 100644 sfx2/inc/bitmaps.hlst create mode 100644 sfx2/inc/bitset.hxx create mode 100644 sfx2/inc/bluthsndapi.hxx create mode 100644 sfx2/inc/charmapcontrol.hxx create mode 100644 sfx2/inc/checkin.hxx create mode 100644 sfx2/inc/dinfdlg.hrc create mode 100644 sfx2/inc/doctempl.hrc create mode 100644 sfx2/inc/emojicontrol.hxx create mode 100644 sfx2/inc/emojiview.hxx create mode 100644 sfx2/inc/emojiviewitem.hxx create mode 100644 sfx2/inc/fwkhelper.hxx create mode 100644 sfx2/inc/guisaveas.hxx create mode 100644 sfx2/inc/inettbc.hxx create mode 100644 sfx2/inc/notebookbar/NotebookbarTabControl.hxx create mode 100644 sfx2/inc/pch/precompiled_sfx.cxx create mode 100644 sfx2/inc/pch/precompiled_sfx.hxx create mode 100644 sfx2/inc/preventduplicateinteraction.hxx create mode 100644 sfx2/inc/recentdocsview.hxx create mode 100644 sfx2/inc/saveastemplatedlg.hxx create mode 100644 sfx2/inc/sfxbasecontroller_internal.hxx create mode 100644 sfx2/inc/sidebar/Accessible.hxx create mode 100644 sfx2/inc/sidebar/AccessibleTitleBar.hxx create mode 100644 sfx2/inc/sidebar/ContextChangeBroadcaster.hxx create mode 100644 sfx2/inc/sidebar/ContextList.hxx create mode 100644 sfx2/inc/sidebar/ControlFactory.hxx create mode 100644 sfx2/inc/sidebar/ControllerFactory.hxx create mode 100644 sfx2/inc/sidebar/DeckDescriptor.hxx create mode 100644 sfx2/inc/sidebar/DeckLayouter.hxx create mode 100644 sfx2/inc/sidebar/DeckTitleBar.hxx create mode 100644 sfx2/inc/sidebar/DrawHelper.hxx create mode 100644 sfx2/inc/sidebar/MenuButton.hxx create mode 100644 sfx2/inc/sidebar/Paint.hxx create mode 100644 sfx2/inc/sidebar/PanelDescriptor.hxx create mode 100644 sfx2/inc/sidebar/PanelTitleBar.hxx create mode 100644 sfx2/inc/sidebar/TabItem.hxx create mode 100644 sfx2/inc/sidebar/TitleBar.hxx create mode 100644 sfx2/inc/sidebar/Tools.hxx create mode 100644 sfx2/inc/sidebar/UnoDeck.hxx create mode 100644 sfx2/inc/sidebar/UnoDecks.hxx create mode 100644 sfx2/inc/sidebar/UnoPanel.hxx create mode 100644 sfx2/inc/sidebar/UnoPanels.hxx create mode 100644 sfx2/inc/sidebar/UnoSidebar.hxx create mode 100644 sfx2/inc/sorgitm.hxx create mode 100644 sfx2/inc/srchdlg.hxx create mode 100644 sfx2/inc/strings.hxx create mode 100644 sfx2/inc/templatecontaineritem.hxx create mode 100644 sfx2/inc/templatedefaultview.hxx create mode 100644 sfx2/inc/templateviewitem.hxx create mode 100644 sfx2/inc/thumbnailviewitem.hxx create mode 100644 sfx2/inc/unoctitm.hxx create mode 100644 sfx2/qa/complex/sfx2/DocumentEvents.java create mode 100644 sfx2/qa/complex/sfx2/DocumentMetadataAccess.java create mode 100644 sfx2/qa/complex/sfx2/DocumentProperties.java create mode 100644 sfx2/qa/complex/sfx2/GlobalEventBroadcaster.java create mode 100644 sfx2/qa/complex/sfx2/UndoManager.java create mode 100644 sfx2/qa/complex/sfx2/testdocuments/CUSTOM.odt create mode 100644 sfx2/qa/complex/sfx2/testdocuments/TEST.odt create mode 100644 sfx2/qa/complex/sfx2/testdocuments/TESTRDFA.odt create mode 100644 sfx2/qa/complex/sfx2/testdocuments/empty.rdf create mode 100644 sfx2/qa/complex/sfx2/tools/TestDocument.java create mode 100644 sfx2/qa/complex/sfx2/tools/WriterHelper.java create mode 100644 sfx2/qa/complex/sfx2/undo/CalcDocumentTest.java create mode 100644 sfx2/qa/complex/sfx2/undo/ChartDocumentTest.java create mode 100644 sfx2/qa/complex/sfx2/undo/DocumentTest.java create mode 100644 sfx2/qa/complex/sfx2/undo/DocumentTestBase.java create mode 100644 sfx2/qa/complex/sfx2/undo/DrawDocumentTest.java create mode 100644 sfx2/qa/complex/sfx2/undo/DrawingOrPresentationDocumentTest.java create mode 100644 sfx2/qa/complex/sfx2/undo/ImpressDocumentTest.java create mode 100644 sfx2/qa/complex/sfx2/undo/WriterDocumentTest.java create mode 100644 sfx2/qa/cppunit/misc/hello.odt create mode 100644 sfx2/qa/cppunit/test_classification.cxx create mode 100644 sfx2/qa/cppunit/test_controlleritem.cxx create mode 100644 sfx2/qa/cppunit/test_metadatable.cxx create mode 100644 sfx2/qa/cppunit/test_misc.cxx create mode 100644 sfx2/qa/python/check_sidebar.py create mode 100644 sfx2/qa/python/check_sidebar_registry.py create mode 100644 sfx2/qa/unit/data/sfx2-dialogs-test.txt create mode 100644 sfx2/qa/unit/sfx2-dialogs-test.cxx create mode 100644 sfx2/qa/unoapi/knownissues.xcl create mode 100644 sfx2/qa/unoapi/sfx.sce create mode 100644 sfx2/qa/unoapi/testdocuments/SfxStandaloneDocInfoObject.sdw create mode 100644 sfx2/qa/unoapi/testdocuments/report.stw create mode 100644 sfx2/qa/unoapi/testdocuments/report2.stw create mode 100644 sfx2/sdi/appslots.sdi create mode 100644 sfx2/sdi/docslots.sdi create mode 100644 sfx2/sdi/frmslots.sdi create mode 100644 sfx2/sdi/sfx.sdi create mode 100644 sfx2/sdi/sfxitems.sdi create mode 100644 sfx2/sdi/sfxslots.sdi create mode 100644 sfx2/sdi/viwslots.sdi create mode 100644 sfx2/source/accessibility/AccessibilityCheck.cxx create mode 100644 sfx2/source/accessibility/AccessibilityIssue.cxx create mode 100644 sfx2/source/appl/app.cxx create mode 100644 sfx2/source/appl/appbas.cxx create mode 100644 sfx2/source/appl/appbaslib.cxx create mode 100644 sfx2/source/appl/appcfg.cxx create mode 100644 sfx2/source/appl/appchild.cxx create mode 100644 sfx2/source/appl/appdata.cxx create mode 100644 sfx2/source/appl/appdde.cxx create mode 100644 sfx2/source/appl/appdispatchprovider.cxx create mode 100644 sfx2/source/appl/appinit.cxx create mode 100644 sfx2/source/appl/appmain.cxx create mode 100644 sfx2/source/appl/appmisc.cxx create mode 100644 sfx2/source/appl/appopen.cxx create mode 100644 sfx2/source/appl/appquit.cxx create mode 100644 sfx2/source/appl/appreg.cxx create mode 100644 sfx2/source/appl/appserv.cxx create mode 100644 sfx2/source/appl/appuno.cxx create mode 100644 sfx2/source/appl/childwin.cxx create mode 100644 sfx2/source/appl/childwinimpl.cxx create mode 100644 sfx2/source/appl/fileobj.cxx create mode 100644 sfx2/source/appl/fileobj.hxx create mode 100644 sfx2/source/appl/flatpak.cxx create mode 100644 sfx2/source/appl/fwkhelper.cxx create mode 100644 sfx2/source/appl/getbasctlfunction.cxx create mode 100644 sfx2/source/appl/getbasctlfunction.hxx create mode 100644 sfx2/source/appl/helpdispatch.cxx create mode 100644 sfx2/source/appl/helpdispatch.hxx create mode 100644 sfx2/source/appl/helpinterceptor.cxx create mode 100644 sfx2/source/appl/helpinterceptor.hxx create mode 100644 sfx2/source/appl/impldde.cxx create mode 100644 sfx2/source/appl/impldde.hxx create mode 100644 sfx2/source/appl/linkmgr2.cxx create mode 100644 sfx2/source/appl/linksrc.cxx create mode 100644 sfx2/source/appl/lnkbase2.cxx create mode 100644 sfx2/source/appl/macroloader.cxx create mode 100644 sfx2/source/appl/module.cxx create mode 100644 sfx2/source/appl/newhelp.cxx create mode 100644 sfx2/source/appl/newhelp.hxx create mode 100644 sfx2/source/appl/opengrf.cxx create mode 100644 sfx2/source/appl/openuriexternally.cxx create mode 100644 sfx2/source/appl/preventduplicateinteraction.cxx create mode 100644 sfx2/source/appl/sfxhelp.cxx create mode 100644 sfx2/source/appl/sfxpicklist.cxx create mode 100644 sfx2/source/appl/shellimpl.cxx create mode 100644 sfx2/source/appl/shutdownicon.cxx create mode 100644 sfx2/source/appl/shutdownicon.hxx create mode 100644 sfx2/source/appl/shutdowniconaqua.mm create mode 100644 sfx2/source/appl/shutdowniconw32.cxx create mode 100644 sfx2/source/appl/workwin.cxx create mode 100644 sfx2/source/appl/xpackcreator.cxx create mode 100644 sfx2/source/bastyp/bitset.cxx create mode 100644 sfx2/source/bastyp/fltfnc.cxx create mode 100644 sfx2/source/bastyp/fltlst.cxx create mode 100644 sfx2/source/bastyp/fltlst.hxx create mode 100644 sfx2/source/bastyp/frmhtml.cxx create mode 100644 sfx2/source/bastyp/frmhtmlw.cxx create mode 100644 sfx2/source/bastyp/helper.cxx create mode 100644 sfx2/source/bastyp/mieclip.cxx create mode 100644 sfx2/source/bastyp/progress.cxx create mode 100644 sfx2/source/bastyp/sfxhtml.cxx create mode 100644 sfx2/source/bastyp/sfxresid.cxx create mode 100644 sfx2/source/config/evntconf.cxx create mode 100644 sfx2/source/control/asyncfunc.cxx create mode 100644 sfx2/source/control/bindings.cxx create mode 100644 sfx2/source/control/charmapcontrol.cxx create mode 100644 sfx2/source/control/charwin.cxx create mode 100644 sfx2/source/control/ctrlfactoryimpl.cxx create mode 100644 sfx2/source/control/ctrlitem.cxx create mode 100644 sfx2/source/control/dispatch.cxx create mode 100644 sfx2/source/control/emojicontrol.cxx create mode 100644 sfx2/source/control/emojipopup.cxx create mode 100644 sfx2/source/control/emojiview.cxx create mode 100644 sfx2/source/control/emojiviewitem.cxx create mode 100644 sfx2/source/control/itemdel.cxx create mode 100644 sfx2/source/control/minfitem.cxx create mode 100644 sfx2/source/control/msg.cxx create mode 100644 sfx2/source/control/msgpool.cxx create mode 100644 sfx2/source/control/objface.cxx create mode 100644 sfx2/source/control/recentdocsview.cxx create mode 100644 sfx2/source/control/recentdocsviewitem.cxx create mode 100644 sfx2/source/control/recentdocsviewitem.hxx create mode 100644 sfx2/source/control/request.cxx create mode 100644 sfx2/source/control/sfxstatuslistener.cxx create mode 100644 sfx2/source/control/shell.cxx create mode 100644 sfx2/source/control/sorgitm.cxx create mode 100644 sfx2/source/control/statcach.cxx create mode 100644 sfx2/source/control/templatecontaineritem.cxx create mode 100644 sfx2/source/control/templatedefaultview.cxx create mode 100644 sfx2/source/control/templatelocalview.cxx create mode 100644 sfx2/source/control/templatesearchview.cxx create mode 100644 sfx2/source/control/templateviewitem.cxx create mode 100644 sfx2/source/control/thumbnailview.cxx create mode 100644 sfx2/source/control/thumbnailviewacc.cxx create mode 100644 sfx2/source/control/thumbnailviewacc.hxx create mode 100644 sfx2/source/control/thumbnailviewitem.cxx create mode 100644 sfx2/source/control/unoctitm.cxx create mode 100644 sfx2/source/dialog/alienwarn.cxx create mode 100644 sfx2/source/dialog/backingcomp.cxx create mode 100644 sfx2/source/dialog/backingwindow.cxx create mode 100644 sfx2/source/dialog/backingwindow.hxx create mode 100644 sfx2/source/dialog/basedlgs.cxx create mode 100644 sfx2/source/dialog/bluthsnd.cxx create mode 100644 sfx2/source/dialog/charmappopup.cxx create mode 100644 sfx2/source/dialog/checkin.cxx create mode 100644 sfx2/source/dialog/dialoghelper.cxx create mode 100644 sfx2/source/dialog/dinfdlg.cxx create mode 100644 sfx2/source/dialog/dockwin.cxx create mode 100644 sfx2/source/dialog/documentfontsdialog.cxx create mode 100644 sfx2/source/dialog/filedlghelper.cxx create mode 100644 sfx2/source/dialog/filedlgimpl.hxx create mode 100644 sfx2/source/dialog/filtergrouping.cxx create mode 100644 sfx2/source/dialog/filtergrouping.hxx create mode 100644 sfx2/source/dialog/infobar.cxx create mode 100644 sfx2/source/dialog/inputdlg.cxx create mode 100644 sfx2/source/dialog/mailmodel.cxx create mode 100644 sfx2/source/dialog/mgetempl.cxx create mode 100644 sfx2/source/dialog/mgetempl.hxx create mode 100644 sfx2/source/dialog/navigat.cxx create mode 100644 sfx2/source/dialog/newstyle.cxx create mode 100644 sfx2/source/dialog/partwnd.cxx create mode 100644 sfx2/source/dialog/passwd.cxx create mode 100644 sfx2/source/dialog/printopt.cxx create mode 100644 sfx2/source/dialog/recfloat.cxx create mode 100644 sfx2/source/dialog/securitypage.cxx create mode 100644 sfx2/source/dialog/securitypage.hxx create mode 100644 sfx2/source/dialog/sfxdlg.cxx create mode 100644 sfx2/source/dialog/splitwin.cxx create mode 100644 sfx2/source/dialog/srchdlg.cxx create mode 100644 sfx2/source/dialog/styfitem.cxx create mode 100644 sfx2/source/dialog/styledlg.cxx create mode 100644 sfx2/source/dialog/tabdlg.cxx create mode 100644 sfx2/source/dialog/templdlg.cxx create mode 100644 sfx2/source/dialog/titledockwin.cxx create mode 100644 sfx2/source/dialog/tplcitem.cxx create mode 100644 sfx2/source/dialog/tplpitem.cxx create mode 100644 sfx2/source/dialog/versdlg.cxx create mode 100644 sfx2/source/doc/DocumentMetadataAccess.cxx create mode 100644 sfx2/source/doc/DocumentSigner.cxx create mode 100644 sfx2/source/doc/Metadatable.cxx create mode 100644 sfx2/source/doc/QuerySaveDocument.cxx create mode 100644 sfx2/source/doc/SfxDocumentMetaData.cxx create mode 100644 sfx2/source/doc/SfxRedactionHelper.cxx create mode 100644 sfx2/source/doc/autoredactdialog.cxx create mode 100644 sfx2/source/doc/docfac.cxx create mode 100644 sfx2/source/doc/docfile.cxx create mode 100644 sfx2/source/doc/docfilt.cxx create mode 100644 sfx2/source/doc/docinf.cxx create mode 100644 sfx2/source/doc/docinsert.cxx create mode 100644 sfx2/source/doc/docmacromode.cxx create mode 100644 sfx2/source/doc/docstoragemodifylistener.cxx create mode 100644 sfx2/source/doc/doctempl.cxx create mode 100644 sfx2/source/doc/doctemplates.cxx create mode 100644 sfx2/source/doc/doctemplateslocal.cxx create mode 100644 sfx2/source/doc/doctemplateslocal.hxx create mode 100644 sfx2/source/doc/docundomanager.cxx create mode 100644 sfx2/source/doc/exoticfileloadexception.cxx create mode 100644 sfx2/source/doc/exoticfileloadexception.hxx create mode 100644 sfx2/source/doc/frmdescr.cxx create mode 100644 sfx2/source/doc/graphhelp.cxx create mode 100644 sfx2/source/doc/graphhelp.hxx create mode 100755 sfx2/source/doc/guisaveas.cxx create mode 100644 sfx2/source/doc/iframe.cxx create mode 100644 sfx2/source/doc/new.cxx create mode 100644 sfx2/source/doc/objcont.cxx create mode 100644 sfx2/source/doc/objembed.cxx create mode 100644 sfx2/source/doc/objitem.cxx create mode 100644 sfx2/source/doc/objmisc.cxx create mode 100644 sfx2/source/doc/objserv.cxx create mode 100644 sfx2/source/doc/objstor.cxx create mode 100644 sfx2/source/doc/objstor.hxx create mode 100644 sfx2/source/doc/objxtor.cxx create mode 100644 sfx2/source/doc/oleprops.cxx create mode 100644 sfx2/source/doc/oleprops.hxx create mode 100644 sfx2/source/doc/ownsubfilterservice.cxx create mode 100644 sfx2/source/doc/printhelper.cxx create mode 100644 sfx2/source/doc/printhelper.hxx create mode 100644 sfx2/source/doc/saveastemplatedlg.cxx create mode 100644 sfx2/source/doc/sfxbasemodel.cxx create mode 100644 sfx2/source/doc/sfxmodelfactory.cxx create mode 100644 sfx2/source/doc/signaturestate.cxx create mode 100644 sfx2/source/doc/syspath.cxx create mode 100644 sfx2/source/doc/syspath.hxx create mode 100644 sfx2/source/doc/syspathw32.cxx create mode 100644 sfx2/source/doc/syspathw32.hxx create mode 100644 sfx2/source/doc/templatedlg.cxx create mode 100644 sfx2/source/doc/watermarkitem.cxx create mode 100644 sfx2/source/doc/zoomitem.cxx create mode 100644 sfx2/source/explorer/nochaos.cxx create mode 100644 sfx2/source/inc/alienwarn.hxx create mode 100644 sfx2/source/inc/appbaslib.hxx create mode 100644 sfx2/source/inc/appdata.hxx create mode 100644 sfx2/source/inc/appopen.hxx create mode 100644 sfx2/source/inc/asyncfunc.hxx create mode 100644 sfx2/source/inc/childwinimpl.hxx create mode 100644 sfx2/source/inc/ctrlfactoryimpl.hxx create mode 100644 sfx2/source/inc/documentfontsdialog.hxx create mode 100644 sfx2/source/inc/docundomanager.hxx create mode 100644 sfx2/source/inc/eventsupplier.hxx create mode 100644 sfx2/source/inc/fltoptint.hxx create mode 100644 sfx2/source/inc/helper.hxx create mode 100644 sfx2/source/inc/helpids.h create mode 100644 sfx2/source/inc/hintpost.hxx create mode 100644 sfx2/source/inc/itemdel.hxx create mode 100644 sfx2/source/inc/macroloader.hxx create mode 100644 sfx2/source/inc/nochaos.hxx create mode 100644 sfx2/source/inc/objshimp.hxx create mode 100644 sfx2/source/inc/openflag.hxx create mode 100644 sfx2/source/inc/openuriexternally.hxx create mode 100644 sfx2/source/inc/openurlhint.hxx create mode 100644 sfx2/source/inc/partwnd.hxx create mode 100644 sfx2/source/inc/preview.hxx create mode 100644 sfx2/source/inc/recfloat.hxx create mode 100644 sfx2/source/inc/sfxpicklist.hxx create mode 100644 sfx2/source/inc/sfxtypes.hxx create mode 100644 sfx2/source/inc/sfxurlrelocator.hxx create mode 100644 sfx2/source/inc/shellimpl.hxx create mode 100644 sfx2/source/inc/slotserv.hxx create mode 100644 sfx2/source/inc/splitwin.hxx create mode 100644 sfx2/source/inc/statcach.hxx create mode 100644 sfx2/source/inc/templatesearchview.hxx create mode 100644 sfx2/source/inc/templatesearchviewitem.hxx create mode 100644 sfx2/source/inc/templdgi.hxx create mode 100644 sfx2/source/inc/tplcitem.hxx create mode 100644 sfx2/source/inc/versdlg.hxx create mode 100644 sfx2/source/inc/workwin.hxx create mode 100644 sfx2/source/inet/inettbc.cxx create mode 100644 sfx2/source/notebookbar/ContextVBox.cxx create mode 100644 sfx2/source/notebookbar/DropdownBox.cxx create mode 100644 sfx2/source/notebookbar/DropdownBox.hxx create mode 100644 sfx2/source/notebookbar/NotebookbarPopup.cxx create mode 100644 sfx2/source/notebookbar/NotebookbarPopup.hxx create mode 100644 sfx2/source/notebookbar/NotebookbarTabControl.cxx create mode 100644 sfx2/source/notebookbar/PriorityHBox.cxx create mode 100644 sfx2/source/notebookbar/PriorityHBox.hxx create mode 100644 sfx2/source/notebookbar/PriorityMergedHBox.cxx create mode 100644 sfx2/source/notebookbar/SfxNotebookBar.cxx create mode 100644 sfx2/source/notify/eventsupplier.cxx create mode 100644 sfx2/source/notify/globalevents.cxx create mode 100644 sfx2/source/notify/hintpost.cxx create mode 100644 sfx2/source/notify/openurlhint.cxx create mode 100644 sfx2/source/safemode/safemode.cxx create mode 100644 sfx2/source/sidebar/Accessible.cxx create mode 100644 sfx2/source/sidebar/AccessibleTitleBar.cxx create mode 100644 sfx2/source/sidebar/AsynchronousCall.cxx create mode 100644 sfx2/source/sidebar/Context.cxx create mode 100644 sfx2/source/sidebar/ContextChangeBroadcaster.cxx create mode 100644 sfx2/source/sidebar/ContextList.cxx create mode 100644 sfx2/source/sidebar/ControlFactory.cxx create mode 100644 sfx2/source/sidebar/ControllerFactory.cxx create mode 100644 sfx2/source/sidebar/ControllerItem.cxx create mode 100644 sfx2/source/sidebar/Deck.cxx create mode 100644 sfx2/source/sidebar/DeckDescriptor.cxx create mode 100644 sfx2/source/sidebar/DeckLayouter.cxx create mode 100644 sfx2/source/sidebar/DeckTitleBar.cxx create mode 100644 sfx2/source/sidebar/DrawHelper.cxx create mode 100644 sfx2/source/sidebar/FocusManager.cxx create mode 100644 sfx2/source/sidebar/IContextChangeReceiver.cxx create mode 100644 sfx2/source/sidebar/ILayoutableWindow.cxx create mode 100644 sfx2/source/sidebar/MenuButton.cxx create mode 100644 sfx2/source/sidebar/Paint.cxx create mode 100644 sfx2/source/sidebar/Panel.cxx create mode 100644 sfx2/source/sidebar/PanelDescriptor.cxx create mode 100644 sfx2/source/sidebar/PanelLayout.cxx create mode 100644 sfx2/source/sidebar/PanelTitleBar.cxx create mode 100644 sfx2/source/sidebar/ResourceManager.cxx create mode 100644 sfx2/source/sidebar/Sidebar.cxx create mode 100644 sfx2/source/sidebar/SidebarChildWindow.cxx create mode 100644 sfx2/source/sidebar/SidebarController.cxx create mode 100644 sfx2/source/sidebar/SidebarDockingWindow.cxx create mode 100644 sfx2/source/sidebar/SidebarModelUpdate.cxx create mode 100644 sfx2/source/sidebar/SidebarPanelBase.cxx create mode 100644 sfx2/source/sidebar/SidebarToolBox.cxx create mode 100644 sfx2/source/sidebar/TabBar.cxx create mode 100644 sfx2/source/sidebar/TabItem.cxx create mode 100644 sfx2/source/sidebar/Theme.cxx create mode 100644 sfx2/source/sidebar/TitleBar.cxx create mode 100644 sfx2/source/sidebar/Tools.cxx create mode 100644 sfx2/source/sidebar/UnoDeck.cxx create mode 100644 sfx2/source/sidebar/UnoDecks.cxx create mode 100644 sfx2/source/sidebar/UnoPanel.cxx create mode 100644 sfx2/source/sidebar/UnoPanels.cxx create mode 100644 sfx2/source/sidebar/UnoSidebar.cxx create mode 100644 sfx2/source/statbar/stbitem.cxx create mode 100644 sfx2/source/styles/StyleManager.cxx create mode 100644 sfx2/source/toolbox/tbxitem.cxx create mode 100644 sfx2/source/toolbox/weldutils.cxx create mode 100644 sfx2/source/view/classificationcontroller.cxx create mode 100644 sfx2/source/view/classificationhelper.cxx create mode 100644 sfx2/source/view/frame.cxx create mode 100644 sfx2/source/view/frame2.cxx create mode 100644 sfx2/source/view/frmload.cxx create mode 100644 sfx2/source/view/impframe.hxx create mode 100644 sfx2/source/view/impviewframe.hxx create mode 100644 sfx2/source/view/ipclient.cxx create mode 100644 sfx2/source/view/lokcharthelper.cxx create mode 100644 sfx2/source/view/lokhelper.cxx create mode 100644 sfx2/source/view/printer.cxx create mode 100644 sfx2/source/view/prnmon.hxx create mode 100644 sfx2/source/view/sfxbasecontroller.cxx create mode 100644 sfx2/source/view/userinputinterception.cxx create mode 100644 sfx2/source/view/viewfac.cxx create mode 100644 sfx2/source/view/viewfrm.cxx create mode 100644 sfx2/source/view/viewfrm2.cxx create mode 100644 sfx2/source/view/viewimp.hxx create mode 100644 sfx2/source/view/viewprn.cxx create mode 100644 sfx2/source/view/viewsh.cxx create mode 100644 sfx2/uiconfig/ui/addtargetdialog.ui create mode 100644 sfx2/uiconfig/ui/alienwarndialog.ui create mode 100644 sfx2/uiconfig/ui/autoredactdialog.ui create mode 100644 sfx2/uiconfig/ui/bookmarkdialog.ui create mode 100644 sfx2/uiconfig/ui/bookmarkmenu.ui create mode 100644 sfx2/uiconfig/ui/charmapcontrol.ui create mode 100644 sfx2/uiconfig/ui/charviewmenu.ui create mode 100644 sfx2/uiconfig/ui/checkin.ui create mode 100644 sfx2/uiconfig/ui/classificationbox.ui create mode 100644 sfx2/uiconfig/ui/cmisinfopage.ui create mode 100644 sfx2/uiconfig/ui/cmisline.ui create mode 100644 sfx2/uiconfig/ui/custominfopage.ui create mode 100644 sfx2/uiconfig/ui/descriptioninfopage.ui create mode 100644 sfx2/uiconfig/ui/dockingwindow.ui create mode 100644 sfx2/uiconfig/ui/documentfontspage.ui create mode 100644 sfx2/uiconfig/ui/documentinfopage.ui create mode 100644 sfx2/uiconfig/ui/documentpropertiesdialog.ui create mode 100644 sfx2/uiconfig/ui/editdocumentdialog.ui create mode 100644 sfx2/uiconfig/ui/editdurationdialog.ui create mode 100644 sfx2/uiconfig/ui/emojicontrol.ui create mode 100644 sfx2/uiconfig/ui/errorfindemaildialog.ui create mode 100644 sfx2/uiconfig/ui/floatingrecord.ui create mode 100644 sfx2/uiconfig/ui/helpbookmarkpage.ui create mode 100644 sfx2/uiconfig/ui/helpcontentpage.ui create mode 100644 sfx2/uiconfig/ui/helpcontrol.ui create mode 100644 sfx2/uiconfig/ui/helpindexpage.ui create mode 100644 sfx2/uiconfig/ui/helpmanual.ui create mode 100644 sfx2/uiconfig/ui/helpsearchpage.ui create mode 100644 sfx2/uiconfig/ui/helpwindow.ui create mode 100644 sfx2/uiconfig/ui/inputdialog.ui create mode 100644 sfx2/uiconfig/ui/licensedialog.ui create mode 100644 sfx2/uiconfig/ui/linefragment.ui create mode 100644 sfx2/uiconfig/ui/linkeditdialog.ui create mode 100644 sfx2/uiconfig/ui/loadtemplatedialog.ui create mode 100644 sfx2/uiconfig/ui/managestylepage.ui create mode 100644 sfx2/uiconfig/ui/newstyle.ui create mode 100644 sfx2/uiconfig/ui/notebookbar.ui create mode 100644 sfx2/uiconfig/ui/notebookbarpopup.ui create mode 100644 sfx2/uiconfig/ui/optprintpage.ui create mode 100644 sfx2/uiconfig/ui/password.ui create mode 100644 sfx2/uiconfig/ui/printeroptionsdialog.ui create mode 100644 sfx2/uiconfig/ui/querysavedialog.ui create mode 100644 sfx2/uiconfig/ui/safemodequerydialog.ui create mode 100644 sfx2/uiconfig/ui/saveastemplatedlg.ui create mode 100644 sfx2/uiconfig/ui/searchdialog.ui create mode 100644 sfx2/uiconfig/ui/securityinfopage.ui create mode 100644 sfx2/uiconfig/ui/singletabdialog.ui create mode 100644 sfx2/uiconfig/ui/startcenter.ui create mode 100644 sfx2/uiconfig/ui/stylecontextmenu.ui create mode 100644 sfx2/uiconfig/ui/templatecategorydlg.ui create mode 100644 sfx2/uiconfig/ui/templatedlg.ui create mode 100644 sfx2/uiconfig/ui/templatepanel.ui create mode 100644 sfx2/uiconfig/ui/urlbox.ui create mode 100644 sfx2/uiconfig/ui/versioncommentdialog.ui create mode 100644 sfx2/uiconfig/ui/versionscmis.ui create mode 100644 sfx2/uiconfig/ui/versionsofdialog.ui create mode 100644 sfx2/util/sfx.component (limited to 'sfx2') diff --git a/sfx2/AllLangMoTarget_sfx2.mk b/sfx2/AllLangMoTarget_sfx2.mk new file mode 100644 index 000000000..b0f7dc3ef --- /dev/null +++ b/sfx2/AllLangMoTarget_sfx2.mk @@ -0,0 +1,13 @@ +# -*- 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,sfx)) + +$(eval $(call gb_AllLangMoTarget_set_polocation,sfx,sfx2)) + +# vim: set noet sw=4 ts=4: diff --git a/sfx2/CppunitTest_sfx2_classification.mk b/sfx2/CppunitTest_sfx2_classification.mk new file mode 100644 index 000000000..303d3099d --- /dev/null +++ b/sfx2/CppunitTest_sfx2_classification.mk @@ -0,0 +1,46 @@ +# -*- 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,sfx2_classification)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sfx2_classification, \ + sfx2/qa/cppunit/test_classification \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sfx2_classification)) + +$(eval $(call gb_CppunitTest_use_libraries,sfx2_classification, \ + comphelper \ + cppu \ + cppuhelper \ + test \ + unotest \ + vcl \ + sal \ + sfx \ +)) + +$(eval $(call gb_CppunitTest_use_external,sfx2_classification,boost_headers)) + +$(eval $(call gb_CppunitTest_use_ure,sfx2_classification)) +$(eval $(call gb_CppunitTest_use_vcl,sfx2_classification)) + +$(eval $(call gb_CppunitTest_use_rdb,sfx2_classification,services)) + +$(eval $(call gb_CppunitTest_use_configuration,sfx2_classification)) + +$(eval $(call gb_CppunitTest_use_uiconfigs,sfx2_classification,\ + svx \ +)) + +$(eval $(call gb_CppunitTest_use_packages,sfx2_classification,\ + sfx2_classification \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sfx2/CppunitTest_sfx2_controlleritem.mk b/sfx2/CppunitTest_sfx2_controlleritem.mk new file mode 100644 index 000000000..f81ac1330 --- /dev/null +++ b/sfx2/CppunitTest_sfx2_controlleritem.mk @@ -0,0 +1,25 @@ +# -*- 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,sfx2_controlleritem)) +$(eval $(call gb_CppunitTest_use_sdk_api,sfx2_controlleritem)) +$(eval $(call gb_CppunitTest_add_exception_objects,sfx2_controlleritem, \ + sfx2/qa/cppunit/test_controlleritem \ +)) +$(eval $(call gb_CppunitTest_use_externals,sfx2_controlleritem, \ + boost_headers \ +)) +$(eval $(call gb_CppunitTest_use_libraries,sfx2_controlleritem, \ + cppu \ + cppuhelper \ + sal \ + sfx \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sfx2/CppunitTest_sfx2_dialogs_test.mk b/sfx2/CppunitTest_sfx2_dialogs_test.mk new file mode 100644 index 000000000..88646565d --- /dev/null +++ b/sfx2/CppunitTest_sfx2_dialogs_test.mk @@ -0,0 +1,69 @@ +# -*- 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,sfx2_dialogs_test)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sfx2_dialogs_test, \ + sfx2/qa/unit/sfx2-dialogs-test \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sfx2_dialogs_test)) + +$(eval $(call gb_CppunitTest_set_include,desktop_dialogs_test,\ + -I$(SRCDIR)/sfx2/source/inc \ + -I$(SRCDIR)/sfx2/inc \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,sfx2_dialogs_test, \ + basegfx \ + comphelper \ + cppu \ + cppuhelper \ + drawinglayer \ + editeng \ + i18nlangtag \ + i18nutil \ + msfilter \ + oox \ + sal \ + salhelper \ + sax \ + sfx \ + sot \ + svl \ + svt \ + test \ + tl \ + tk \ + ucbhelper \ + unotest \ + utl \ + vcl \ + xo \ +)) + +$(eval $(call gb_CppunitTest_use_external,sfx2_dialogs_test,boost_headers)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sfx2_dialogs_test)) + +$(eval $(call gb_CppunitTest_use_ure,sfx2_dialogs_test)) +$(eval $(call gb_CppunitTest_use_vcl_non_headless_with_windows,sfx2_dialogs_test)) + +$(eval $(call gb_CppunitTest_use_rdb,sfx2_dialogs_test,services)) + +$(eval $(call gb_CppunitTest_use_configuration,sfx2_dialogs_test)) + +$(eval $(call gb_CppunitTest_use_uiconfigs,sfx2_dialogs_test,\ + sfx \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sfx2/CppunitTest_sfx2_metadatable.mk b/sfx2/CppunitTest_sfx2_metadatable.mk new file mode 100644 index 000000000..7e6d8889a --- /dev/null +++ b/sfx2/CppunitTest_sfx2_metadatable.mk @@ -0,0 +1,37 @@ +# -*- 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/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_CppunitTest_CppunitTest,sfx2_metadatable)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sfx2_metadatable, \ + sfx2/qa/cppunit/test_metadatable \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sfx2_metadatable)) + +$(eval $(call gb_CppunitTest_use_libraries,sfx2_metadatable, \ + cppu \ + cppuhelper \ + sal \ + sfx \ +)) + +$(eval $(call gb_CppunitTest_use_external,sfx2_metadatable,boost_headers)) + +# vim: set noet sw=4 ts=4: diff --git a/sfx2/CppunitTest_sfx2_misc.mk b/sfx2/CppunitTest_sfx2_misc.mk new file mode 100644 index 000000000..c97d97ca4 --- /dev/null +++ b/sfx2/CppunitTest_sfx2_misc.mk @@ -0,0 +1,44 @@ +# -*- 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,sfx2_misc)) + +$(eval $(call gb_CppunitTest_add_exception_objects,sfx2_misc, \ + sfx2/qa/cppunit/test_misc \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sfx2_misc)) + +$(eval $(call gb_CppunitTest_use_libraries,sfx2_misc, \ + comphelper \ + cppu \ + cppuhelper \ + test \ + unotest \ + vcl \ + sal \ + sfx \ + utl \ +)) + +$(eval $(call gb_CppunitTest_use_externals,sfx2_misc,\ + libxml2 \ + boost_headers \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,sfx2_misc)) + +$(eval $(call gb_CppunitTest_use_ure,sfx2_misc)) +$(eval $(call gb_CppunitTest_use_vcl,sfx2_misc)) + +$(eval $(call gb_CppunitTest_use_rdb,sfx2_misc,services)) + +$(eval $(call gb_CppunitTest_use_configuration,sfx2_misc)) + +# vim: set noet sw=4 ts=4: diff --git a/sfx2/CustomTarget_classification.mk b/sfx2/CustomTarget_classification.mk new file mode 100644 index 000000000..4ecc1e750 --- /dev/null +++ b/sfx2/CustomTarget_classification.mk @@ -0,0 +1,28 @@ +# -*- 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_CustomTarget_CustomTarget,sfx2/classification)) + +sfx2_classification_SRC := $(SRCDIR)/sfx2/classification +sfx2_classification_WORK := $(call gb_CustomTarget_get_workdir,sfx2/classification) +sfx2_classification_GEN_example_validated=$(sfx2_classification_WORK)/example.validated + +sfx2_classification_XMLLINTCOMMAND := $(call gb_ExternalExecutable_get_command,xmllint) + +$(sfx2_classification_GEN_example_validated) : $(sfx2_classification_SRC)/baf.xsd $(sfx2_classification_SRC)/example.xml + $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),build,VAL,1) + $(call gb_Helper_abbreviate_dirs,\ + $(sfx2_classification_XMLLINTCOMMAND) --noout --schema $(sfx2_classification_SRC)/baf.xsd $(sfx2_classification_SRC)/example.xml > $@ 2>&1 \ + || (cat $@; false)) + +$(call gb_CustomTarget_get_target,sfx2/classification) : $(sfx2_classification_GEN_example_validated) + +$(sfx2_classification_GEN_example_validated) :| $(call gb_ExternalExecutable_get_dependencies,xmllint) $(sfx2_classification_WORK)/.dir + +# vim: set noet sw=4 ts=4: diff --git a/sfx2/IwyuFilter_sfx2.yaml b/sfx2/IwyuFilter_sfx2.yaml new file mode 100644 index 000000000..e3cab84a6 --- /dev/null +++ b/sfx2/IwyuFilter_sfx2.yaml @@ -0,0 +1,154 @@ +--- +assumeFilename: sfx2/source/appl/app.cxx +blacklist: + sfx2/inc/sidebar/Accessible.hxx: + # base class has to be a complete type + - com/sun/star/accessibility/XAccessible.hpp + sfx2/inc/sidebar/Paint.hxx: + # Needed for boost::variant + - vcl/gradient.hxx + sfx2/inc/sidebar/UnoDeck.hxx: + # base class has to be a complete type + - com/sun/star/ui/XDeck.hpp + sfx2/inc/sidebar/UnoDecks.hxx: + # base class has to be a complete type + - com/sun/star/ui/XDecks.hpp + sfx2/inc/sidebar/UnoPanel.hxx: + # base class has to be a complete type + - com/sun/star/ui/XPanel.hpp + sfx2/inc/sidebar/UnoPanels.hxx: + # base class has to be a complete type + - com/sun/star/ui/XPanels.hpp + sfx2/inc/recentdocsview.hxx: + # Needed for struct declaration + - com/sun/star/beans/PropertyValue.hpp + sfx2/inc/unoctitm.hxx: + # base class has to be a complete type + - com/sun/star/frame/XNotifyingDispatch.hpp + - com/sun/star/lang/XUnoTunnel.hpp + sfx2/source/doc/syspathw32.hxx: + # Needed on WIN32 + - sal/types.h + sfx2/source/appl/appdata.cxx: + # Needed for direct member access + - sfx2/module.hxx + sfx2/source/appl/appdde.cxx: + # Needed on WIN32 + - config_features.h + - rtl/character.hxx + - rtl/malformeduriexception.hxx + - rtl/uri.hxx + - sot/exchange.hxx + - svl/eitem.hxx + - basic/sbstar.hxx + - svl/stritem.hxx + - sfx2/lnkbase.hxx + - sfx2/linkmgr.hxx + - tools/debug.hxx + - tools/urlobj.hxx + - tools/diagnose_ex.h + - unotools/pathoptions.hxx + - vcl/svapp.hxx + - sfx2/viewfrm.hxx + - sfx2/dispatch.hxx + - sfx2/sfxsids.hrc + - sfx2/docfile.hxx + - ucbhelper/content.hxx + - comphelper/processfactory.hxx + sfx2/source/appl/appquit.cxx: + # Needed for DELETEZ to avoid -Wdelete-incomplete warnings + - childwinimpl.hxx + - ctrlfactoryimpl.hxx + - sfx2/doctempl.hxx + - sfx2/fcontnr.hxx + - sfx2/msgpool.hxx + - sfx2/viewsh.hxx + - shellimpl.hxx + sfx2/source/appl/appmisc.cxx: + # Needed for TypedWhichId macro + - svl/stritem.hxx + sfx2/source/appl/appbas.cxx: + # Needed for createSfxPoolItem calls + - svl/eitem.hxx + - sfx2/dinfdlg.hxx + - sfx2/frame.hxx + - sfx2/msg.hxx + - sorgitm.hxx + sfx2/source/appl/newhelp.cxx: + # Actually used + - com/sun/star/i18n/XBreakIterator.hpp + sfx2/source/appl/shutdownicon.cxx: + # Needed on MAC + - osl/file.hxx + # Needed on WIN32 + - sfx2/sfxresid.hxx + - sfx2/strings.hrc + # Don't propose hxx -> h change in URE libs + - osl/module.hxx + sfx2/source/bastyp/fltfnc.cxx: + # Needed for UnoType to work + - com/sun/star/task/XInteractionHandler.hpp + sfx2/source/control/sfxstatuslistener.cxx: + # Actually used + - com/sun/star/frame/XDispatchProvider.hpp + sfx2/source/doc/docinf.cxx: + # Actually used + - com/sun/star/document/XDocumentProperties.hpp + sfx2/source/doc/DocumentMetadataAccess.cxx: + # Actually used + - com/sun/star/embed/XStorage.hpp + sfx2/source/doc/graphhelp.cxx: + # Needed on WIN32 + - o3tl/char16_t2wchar_t.hxx + sfx2/source/doc/guisaveas.cxx: + # Needed on WIN32 + - o3tl/char16_t2wchar_t.hxx + sfx2/source/doc/objstor.cxx: + # Actually used + - com/sun/star/frame/XModel.hpp + sfx2/source/doc/syspath.cxx: + # Needed on WIN32 + - syspathw32.hxx + sfx2/source/doc/syspathw32.cxx: + # Needed on WIN32 + - o3tl/char16_t2wchar_t.hxx + sfx2/source/doc/printhelper.cxx: + # Don't propose hxx -> h change in URE libs + - cppuhelper/interfacecontainer.hxx + sfx2/source/doc/sfxbasemodel.cxx: + # Don't propose hxx -> h change in URE libs + - cppuhelper/interfacecontainer.hxx + sfx2/source/inc/asyncfunc.hxx: + # base class has to be a complete type + - com/sun/star/lang/XUnoTunnel.hpp + sfx2/source/sidebar/ControllerFactory.cxx: + # Actually used + - com/sun/star/frame/XFrame.hpp + # Needed for instantiation of function template specialization + - com/sun/star/lang/XMultiServiceFactory.hpp + sfx2/source/sidebar/Panel.cxx: + # Actually used + - com/sun/star/ui/XUIElement.hpp + sfx2/source/sidebar/SidebarToolBox.cxx: + # Actually used + - com/sun/star/frame/XFrame.hpp + - com/sun/star/frame/XToolbarController.hpp + sfx2/source/sidebar/SidebarController.cxx: + # Actually used + - com/sun/star/awt/XWindowPeer.hpp + - com/sun/star/frame/XDispatch.hpp + - com/sun/star/ui/ContextChangeEventObject.hpp + sfx2/source/view/viewfrm2.cxx: + # Needed for direct member access + - com/sun/star/embed/VerbDescriptor.hpp + sfx2/source/view/classificationhelper.cxx: + # Actually used + - com/sun/star/beans/XPropertyContainer.hpp + - com/sun/star/document/XDocumentProperties.hpp + sfx2/source/view/userinputinterception.cxx: + # Actually used + - com/sun/star/awt/XKeyHandler.hpp + - com/sun/star/awt/XMouseClickHandler.hpp + sfx2/source/view/viewsh.cxx: + # Needed for TypedWhichId define + - svl/eitem.hxx diff --git a/sfx2/JunitTest_sfx2_complex.mk b/sfx2/JunitTest_sfx2_complex.mk new file mode 100644 index 000000000..ac9cb60a4 --- /dev/null +++ b/sfx2/JunitTest_sfx2_complex.mk @@ -0,0 +1,62 @@ +# -*- 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/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_JunitTest_JunitTest,sfx2_complex)) + +$(eval $(call gb_JunitTest_set_defs,sfx2_complex,\ + $$(DEFS) \ + -Dorg.openoffice.test.arg.tdoc=$(SRCDIR)/sfx2/qa/complex/sfx2/testdocuments \ +)) + +$(eval $(call gb_JunitTest_use_unoapi_jars,sfx2_complex)) + +$(eval $(call gb_JunitTest_use_jars,sfx2_complex,\ + test-tools \ +)) + +$(eval $(call gb_JunitTest_add_sourcefiles,sfx2_complex,\ + sfx2/qa/complex/sfx2/DocumentMetadataAccess \ + sfx2/qa/complex/sfx2/DocumentProperties \ + sfx2/qa/complex/sfx2/GlobalEventBroadcaster \ + sfx2/qa/complex/sfx2/UndoManager \ + sfx2/qa/complex/sfx2/DocumentEvents \ + sfx2/qa/complex/sfx2/tools/TestDocument \ + sfx2/qa/complex/sfx2/tools/WriterHelper \ + sfx2/qa/complex/sfx2/undo/CalcDocumentTest \ + sfx2/qa/complex/sfx2/undo/ChartDocumentTest \ + sfx2/qa/complex/sfx2/undo/DocumentTest \ + sfx2/qa/complex/sfx2/undo/DocumentTestBase \ + sfx2/qa/complex/sfx2/undo/DrawDocumentTest \ + sfx2/qa/complex/sfx2/undo/DrawingOrPresentationDocumentTest \ + sfx2/qa/complex/sfx2/undo/ImpressDocumentTest \ + sfx2/qa/complex/sfx2/undo/WriterDocumentTest \ +)) + +$(eval $(call gb_JunitTest_add_classes,sfx2_complex,\ + complex.sfx2.DocumentProperties \ + complex.sfx2.DocumentMetadataAccess \ + complex.sfx2.DocumentEvents \ + complex.sfx2.UndoManager \ +)) +# fd#35663 fails currently: +# complex.sfx2.UndoManager \ +# #i115674# fails currently: misses some OnUnfocus event +# complex.sfx2.GlobalEventBroadcaster \ + +# vim: set noet sw=4 ts=4: diff --git a/sfx2/JunitTest_sfx2_unoapi.mk b/sfx2/JunitTest_sfx2_unoapi.mk new file mode 100644 index 000000000..d812f5e0b --- /dev/null +++ b/sfx2/JunitTest_sfx2_unoapi.mk @@ -0,0 +1,24 @@ +# -*- 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/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_JunitTest_JunitTest,sfx2_unoapi)) + +$(eval $(call gb_JunitTest_set_unoapi_test_defaults,sfx2_unoapi,,sfx.sce)) + +# vim: set noet sw=4 ts=4: diff --git a/sfx2/Library_sfx.mk b/sfx2/Library_sfx.mk new file mode 100644 index 000000000..67a66ef2d --- /dev/null +++ b/sfx2/Library_sfx.mk @@ -0,0 +1,363 @@ +# -*- 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/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Library_Library,sfx)) + +$(eval $(call gb_Library_add_sdi_headers,sfx,sfx2/sdi/sfxslots)) + +$(eval $(call gb_Library_set_componentfile,sfx,sfx2/util/sfx)) + +$(eval $(call gb_Library_set_precompiled_header,sfx,sfx2/inc/pch/precompiled_sfx)) + +$(eval $(call gb_Library_use_custom_headers,sfx,\ + officecfg/registry \ +)) + +$(eval $(call gb_Library_use_sdk_api,sfx)) + +$(eval $(call gb_Library_set_include,sfx,\ + -I$(SRCDIR)/sfx2/inc \ + -I$(SRCDIR)/sfx2/source/inc \ + -I$(WORKDIR)/SdiTarget/sfx2/sdi \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_Library_add_defs,sfx,-DSFX2_DLLIMPLEMENTATION)) + +$(eval $(call gb_Library_add_defs,sfx,\ + $(if $(filter TRUE,$(ENABLE_CUPS)),-DENABLE_CUPS) \ +)) + +$(eval $(call gb_Library_use_libraries,sfx,\ + basegfx \ + comphelper \ + cppu \ + cppuhelper \ + drawinglayer \ + fwe \ + i18nlangtag \ + i18nutil \ + sal \ + salhelper \ + sax \ + sb \ + sot \ + svl \ + svt \ + tk \ + tl \ + ucbhelper \ + utl \ + vcl \ +)) + +$(eval $(call gb_Library_use_externals,sfx,\ + boost_headers \ + libxml2 \ + orcus \ + orcus-parser\ +)) + +$(eval $(call gb_Library_add_exception_objects,sfx,\ + sfx2/source/accessibility/AccessibilityCheck \ + sfx2/source/accessibility/AccessibilityIssue \ + sfx2/source/appl/app \ + sfx2/source/appl/appbas \ + sfx2/source/appl/appbaslib \ + sfx2/source/appl/appcfg \ + sfx2/source/appl/appchild \ + sfx2/source/appl/appdata \ + sfx2/source/appl/appdde \ + sfx2/source/appl/appdispatchprovider \ + sfx2/source/appl/appinit \ + sfx2/source/appl/appmain \ + sfx2/source/appl/appmisc \ + sfx2/source/appl/appopen \ + sfx2/source/appl/appquit \ + sfx2/source/appl/appreg \ + sfx2/source/appl/appserv \ + sfx2/source/appl/appuno \ + sfx2/source/appl/childwin \ + sfx2/source/appl/childwinimpl \ + sfx2/source/appl/fileobj \ + sfx2/source/appl/flatpak \ + sfx2/source/appl/fwkhelper \ + sfx2/source/appl/getbasctlfunction \ + sfx2/source/appl/helpdispatch \ + sfx2/source/appl/helpinterceptor \ + sfx2/source/appl/impldde \ + sfx2/source/appl/linkmgr2 \ + sfx2/source/appl/linksrc \ + sfx2/source/appl/lnkbase2 \ + sfx2/source/appl/macroloader \ + sfx2/source/appl/module \ + sfx2/source/appl/newhelp \ + sfx2/source/appl/opengrf \ + sfx2/source/appl/openuriexternally \ + sfx2/source/appl/preventduplicateinteraction \ + sfx2/source/appl/sfxhelp \ + sfx2/source/appl/sfxpicklist \ + sfx2/source/appl/shellimpl \ + sfx2/source/appl/shutdownicon \ + sfx2/source/appl/workwin \ + sfx2/source/appl/xpackcreator \ + sfx2/source/bastyp/bitset \ + sfx2/source/bastyp/fltfnc \ + sfx2/source/bastyp/fltlst \ + sfx2/source/bastyp/frmhtml \ + sfx2/source/bastyp/frmhtmlw \ + sfx2/source/bastyp/helper \ + sfx2/source/bastyp/mieclip \ + sfx2/source/bastyp/progress \ + sfx2/source/bastyp/sfxhtml \ + sfx2/source/bastyp/sfxresid \ + sfx2/source/config/evntconf \ + sfx2/source/control/asyncfunc \ + sfx2/source/control/bindings \ + sfx2/source/control/ctrlitem \ + sfx2/source/control/ctrlfactoryimpl \ + sfx2/source/control/dispatch \ + sfx2/source/control/itemdel \ + sfx2/source/control/minfitem \ + sfx2/source/control/msg \ + sfx2/source/control/msgpool \ + sfx2/source/control/objface \ + sfx2/source/control/recentdocsview \ + sfx2/source/control/recentdocsviewitem \ + sfx2/source/control/request \ + sfx2/source/control/sfxstatuslistener \ + sfx2/source/control/shell \ + sfx2/source/control/sorgitm \ + sfx2/source/control/statcach \ + sfx2/source/control/templatedefaultview \ + sfx2/source/control/templateviewitem \ + sfx2/source/control/templatelocalview \ + sfx2/source/control/templatecontaineritem \ + sfx2/source/control/templatesearchview \ + sfx2/source/control/thumbnailviewitem \ + sfx2/source/control/thumbnailviewacc \ + sfx2/source/control/thumbnailview \ + sfx2/source/control/emojiviewitem \ + sfx2/source/control/emojiview \ + sfx2/source/control/emojicontrol \ + sfx2/source/control/emojipopup \ + sfx2/source/control/charmapcontrol \ + sfx2/source/control/charwin \ + sfx2/source/control/unoctitm \ + sfx2/source/dialog/alienwarn \ + sfx2/source/dialog/backingcomp \ + sfx2/source/dialog/backingwindow \ + sfx2/source/dialog/basedlgs \ + sfx2/source/dialog/checkin \ + sfx2/source/dialog/dialoghelper \ + sfx2/source/dialog/charmappopup \ + sfx2/source/dialog/dinfdlg \ + sfx2/source/dialog/dockwin \ + sfx2/source/dialog/documentfontsdialog \ + sfx2/source/dialog/filedlghelper \ + sfx2/source/dialog/filtergrouping \ + sfx2/source/dialog/infobar \ + sfx2/source/dialog/inputdlg \ + sfx2/source/dialog/mailmodel \ + sfx2/source/dialog/bluthsnd \ + sfx2/source/dialog/mgetempl \ + sfx2/source/dialog/navigat \ + sfx2/source/dialog/newstyle \ + sfx2/source/dialog/partwnd \ + sfx2/source/dialog/passwd \ + sfx2/source/dialog/printopt \ + sfx2/source/dialog/recfloat \ + sfx2/source/dialog/securitypage \ + sfx2/source/dialog/sfxdlg \ + sfx2/source/dialog/splitwin \ + sfx2/source/dialog/srchdlg \ + sfx2/source/dialog/styfitem \ + sfx2/source/dialog/styledlg \ + sfx2/source/dialog/tabdlg \ + sfx2/source/dialog/templdlg \ + sfx2/source/dialog/titledockwin \ + sfx2/source/dialog/tplcitem \ + sfx2/source/dialog/tplpitem \ + sfx2/source/dialog/versdlg \ + sfx2/source/doc/DocumentMetadataAccess \ + sfx2/source/doc/DocumentSigner \ + sfx2/source/doc/Metadatable \ + sfx2/source/doc/QuerySaveDocument \ + sfx2/source/doc/SfxDocumentMetaData \ + sfx2/source/doc/autoredactdialog \ + sfx2/source/doc/docfac \ + sfx2/source/doc/docfile \ + sfx2/source/doc/docfilt \ + sfx2/source/doc/docinf \ + sfx2/source/doc/docinsert \ + sfx2/source/doc/docmacromode \ + sfx2/source/doc/docstoragemodifylistener \ + sfx2/source/doc/doctempl \ + sfx2/source/doc/doctemplates \ + sfx2/source/doc/doctemplateslocal \ + sfx2/source/doc/exoticfileloadexception \ + sfx2/source/doc/frmdescr \ + sfx2/source/doc/graphhelp \ + sfx2/source/doc/guisaveas \ + sfx2/source/doc/iframe \ + sfx2/source/doc/new \ + sfx2/source/doc/objcont \ + sfx2/source/doc/objembed \ + sfx2/source/doc/objitem \ + sfx2/source/doc/objmisc \ + sfx2/source/doc/objserv \ + sfx2/source/doc/objstor \ + sfx2/source/doc/objxtor \ + sfx2/source/doc/oleprops \ + sfx2/source/doc/ownsubfilterservice \ + sfx2/source/doc/printhelper \ + sfx2/source/doc/docundomanager \ + sfx2/source/doc/sfxbasemodel \ + sfx2/source/doc/sfxmodelfactory \ + sfx2/source/doc/SfxRedactionHelper \ + sfx2/source/doc/signaturestate \ + sfx2/source/doc/syspath \ + sfx2/source/doc/zoomitem \ + sfx2/source/doc/templatedlg \ + sfx2/source/doc/watermarkitem \ + sfx2/source/doc/saveastemplatedlg \ + sfx2/source/explorer/nochaos \ + sfx2/source/inet/inettbc \ + sfx2/source/notebookbar/ContextVBox \ + sfx2/source/notebookbar/DropdownBox \ + sfx2/source/notebookbar/PriorityHBox \ + sfx2/source/notebookbar/PriorityMergedHBox \ + sfx2/source/notebookbar/SfxNotebookBar \ + sfx2/source/notebookbar/NotebookbarPopup \ + sfx2/source/notebookbar/NotebookbarTabControl \ + sfx2/source/notify/eventsupplier \ + sfx2/source/notify/globalevents \ + sfx2/source/notify/hintpost \ + sfx2/source/notify/openurlhint \ + sfx2/source/safemode/safemode \ + sfx2/source/sidebar/Sidebar \ + sfx2/source/sidebar/SidebarChildWindow \ + sfx2/source/sidebar/SidebarDockingWindow \ + sfx2/source/sidebar/SidebarController \ + sfx2/source/sidebar/SidebarModelUpdate \ + sfx2/source/sidebar/SidebarPanelBase \ + sfx2/source/sidebar/SidebarToolBox \ + sfx2/source/sidebar/Accessible \ + sfx2/source/sidebar/AccessibleTitleBar \ + sfx2/source/sidebar/AsynchronousCall \ + sfx2/source/sidebar/Context \ + sfx2/source/sidebar/ContextChangeBroadcaster \ + sfx2/source/sidebar/ContextList \ + sfx2/source/sidebar/ControlFactory \ + sfx2/source/sidebar/ControllerFactory \ + sfx2/source/sidebar/ControllerItem \ + sfx2/source/sidebar/Deck \ + sfx2/source/sidebar/DeckDescriptor \ + sfx2/source/sidebar/DeckLayouter \ + sfx2/source/sidebar/DeckTitleBar \ + sfx2/source/sidebar/DrawHelper \ + sfx2/source/sidebar/FocusManager \ + sfx2/source/sidebar/MenuButton \ + sfx2/source/sidebar/IContextChangeReceiver \ + sfx2/source/sidebar/ILayoutableWindow \ + sfx2/source/sidebar/Paint \ + sfx2/source/sidebar/Panel \ + sfx2/source/sidebar/PanelDescriptor \ + sfx2/source/sidebar/PanelLayout \ + sfx2/source/sidebar/PanelTitleBar \ + sfx2/source/sidebar/ResourceManager \ + sfx2/source/sidebar/TabBar \ + sfx2/source/sidebar/TabItem \ + sfx2/source/sidebar/TitleBar \ + sfx2/source/sidebar/Theme \ + sfx2/source/sidebar/Tools \ + sfx2/source/sidebar/UnoPanel \ + sfx2/source/sidebar/UnoPanels \ + sfx2/source/sidebar/UnoDeck \ + sfx2/source/sidebar/UnoDecks \ + sfx2/source/sidebar/UnoSidebar \ + sfx2/source/statbar/stbitem \ + sfx2/source/styles/StyleManager \ + sfx2/source/toolbox/tbxitem \ + sfx2/source/toolbox/weldutils \ + sfx2/source/view/classificationcontroller \ + sfx2/source/view/classificationhelper \ + sfx2/source/view/frame \ + sfx2/source/view/frame2 \ + sfx2/source/view/frmload \ + sfx2/source/view/ipclient \ + sfx2/source/view/lokcharthelper \ + sfx2/source/view/lokhelper \ + sfx2/source/view/printer \ + sfx2/source/view/sfxbasecontroller \ + sfx2/source/view/userinputinterception \ + sfx2/source/view/viewfac \ + sfx2/source/view/viewfrm \ + sfx2/source/view/viewfrm2 \ + sfx2/source/view/viewprn \ + sfx2/source/view/viewsh \ +)) + +$(eval $(call gb_SdiTarget_SdiTarget,sfx2/sdi/sfxslots,sfx2/sdi/sfx)) + +$(eval $(call gb_SdiTarget_set_include,sfx2/sdi/sfxslots,\ + $$(INCLUDE) \ + -I$(SRCDIR)/sfx2/inc \ + -I$(SRCDIR)/sfx2/sdi \ +)) + +ifeq ($(OS),$(filter WNT MACOSX,$(OS))) +$(eval $(call gb_Library_add_defs,sfx,\ + -DENABLE_QUICKSTART_APPLET \ +)) +endif + +ifeq ($(OS),MACOSX) +$(eval $(call gb_Library_add_cxxflags,sfx,\ + $(gb_OBJCXXFLAGS) \ +)) +$(eval $(call gb_Library_add_objcxxobjects,sfx,\ + sfx2/source/appl/shutdowniconaqua \ +)) +$(eval $(call gb_Library_add_libs,sfx,\ + -lobjc \ +)) +$(eval $(call gb_Library_use_system_darwin_frameworks,sfx,\ + Cocoa \ +)) +endif + +ifeq ($(OS),WNT) + +$(eval $(call gb_Library_add_exception_objects,sfx,\ + sfx2/source/appl/shutdowniconw32 \ + sfx2/source/doc/syspathw32 \ +)) + +$(eval $(call gb_Library_use_system_win32_libs,sfx,\ + advapi32 \ + gdi32 \ + ole32 \ + shell32 \ + uuid \ +)) + +endif + +# vim: set noet sw=4 ts=4: diff --git a/sfx2/Makefile b/sfx2/Makefile new file mode 100644 index 000000000..ccb1c85a0 --- /dev/null +++ b/sfx2/Makefile @@ -0,0 +1,7 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- + +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/sfx2/Module_sfx2.mk b/sfx2/Module_sfx2.mk new file mode 100644 index 000000000..8ebe54cef --- /dev/null +++ b/sfx2/Module_sfx2.mk @@ -0,0 +1,58 @@ +# -*- 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/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Module_Module,sfx2)) + +$(eval $(call gb_Module_add_targets,sfx2,\ + CustomTarget_classification \ + Library_sfx \ + Package_classification \ + Package_emoji \ + UIConfig_sfx \ +)) + +$(eval $(call gb_Module_add_l10n_targets,sfx2,\ + AllLangMoTarget_sfx2 \ +)) + +$(eval $(call gb_Module_add_check_targets,sfx2,\ + CppunitTest_sfx2_metadatable \ + CppunitTest_sfx2_misc \ + CppunitTest_sfx2_controlleritem \ + CppunitTest_sfx2_classification \ +)) + +$(eval $(call gb_Module_add_subsequentcheck_targets,sfx2,\ + JunitTest_sfx2_complex \ + JunitTest_sfx2_unoapi \ +)) + +$(eval $(call gb_Module_add_subsequentcheck_targets,sfx2,\ + PythonTest_sfx2_python \ +)) + +#todo: clean up quickstarter stuff in both libraries +#todo: move standard pool to svl + +# screenshots +$(eval $(call gb_Module_add_screenshot_targets,sfx2,\ + CppunitTest_sfx2_dialogs_test \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sfx2/Package_classification.mk b/sfx2/Package_classification.mk new file mode 100644 index 000000000..71684f4b1 --- /dev/null +++ b/sfx2/Package_classification.mk @@ -0,0 +1,22 @@ +# -*- 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,sfx2_classification,$(SRCDIR)/sfx2)) + +$(eval $(call gb_Package_add_files,sfx2_classification,$(LIBO_SHARE_FOLDER)/classification,\ + classification/example.xml \ + classification/example_ca-ES.xml \ + classification/example_fr-FR.xml \ + classification/example_hu-HU.xml \ + classification/example_nl-NL.xml \ + classification/example_pt-BR.xml \ + classification/example_sl-SI.xml \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sfx2/Package_emoji.mk b/sfx2/Package_emoji.mk new file mode 100644 index 000000000..457f0ffdc --- /dev/null +++ b/sfx2/Package_emoji.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,sfx2_emojiconfig,$(SRCDIR)/sfx2)) + +$(eval $(call gb_Package_add_files,sfx2_emojiconfig,$(LIBO_SHARE_FOLDER)/emojiconfig,\ + emojiconfig/emoji.json \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sfx2/PythonTest_sfx2_python.mk b/sfx2/PythonTest_sfx2_python.mk new file mode 100644 index 000000000..a3a80079d --- /dev/null +++ b/sfx2/PythonTest_sfx2_python.mk @@ -0,0 +1,21 @@ +# -*- 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_PythonTest_PythonTest,sfx2_python)) + +$(eval $(call gb_PythonTest_set_defs,sfx2_python,\ + TDOC="$(SRCDIR)/sfx2/qa/python/testdocuments" \ +)) + +$(eval $(call gb_PythonTest_add_modules,sfx2_python,$(SRCDIR)/sfx2/qa/python,\ + check_sidebar \ + check_sidebar_registry \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sfx2/README b/sfx2/README new file mode 100644 index 000000000..9726870a6 --- /dev/null +++ b/sfx2/README @@ -0,0 +1,28 @@ +SFX is the "old" framework, used for historical reasons. + +An attempt of documentation of this module is located in [git:sfx2/doc]. + +It contains base classes for document model, view and controller, used +by "old" applications like sw, sc, sd (while "new" applications +are based on the "new" UNO based framework in "framework"). + +The SFX framework is based on dispatching slots identified by integers +(SlotIDs) to SfxShells, and there is a dedicated IDL compiler (svidl) +involved that generates C++ slot headers from SDI files in modules' sdi/ +subdirectory. + +Documentation about SFX dispatch, SDI etc.: +https://wiki.openoffice.org/wiki/Framework/Article/Implementation_of_the_Dispatch_API_In_SFX2 + +Document load/save code is maintained in [git:sfx2/source/doc/docfile.cxx] +SfxMedium class, which handles all the twisty load and save corner cases. + +[git:sfx2/source/appl/sfxhelp.cxx] Start procedure for the online +help viewer top level window; handling of help URL creation and +dispatch. + +There are also some UNO services here that could really be implemented +anywhere, e.g. the DocumentProperties or DocumentMetadataAccess. + +Notable files: +sfx2/source/dialog/backingwindow.cxx Startcenter buttons and the corresponding event handler. diff --git a/sfx2/UIConfig_sfx.mk b/sfx2/UIConfig_sfx.mk new file mode 100644 index 000000000..5e79a8399 --- /dev/null +++ b/sfx2/UIConfig_sfx.mk @@ -0,0 +1,71 @@ +# -*- 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,sfx)) + +$(eval $(call gb_UIConfig_add_uifiles,sfx,\ + sfx2/uiconfig/ui/alienwarndialog \ + sfx2/uiconfig/ui/addtargetdialog \ + sfx2/uiconfig/ui/autoredactdialog \ + sfx2/uiconfig/ui/bookmarkdialog \ + sfx2/uiconfig/ui/bookmarkmenu \ + sfx2/uiconfig/ui/charmapcontrol \ + sfx2/uiconfig/ui/charviewmenu \ + sfx2/uiconfig/ui/checkin \ + sfx2/uiconfig/ui/classificationbox \ + sfx2/uiconfig/ui/cmisinfopage \ + sfx2/uiconfig/ui/cmisline \ + sfx2/uiconfig/ui/custominfopage \ + sfx2/uiconfig/ui/descriptioninfopage \ + sfx2/uiconfig/ui/dockingwindow \ + sfx2/uiconfig/ui/documentfontspage \ + sfx2/uiconfig/ui/documentinfopage \ + sfx2/uiconfig/ui/documentpropertiesdialog \ + sfx2/uiconfig/ui/editdocumentdialog \ + sfx2/uiconfig/ui/editdurationdialog \ + sfx2/uiconfig/ui/emojicontrol \ + sfx2/uiconfig/ui/errorfindemaildialog \ + sfx2/uiconfig/ui/floatingrecord \ + sfx2/uiconfig/ui/helpbookmarkpage \ + sfx2/uiconfig/ui/helpcontrol \ + sfx2/uiconfig/ui/helpcontentpage \ + sfx2/uiconfig/ui/helpindexpage \ + sfx2/uiconfig/ui/helpmanual \ + sfx2/uiconfig/ui/helpsearchpage \ + sfx2/uiconfig/ui/helpwindow \ + sfx2/uiconfig/ui/inputdialog \ + sfx2/uiconfig/ui/licensedialog \ + sfx2/uiconfig/ui/linefragment \ + sfx2/uiconfig/ui/linkeditdialog \ + sfx2/uiconfig/ui/loadtemplatedialog \ + sfx2/uiconfig/ui/managestylepage \ + sfx2/uiconfig/ui/newstyle \ + sfx2/uiconfig/ui/notebookbar \ + sfx2/uiconfig/ui/optprintpage \ + sfx2/uiconfig/ui/password \ + sfx2/uiconfig/ui/notebookbarpopup \ + sfx2/uiconfig/ui/printeroptionsdialog \ + sfx2/uiconfig/ui/querysavedialog \ + sfx2/uiconfig/ui/saveastemplatedlg \ + sfx2/uiconfig/ui/safemodequerydialog \ + sfx2/uiconfig/ui/searchdialog \ + sfx2/uiconfig/ui/securityinfopage \ + sfx2/uiconfig/ui/singletabdialog \ + sfx2/uiconfig/ui/startcenter \ + sfx2/uiconfig/ui/stylecontextmenu \ + sfx2/uiconfig/ui/templatedlg \ + sfx2/uiconfig/ui/templatecategorydlg \ + sfx2/uiconfig/ui/templatepanel \ + sfx2/uiconfig/ui/urlbox \ + sfx2/uiconfig/ui/versionsofdialog \ + sfx2/uiconfig/ui/versioncommentdialog \ + sfx2/uiconfig/ui/versionscmis \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/sfx2/classification/CommonTypes.xsd b/sfx2/classification/CommonTypes.xsd new file mode 100644 index 000000000..b0404bc9b --- /dev/null +++ b/sfx2/classification/CommonTypes.xsd @@ -0,0 +1,103 @@ + + + + + Specification Name: OASIS CIQ TC - CIQ V3.0 + Description: Defines the W3C schema with commonly used types in the name, address and party schemas + (Using XML Schema based standard code list/enumeration mechanism - OPTION 1 AND DEFAULT) + Produced by: OASIS Customer Information Quality Technical Committee + URL: http://www.oasis-open.org/committees/ciq + Version: 3.0 + Status: Committee Specification + Copyright: 2006-07, OASIS, http://www.oasis-open.org + Last Modified: 18 September 2007 + Last Modified by: Ram Kumar, Chair, OASIS CIQ TC + + + + + Normalized and Collapsed String + + + + + + + + A list of values to indicate the level of reliability of the data + + + + + The data was validated and is considered to be true and correct. + + + + + Indicates that at least some part of the content is known to be incorrect. + + + + + + + A list of values to indicate the status of the entity + + + + + + Date Valid from to Date Valid to + + + + Could be start date, issue date, validity start date, etc + + + + + Could be end date, expiry date, validity end date, etc + + + + + + A group of commonly used attributes for internal reuse + + + + If set to true then indicates that the value is an abbreviation or initial. If set to false then the value is definitely not an abbreviation. If omitted then it is not known if the value is an abbreviation or not. + + + + + + A group of commonly used attributes for internal reuse + + + + This attribute indicates what level of trust can be given to the parent element. Omit this attribute if the data quality is unknown. If the data quality is known, the value is "Valid, else "InValid" + + + + + Date the data quality is valid from + + + + + Date the data quality is valid to + + + + + + The language used (name of human language, e.g. en, en-US) + + + + Human Language used. e.g. "en", "en-US", "en-AUS", etc + + + + diff --git a/sfx2/classification/README b/sfx2/classification/README new file mode 100644 index 000000000..54c778ff4 --- /dev/null +++ b/sfx2/classification/README @@ -0,0 +1,7 @@ +Involved standards: + +- BAF is +- BAILS is +- xAL is +- xNL is +- xlink is \ No newline at end of file diff --git a/sfx2/classification/baf.xsd b/sfx2/classification/baf.xsd new file mode 100644 index 000000000..abf003b38 --- /dev/null +++ b/sfx2/classification/baf.xsd @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sfx2/classification/baf_loext.xsd b/sfx2/classification/baf_loext.xsd new file mode 100644 index 000000000..593eb0117 --- /dev/null +++ b/sfx2/classification/baf_loext.xsd @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/sfx2/classification/example.xml b/sfx2/classification/example.xml new file mode 100644 index 000000000..a5065e3d9 --- /dev/null +++ b/sfx2/classification/example.xml @@ -0,0 +1,89 @@ + + + + TSCP Example Policy Authority + + TSCP Example Policy + + urn:example:tscp:1 + + + + + + + UK-Cabinet + 0 + + + + + + + Document: Header + + Classification: General Business + + + + UK-Cabinet + 1 + + + + + + + Document: Header + + Classification: Confidential + + + Document: Footer + + This content is marked Confidential. Do not distribute it externally without business approval. + + + Document: Watermark + + Confidential + + + + UK-Cabinet + 2 + + + + + + + Document: Header + + Classification: Internal Only + + + Document: Footer + + This content is marked Internal Only. Do not distribute it outside of the business. + + + Document: Watermark + + Internal Only + + + + UK-Cabinet + 3 + + + + + + + + + + diff --git a/sfx2/classification/example_ca-ES.xml b/sfx2/classification/example_ca-ES.xml new file mode 100644 index 000000000..f62d6473f --- /dev/null +++ b/sfx2/classification/example_ca-ES.xml @@ -0,0 +1,71 @@ + + + Autoritat de polítiques TSCP de exemple + Política TSCP de exemple + + urn:example:tscp:1 + + + + + + UK-Cabinet + 0 + + + + + + Document: Header + Classificació: afers generals + + + + UK-Cabinet + 1 + + + + + + Document: Header + Classificació: confidencial + + + Document: Footer + Aquest contingut és de caràcter confidencial. No el distribuïu externament sense autorització. + + + Document: Watermark + Confidencial + + + + UK-Cabinet + 2 + + + + + + Document: Header + Classificació: només d’ús intern + + + Document: Footer + Aquest contingut és només d’ús intern. No el distribuïu externament. + + + Document: Watermark + Ús intern + + + + UK-Cabinet + 3 + + + + + diff --git a/sfx2/classification/example_fr-FR.xml b/sfx2/classification/example_fr-FR.xml new file mode 100644 index 000000000..4e0ab9922 --- /dev/null +++ b/sfx2/classification/example_fr-FR.xml @@ -0,0 +1,84 @@ + + + + Exemple d'autorité TSCP + + Exemple de stratégie TSCP + + urn:example:tscp:1 + + + + + + + UK-Cabinet + 0 + + + + + + + Document: Header + + Classification : professionnel + + + + UK-Cabinet + 1 + + + + + + + Document: Header + + Classification : confidentiel + + + Document: Footer + + Ce contenu est marqué confidentiel. Ne le communiquez pas à l'extérieur sans un accord de l'entreprise. + + + Document: Watermark + + Confidentiel + + + + UK-Cabinet + 2 + + + + + + + Document: Header + + Classification : exclusivement en interne + + + Document: Footer + + Ce contenu est marqué pour un usage interne exclusivement. Il ne doit pas être communiqué à l'extérieur de l'entreprise. + + + Document: Watermark + + Interne exclusivement + + + + UK-Cabinet + 3 + + + + + diff --git a/sfx2/classification/example_hu-HU.xml b/sfx2/classification/example_hu-HU.xml new file mode 100644 index 000000000..1bb6e9488 --- /dev/null +++ b/sfx2/classification/example_hu-HU.xml @@ -0,0 +1,71 @@ + + + TSCP példa irányelv-szolgáltató + TSCP példa irányelv + + urn:example:tscp:1 + + + + + + UK-Cabinet + 0 + + + + + + Document: Header + Besorolás: Általános üzleti + + + + UK-Cabinet + 1 + + + + + + Document: Header + Besorolás: bizalmas + + + Document: Footer + Ez a tartalom bizalmasként van megjelölve. Ne terjessze külső feleknek vezetői jóváhagyás nélkül. + + + Document: Watermark + Bizalmas + + + + UK-Cabinet + 2 + + + + + + Document: Header + Besorolás: csak belső + + + Document: Footer + Ez a tartalom csak belső felhasználásúként van megjelölve. Ne terjessze a szervezeten kívüli feleknek. + + + Document: Watermark + Csak belső + + + + UK-Cabinet + 3 + + + + + diff --git a/sfx2/classification/example_nl-NL.xml b/sfx2/classification/example_nl-NL.xml new file mode 100644 index 000000000..7afc17043 --- /dev/null +++ b/sfx2/classification/example_nl-NL.xml @@ -0,0 +1,71 @@ + + + Voorbeeld beleidsauthoriteit TSCP + Voorbeeld beleid TSCP + + urn:example:tscp:1 + + + + + + UK-Cabinet + 0 + + + + + + Document: Header + Classificatie: Algemeen bedrijfsvoering + + + + UK-Cabinet + 1 + + + + + + Document: Header + Classificatie: Vertrouwelijk + + + Document: Footer + De inhoud van dit document is vertrouwelijk. Verspreid het uitsluitend met de vereiste toestemming. + + + Document: Watermark + Vertrouwelijk + + + + UK-Cabinet + 2 + + + + + + Document: Header + Classificatie: Intern + + + Document: Footer + De inhoud van dit document is uitsluitend voor intern gebruik. Verspreid het niet buiten de organisatie. + + + Document: Watermark + Intern + + + + UK-Cabinet + 3 + + + + + diff --git a/sfx2/classification/example_pt-BR.xml b/sfx2/classification/example_pt-BR.xml new file mode 100644 index 000000000..25280f08a --- /dev/null +++ b/sfx2/classification/example_pt-BR.xml @@ -0,0 +1,71 @@ + + + Exemplo de autoridade de políticas TSCP + Exemplo de política TSCP + + urn:example:tscp:1 + + + + + + UK-Cabinet + 0 + + + + + + Document: Header + Classificação: Corporativo + + + + UK-Cabinet + 1 + + + + + + Document: Header + Classificação: Confidencial + + + Document: Footer + A informação deste documento é confidencial. Não distribuir externamente sem prévia autorização. + + + Document: Watermark + Confidencial + + + + UK-Cabinet + 2 + + + + + + Document: Header + Classificação: Reservado + + + Document: Footer + A informação deste documento é reservada. Não distribuir externamente. + + + Document: Watermark + Reservado + + + + UK-Cabinet + 3 + + + + + diff --git a/sfx2/classification/example_sl-SI.xml b/sfx2/classification/example_sl-SI.xml new file mode 100644 index 000000000..99e04a7aa --- /dev/null +++ b/sfx2/classification/example_sl-SI.xml @@ -0,0 +1,76 @@ + + + Avtoriteta primera politike TSCP + Primer politike TSCP + + urn:example:tscp:1 + + + + + + UK-Cabinet + 0 + + + + + + Document: Header + Stopnja zaupnosti: splošno poslovanje + + + + UK-Cabinet + 1 + + + + + + Document: Header + Stopnja zaupnosti: zaupno + + + Document: Footer + Ta vsebina ima oznako zaupno. Ne razširjajte je zunaj brez poslovne odobritve. + + + Document: Watermark + Zaupno + + + + UK-Cabinet + 2 + + + + + + Document: Header + Stopnja zaupnosti: interno + + + Document: Footer + Ta vsebina ima oznako interno. Ne razširjajte je izven podjetja. + + + Document: Watermark + Interno + + + + UK-Cabinet + 3 + + + + + + + + + + diff --git a/sfx2/classification/xAL-types.xsd b/sfx2/classification/xAL-types.xsd new file mode 100644 index 000000000..052299007 --- /dev/null +++ b/sfx2/classification/xAL-types.xsd @@ -0,0 +1,510 @@ + + + + + Specification Name: OASIS CIQ TC - extensible AddressLanguage Types (xAL-types) + Description: Defines the W3C schema that provides enumeration lists to support xNL v3.0 + (Using XML Schema based standard code list/enumeration mechanism - OPTION 1 AND DEFAULT) + Produced by: OASIS Customer Information Quality Technical Committee + URL: http://www.oasis-open.org/committees/ciq + Version: 3.0 + Status: Committee Specification + Copyright: 2006-07, OASIS, http://www.oasis-open.org + Last Modified: 18 September 2007 + Last Modified by: Ram Kumar, Chair, OASIS CIQ TC + + NOTE: This is the schema that users can customise the enumeration lists to meet their + exchange requirements. The enumeration values provided are ONLY SAMPLES and + is not complete. It is up to the application to decide what the values should be. To achieve + interoperability between applications using this specification, it is recommended that an + SLA/agreement is in place as to what the enumeration values will be used in this file + + + + + A list of types of addresses + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A list of types of address identifiers + + + + + + A list of types of address line, e.g. street details, locality details + + + + + + A list of types of usage of the address + + + + + + + + + + + + + + + A list of administrative area types + + + + + Only name of the administrative area without its type, e.g. NSW, CA, Quebec + + + + + The type of the area, e.g. state, district, province, etc. + + + + + + + + + A list of administrative area name element types + + + + + Name of the administrative area + + + + + + Reference location information in support of the administrative area. e.g. Territory of France + + + + + Other supporting information + + + + + + + A list of codes for name of administrative area + + + + + + A list of country name element types + + + + + Name of the country e.g. AUSTRALIA + + + + + Although a Country, could be classified as a territory of a country. For example, "NOUVELLE CALEDONIE" is a territory of "FRANCE". + + + + + + + A list of codes for name of country + + + + + + A list of codes for datum + + + + + + A list of codes for mode of delivery of address + + + + + + A list of directions for geo-coordinates + + + + + + + + + + + A list of name types for commonly used Number type + + + + + Applicable to mail box office names such as PO BOX, GPO BOX, MAIL BAG NO., etc. + + + + + Indicates that the element contains the lower value of a range, e.g. 25 in 25-37 + + + + + Indicates that the value is a range, e.g. 25-37 + + + + + Indicates that the element contains the top value of a range, e.g. 25 in 25-37 + + + + + Indicates that the element contains some value that is important, but not exactly the number itself. E.g. PoBox can be a prefix in PoBox 2020, street no. A-15, where A is the prefix and 15 is the number + + + + + Indicates that the element contains some value that is important, but not exactly the number itself. E.g. 'bis' in '45 bis' + + + + + Indicates that the value is number, e.g. 2020 in PoBox 2020. The actual value can be alpha-numeric. + + + + + Indicates that the value is a separator that is expected to be preserved. Examples are / - #, as in 15-A where "-" is the separator + + + + + Indicates that the value is an extension number of some identifier, e.g. 01 in Private Bag 2330-01, where the main number of the private bag is 2330, 12345-1223 in post code where 1223 is the extension + + + + + + + A list of locality name element types such as name of locality, reference data in support of locality + + + + + Name of the locality + + + + + + Any reference locality data in support of the locality. e.g. Next town north of Town A, via-town name + + + + + Other supporting information + + + + + + + A list of codes for name of locality + + + + + + A list of locality name types such as Municipality, Village, Area, etc + + + + + + + + + + + + + + + A list of meridian codes + + + + + + A list of types of postal delivery offices + + + + + + A list of postal delivery point types + + + + + + + + + + + + + A list of codes for projection + + + + + + A list of name types for premises + + + + + Names of Premises such as airport, hospital, university, military base, etc. Can also be the name of the building or house or apartment + + + + + Where in the building/landmark the premises is located, e.g. lobby, ground floor, penthouse, or where in a larger complex (e.g. airport) the address is located. + + + + + Free text description that is required to logically connect the 2 premises + + + + + Roads and streets within boundaries of larger complexes/premises such as hospitals, airports, etc. + + + + + Free text description of some other location and how this premises relates to it, e.g. 300m from water station, new the police station, etc. + + + + + additional supporting information + + + + + + + A list of premises type + + + + + + + + + + + + + + + + + + + + A list of rural delivery types such as road, air, water + + + + + + A list of sub administrative area name element types + + + + + Name of the sub administrative area + + + + + + Reference location information in support of the sub administrative area + + + + + Other supporting information + + + + + + + A list of codes for name of sub administrative area + + + + + + A list of sub administrative area name types + + + + + + + + + + + A list of sub locality name element types + + + + + + + + Other supporting information + + + + + + + A list of codes for names of sub locality + + + + + + A list of sub locality types + + + + + + + + + A list of sub premises types + + + + + + + + + + + + + A list of name element types for thoroughfare + + + + + Just the name part, such as Baker in Baker Street. + + + + + North Archer Street, where "North" is PreDirection + + + + + Archer Street North, where "North" is PostDirection + + + + + This value indicates that the element contains the street name and street number. E.g. 39 Baker Street. Use this when you do not want to break the thoroughfare into atomic types + + + + + Baker Street, where Baker is Name and Street is Type + + + + + 21 Archer Street (Full thoroughfare details) + + + + + Full details of a thoroughfare in a single line (unstructured) +e.g. 39 Baker Street North + + + + + When more than one street name is required to identify the location this type can be used to connect them with values such as CORNER OF or VIA. + + + + + Free text description of some other location and how this thoroughfare relates to it, e.g. 300m from water station, new the police station, etc. + + + + + Additional description like intersection, cross streets, etc + + + + + + + A list of types for thoroughfare (e.g. STREET, ROAD, CRT) + + + + diff --git a/sfx2/classification/xAL.xsd b/sfx2/classification/xAL.xsd new file mode 100644 index 000000000..13babc615 --- /dev/null +++ b/sfx2/classification/xAL.xsd @@ -0,0 +1,671 @@ + + + + + Specification Name: OASIS CIQ TC - extensible Address Language (xAL) + Description: Defines the W3C schema for representing addresses + (Using XML Schema based standard code list/enumeration mechanism - OPTION 1 AND DEFAULT) + Produced by: OASIS Customer Information Quality Technical Committee + URL: http://www.oasis-open.org/committees/ciq + Version: 3.0 + Status: Public Review Draft 03 ERRATA + Copyright: 2007-08, OASIS, http://www.oasis-open.org + Last Modified: 08 April 2008 + Last Modified by: Ram Kumar, Chair, OASIS CIQ TC + NOTE: Do not modify this schema as it will break specifications compatibility + + + + + + + + Top level element for address with geocode details + + + + + Complex type that defines the structure of an address with geocode details for reuse + + + + + Container for free text address elements where address elements are not parsed + + + + + + Free format address representation. An address can have more than one line. The order of the AddressLine elements must be preserved. + + + + + + + What does the address line describe? e.g. Street details, suburb details, post code details, whole address, etc + + + + + + + + + + + + + + + + Country details + + + + + + + + + + Details of the top-level area division in the country, such as state, district, province, island, region, etc. Note that some countries do not have this + + + + + + Data associated with the Administrative Area. e.g. Full name of administrative area or part of it. eg. MI in USA, NSW in Australia, reference location to the administrative area + + + + + + + + semantics of data associated with name + + + + + Name of administrative area represented as a code. e.g. "COL" for COLORADO + + + + + Type of code used to represent name as a code + + + + + + + + + + The next level down division of the area. E.g. state / county, province / reservation. Note that not all countries have a subadministrative area + + + + + + Data associated with the SubAdministrative Area. e.g. Full name of sub administrative area or part of it. + + + + + + + + semantics of data associated with name + + + + + Name of administrative area represented as a code. e.g. "COL" for COLORADO + + + + + Type of code used to represent name as a code + + + + + + + + + + + Type of sub administrative area + + + + + + + + + + Type of administrative area. e.g. state, city, town, etc + + + + + + + + + Details of Locality which is a named densely populated area (a place) such as town, village, suburb, etc. A locality composes of many individual addresses. Many localities exist in an administrative area or a sub administrative area. A locality can also have sub localities. For example, a municipality locality can have many villages associated with it which are sub localities. Example: Tamil Nadu State, Erode District, Bhavani Taluk, Paruvachi Village is a valid address in India. Tamil Nadu is the Administrative Area, Erode is the sub admin area, Bhavani is the locality, and Paruvachi is the sub locality + + + + + + Data associated with the locality. e.g. Full name of the locality or part of it, reference location to the locality + + + + + + + + semantics of data associated with name + + + + + name of locality represented as a code + + + + + type of code used to represent name as a code + + + + + + + + + + A locality that is smaller and is contained within the boundaries of its parent locality. Note that not all localities have sub locality. For example, many areas within a locality where each area is a sub locality + + + + + + Data associated with the sub locality. e.g. Full name of the locality or part of it, reference location to the locality + + + + + + + + semantics of data associated with name + + + + + name of locality represented as a code + + + + + type of code used to represent name as a code + + + + + + + + + + + Type of sub locality + + + + + + + + + + Type of locality. e.g. suburb, area, zone, village, etc + + + + + + + + + Details of the Access route along which buildings/lot/land are located, such as street, road, channel, crescent, avenue, etc. This also includes canals/banks on which houses/boat houses are located where people live + + + + + + + + Another thoroughfare that is required to uniquely identify the location, such as an access route, intersection, corner, adjacent, boundary, etc + + + + + + + + + + + + + + + Details of the Premises (could be building(s), site, location, property, premise, place) which is a landmark place which has a main address such as large mail user (e.g. Airport, Hospital, University) or could be a building (e.g. apartment, house) or a building or complex of buildings (e.g. an apartment complex or shopping centre) or even a vacant land (e.g. LOT). Premises can have many sub-addresses such as apartments in a building having its own addresses or buildings within an airport having its own addresses including its own thoroughfares + + + + + + + + Examples of sub-premises are apartments and suites in buildings, shops in malls, etc. or sub-addresses in a land mark place such as airports, military bases, hospitals, etc. Some countries have blocks within blocks + + + + + + + + Type of code used for sub premises type attribute + + + + + + + + + + + Type of code use for Premises Type attribute + + + + + + + + + A container for a single free text or structured postcode. Note that not all countries have post codes + + + + + + The postcode is formatted according to country-specific rules. Example: SW3 0A8-1A, 600074, 2067. This element can also be used to define the semantics of what each code in the post code means + + + + + + + + + + A container for postal-specific delivery identifier for remote communities. Note that not all countries have RuralDelivery + + + + + + Free text or structured description of rural delivery route. e.g. RD 6, + + + + + + Type of rural delivery. For some addresses, delivery to rural areas happens via water, air or road + + + + + + + + + Final mail delivery point where the mail is dropped off for recipients to pick them up directly. E.g. POBox, Private Bag, pigeon hole, free mail numbers, etc. + + + + + + Free text or structured description of a postal delivery point. + + + + + + + + + + + A delivery point/installation where all mails are delivered and the post man/delivery service picks up the mails and delivers it to the recipients through a delivery mode. Examples are a rural post office where post is delivered, a post office containing post office boxes/personal mail boxes. Note that not all countries have PostOffice. Can be used to represent overseas military addresses also along with PostalDeliveryPoint element + + + + + + Name or number of the post office in free text or structured form. + + + + + + Indicates the type of postal delivery office from where the mail will be distributed to the final delivery point by a delivery mode. Example: Post Office, Mail Collection Centre, Letter Carrier Depot, Station, etc. + + + + + + + + + GeoRSS GML from Open Geospatial Consortium (OGC – www.opengeospatial.net) is a formal GML Application Profile, and supports a greater range of features than Simple, notably coordinate reference systems other than WGS84 latitude/longitude. It is designed for use with Atom 1.0, RSS 2.0 and RSS 1.0, although it can be used just as easily in non-RSS XML encodings. + + + + + + Could be GeoRSS Simple or GeoRSS GML versions. Refer to http://georss.org/ and http://georss.org/gml for further documentation + + + + + + + + + Simple Geo-coordinates of the address/location + + + + + + Latitude details + + + + + Measure of the latitude in degrees + + + + + Measure of the latitude in minutes + + + + + Measure of the latitude in seconds + + + + + The direction of latitude measurement offset from the equator + + + + + + + + Longitude details + + + + + Measure of the longitude in degrees + + + + + Measure of the longitude in minutes + + + + + Measure of the longitude in seconds + + + + + The direction of longitude measurement offset from the equator + + + + + + + + + The collection of the coordinate numeric values for latitude amd longitude depends on the agreed position of the meridian. Declaration of the meridian is necessary as it cannot be assumed in the data + + + + + Type of code used. e.g. EPSG Code + + + + + The collection of the coordinate numeric values depends on the agreed datum within which the measurement was taken. Declaration of the datum is necessary as it cannot be assumed in the data + + + + + Type of code used. e.g. EPSG Code, WGS-84 + + + + + Coordinates have limited utility and application depending on the projection required for visualisation in a map. Declaration of projection is necessary as it cannot be assumed in data + + + + + Type of code used. e.g. EPSG Code + + + + + + + + + + Defines the type of address. An address type can be" Primary Address, Secondary Address, Rural Address, Military Address, etc. + + + + + A unique address identifier such as postal delivery identifier assigned to the address by local postal authority, e.g. DPID in Australia. + + + + + Type of address ID used. e.g. DPID, etc + + + + + A globally unique identifier assigned to the address + + + + + The purpose the address is used for. E.g. Postal, residential, business, exchange, update, create, delete, etc + + + + + Mode of delivery of address. For example: rural route, normal delivery, post office box, etc. + + + + + Status of the entity. e.g. Old, Current, Inactive, Active, etc + + + + + + A primary key to reference Address. + + + + + A foreign key to reference attribute Key of Address. + + + + + + + + + + + + Complex type that defines the name of the country and is reused in other CIQ specs + + + + + Data associated with the name of the country in whatever form available, e.g. full, abbreviation, common use, code of the country, etc. + + + + + + + + Semantics of data associated with name. + + + + + Name of the country represented as a code + + + + + Type of code used to represent name of country, e.g. iso-3166 + + + + + + + + + + + + + Complex type for internal reuse + + + + + + Indicates which part of number or identifier this element contains. Some "numbers" are as simple as 42 and some "numbers" are more like complex alphanumeric identifiers as Postcodes in UK or Canada, e.g. M2H 2S5. It may be necessary to separate the "number" into sub-elements and indicate what type of information each of them contains. + + + + + + + + + + Complex type for internal reuse + + + + + Data associated with the name of the Premises. e.g. Full name of premises or part of the name. E.g. Westfield shopping center, reference data to support the premises location, street in the premises + + + + + + + + Describes the type / part of name this element contains. + + + + + + + + + + Data associated with the number of the premises. E.g.House 15, number range, number suffix + + + + + + + + Complex type for internal reuse + + + + + Data associated with the thoroughfare details. e.g. Full thoroughfare name or part of it, type of thoroughfare, old name, new name, reference data in support of the thoroughfare + + + + + + + + Describes the type / part of name this element contains. + + + + + + + + + + Data associated with the number of the thoroughfare. E.g. 39 in 39 Baker Street, street range, street suffix + + + + + + Type of thoroughfare. eg. primary road, secondary road, road branch (e.g. Lane 14), road sub branch (e.g. Alley 21), adjourning street, cross street, closest street, etc + + + + + Type of code use for thoroughfare + + + + + + diff --git a/sfx2/classification/xNL-types.xsd b/sfx2/classification/xNL-types.xsd new file mode 100644 index 000000000..dc8769ae3 --- /dev/null +++ b/sfx2/classification/xNL-types.xsd @@ -0,0 +1,221 @@ + + + + + Specification Name: OASIS CIQ TC - extensible Name Language Types (xNL-types) + Description: Defines the W3C schema that provides enumeration lists to support xNL v3.0 + (Using XML Schema based standard code list/enumeration mechanism - OPTION 1 AND DEFAULT) + Produced by: OASIS Customer Information Quality Technical Committee + URL: http://www.oasis-open.org/committees/ciq + Version: 3.0 + Status: Committee Specification + Copyright: 2006-07, OASIS, http://www.oasis-open.org + Last Modified: 18 September 2007 + Last Modified by: Ram Kumar, Chair, OASIS CIQ TC + + NOTE: This is the schema that users can customise the enumeration lists to meet their + exchange requirements. The enumeration values provided are ONLY SAMPLES and + is not complete. It is up to the application to decide what the values should be. To achieve + interoperability between applications using this specification, it is recommended that an + SLA/agreement is in place as to what the enumeration values will be used in this file + + + + + A list of possible values for joint name connector + + + + + + A list of possible values for types of name lines + + + + + + A list of all types of Party Name IDs + + + + + + A list of usage types of party name + + + + + + A list of person name element types, e.g. First Name, Last Name, Title, etc. + + + + + His Excellency, Honorable, etc. + + + + + A title signifies some sort of status, such as Mr, Miss, Ms (marriage status), or education such as Professor, PhD, Dr, etc. + + + + + The most important name element by which this particular individual is identified in the group. E.g. John, Sam, Brian for Anglo-Saxon cultures. + + + + + Name elements related to additional identification of the individual, such as names are parents or places. + + + + + Name element that identifies the group the individual belongs to and is identified by, such as Last Name, Surname, Family Name, etc. + + + + + Any other additional names that are not directly used to identify or call the individual, such as names of ancestors, saints, etc. + + + + + A simple nick name that is commonly used as part of the name. E.g. a fancy kick-boxer can be commonly known as Bill "Storm" Bababoons, where "Storm" is obviously an alias. + + + + + Junior, Senior, The Second, IV, etc. + + + + + + + + A list of usage types of person name + + + + + + A list of all types of person name IDs + + + + + + A list of all types of organisation name IDs + + + + + + A list of organisation name element types, e.g. Name, property type, liability type, etc. + + + + + "Sakthisoft" in "Sakthisoft Pty. Ltd". "Pty.Ltd" is the legal entity for the organisation name "Sakthisoft" + + + + + "Pty. Ltd" in Sakthisoft Pty.Ltd, where "Sakthisoft" is the name of the organisation. + +""Inc" in ABC Inc, where "ABC" is organisation name + + + + + Full Name of the organisation. e.g. Sakthisoft Pty. Ltd + + + + + + + A list of usage types for organisation name + + + + + + A list of common types for person names + + + + + + + + Name of an individual before marriage. + + + + + Former name of the person + + + + + Name that is commonly used by others, e.g. a simplified form of the official name. + + + + + A name given to an individual at birth, but later changed (common in some cultures) + + + + + Indicates that the party prefers to be called by this name + + + + + An official name of the person, e.g. as in the passport. incorporation certificate, etc. + + + + + + + + + + A list of common types for organisation names + + + + + + Former name of the organisation + + + + + + + + + unknown + + + + + + + A list of common types for subdivisions + + + + + + + + + + + diff --git a/sfx2/classification/xNL.xsd b/sfx2/classification/xNL.xsd new file mode 100644 index 000000000..d82c6ab7b --- /dev/null +++ b/sfx2/classification/xNL.xsd @@ -0,0 +1,283 @@ + + + + + Specification Name: OASIS CIQ TC - extensible Name Language (xNL) + Description: Defines the W3C schema for representing party names (Person or Organisation) + (Using XML Schema based standard code list/enumeration mechanism - OPTION 1 AND DEFAULT) + Produced by: OASIS Customer Information Quality Technical Committee + URL: http://www.oasis-open.org/committees/ciq + Version: 3.0 + Status: Committee Specification + Copyright: 2006-07, OASIS, http://www.oasis-open.org + Last Modified: 18 September 2007 + Last Modified by: Ram Kumar, Chair, OASIS CIQ TC + + NOTE: Do not modify this schema as it will break specifications compatibility + + + + + + + + Reference to another Person Name or Organisation Name with primary and foreign key reinforcement. + + + + A primary key to reference Party Name. + + + + + A foreign key to reference attribute Key of Party Name. + + + + + + Reusable complex type for a party. A party is a person or an organisation + + + + + + Container for person name details. Same person with many types (e.g. alias, pet name, nick name) of names can be used by this container. + + + + + + + + + + A container for organisation name details. Same organisation with many types of names can be used by this container + + + + + + + + + + + A unique identifier of a party + + + + + Type of Party Name ID + + + + + Globally unique identifier + + + + + Type of use of this data. e.g. data exchange, contact, update, create + + + + + Status of the entity. e.g. Old, Current, Inactive, Active, etc + + + + + The connector used to join more than one person name. Example: Mr Hunt AND Mrs Clark, where AND is the JointNameConnector. The flow is from the preceding to the following. If there is more than 2 names then all names are connected using this connector in the natural order. + + + + + + + + + + + + + + Reusable complex type + + + + + Name or part of a name. + + + + + + + Clarifies the meaning of the element.Could be first name, middle name, etc. that is defined in the List list. Omit this attribute if the type of the name element is not known. + + + + + + + + + + + + Enumerated list of type of name. example: Alias, Nick Name, former name, known as, etc + + + + + A unique identifier of a person + + + + + Type of identifier + + + + + Globally unique identifier + + + + + Usage of a person name. How is it used and for what purpose. Allows user which name in a set of names to select for a given purpose. +e.g. used for legal purposes + + + + + Status of the entity. e.g. Old, Current, Inactive, Active, etc + + + + + + + + + + + + + + Reusable complex type + + + + + Name of the organisation. E.g. ACME Inc. + + + + + + + Clarifies the meaning of the element. Example: name, type . Omit this attribute if the type of the name element is not known. + + + + + + + + + + + Name of a subdivision of an organisation (e.g. department) + + + + + + + Type of sub division. e.g. department, warehouse, branch + + + + + + + + + + + + Enumerated list of common types of aliases or name types. + + + + + A unique identifier of an organisation + + + + + Type of identifier + + + + + Globally unique identifier + + + + + Usage of organisation name. How is it used and for what purpose. Allows user which name in a set of names to select for a given purpose. +e.g. used for legal purposes + + + + + Status of the entity. e.g. Old, Current, Inactive, Active, etc + + + + + + + + + + + + + + Define name as a free format text. Use this when the type of the entity (person or organisation) is unknown, or is not broken down into individual elements (e.g. unstructured, unparsed) or is beyond the provided types. The name represented may be formatted in the right order or may not be as it is not parsed/broken into atomic fields + + + + + + + Type define what this free format name line could mean. For example, the Type could be "Unknown" + + + + + + + + + + + + Container for defining a name of a Person, an Organisation or combination of the above as a joint name. + + + + + Person Name + + + + + Organisation Name + + + diff --git a/sfx2/classification/xlink-2003-12-31.xsd b/sfx2/classification/xlink-2003-12-31.xsd new file mode 100644 index 000000000..bfe7a792e --- /dev/null +++ b/sfx2/classification/xlink-2003-12-31.xsd @@ -0,0 +1,89 @@ + + + + + + XLink attribute specification + + + + + + + Enumeration of values for the type attribute + + + + + + + + + + + + + + + + + A URI with a minimum length of 1 character. + + + + + + + + + + + + A URI with a minimum length of 1 character. + + + + + + + + + + + + + Enumeration of values for the show attribute + + + + + + + + + + + + + + + + Enumeration of values for the actuate attribute + + + + + + + + + + + + + + + diff --git a/sfx2/doc/sfx2doc.html b/sfx2/doc/sfx2doc.html new file mode 100644 index 000000000..2d7964360 --- /dev/null +++ b/sfx2/doc/sfx2doc.html @@ -0,0 +1,77 @@ + + + +

Signal processing in the sfx2 Interface. +State of 5.5.2013

+related modules are: svidl (idl compiler), framework (command processing routines), rsc (resource compiler, see below), vcl (command processing routines)
+Here is a chart how the "slot-model" of the command processing framework works. +
+Menu commands and Key accelerators are stored +asynchronously into a UNO command stack and later executed +sequentially.
+

+

+



+ +Changing the system: In Order to add a function to a shell, +Add an entry to the .sdi file corresponding to that SfxShell
+Example: +
+

SID_PASTE  [ ExecMethod = ExecDrawFunc; StateMethod = GetDrawFuncState; Export = FALSE; ]

+The "state" method is the method called to checked whether that command is active now. The "exec" method is called when the command should be processed by the shell. Both functions obtain a SfxRequest Object as a parameter, declared in ./include/sfx2/request.hxx.
+Each Application Window has ONE Dispatcher. +This registers all SfxShells (or rather their +subclasses) which can get commands from the user AT THE MOMENT. +These shells are created when the edit mode they +are part of is first used, but not discarded until the window closes. +./sfx2/source/control/dispatch.cxx: +void SfxDispatcher::Pop receives Pushes and Pops +of the shell to/from the stack. +The real Pushing/Popping, however, is done during +SfxDispatcher::FlushImpl +Main dispatching routine In +./sfx2/source/control/unoctitm.cxx +SfxDispatchController_Impl::dispatch. +
+SfxDispatchController::_FindServer +gets the SfxInterfaces of the shells. They are defined by macro calls +to SFX_IMPL_INTERFACE, defined in include/sfx2/shell.hxx . + +Upon GetInterface, they yield their pInterface, +which, upon GetSlot, returns a SfxSlot of that Shell +For that command, which is then Executed with +Dispatcher::Execute. +If the program is set into another mode, for +example by clicking a hovering object in writer +after Text editing, all shells are removed from +the dispatcher and new shells are pushed +to match the current mode. +
+ How to build menus
+In order to introduce a menu command, the uno command must be linked to a slot name.
+This is done in different sdi files, such as sfx2/sdi/sfx.sdi. +There, you define the slot:
+Structure: + +
+
+SfxVoidItem uno_name_the_part_after_colon SID_COMMAND_NAME
+()                                                        
+[                                                         
+  /* initialization of variables is coming here */        
+]                                                         
+
+ +In ./include/sfx2/sfxsids.hrc, the defines of the slot names and their numbers are entered. The numbers are just needed because definitions cannot be enums, and for compatibility.
+ +In ./officecfg/registry/data/org/openoffice/Office/UI, +there are .xcu ended xml files that define the single menu items. +They contain the US- language name and the .uno: command.
+ + +

+The resource compiler, which creates files some GetState methods refer to, is in the ./rsc directory. It is a separate executable, invoked at compile time.
+ +

+ + diff --git a/sfx2/doc/sfx2doc0001.svg b/sfx2/doc/sfx2doc0001.svg new file mode 100644 index 000000000..070f7568f --- /dev/null +++ b/sfx2/doc/sfx2doc0001.svg @@ -0,0 +1,99 @@ + + + + + + SfxView + Subclass + + + + Missing + + + + Ability to process + SfxSlot + + + + + + + "SID_PASTE" + + + + "SID_CUT" + + + + + + + + "SID_PASTE" + + + + + + + "SID_FLOAT" + + + + + "SID_PASTE" + + + + "SID_CUT" + + + + + "SID_VOMIT" + + + + "SID_FLOAT" + + + + SID_PASTE + + + + SID_CUT + + + + SID_NEY + + + + SID_VOMIT + + + + last pushed + =lower nSlot + last pushed slots + go first + + + dispatcher's Shell stack + (a Stack of pointers) + Declared in dispatch.cxx + As SfxShellStack_Impl + Command ignored + + Empty: no entry in + sdi file corresponding + to that subclass + + + + diff --git a/sfx2/emojiconfig/emoji.json b/sfx2/emojiconfig/emoji.json new file mode 100644 index 000000000..4b2a99746 --- /dev/null +++ b/sfx2/emojiconfig/emoji.json @@ -0,0 +1,26822 @@ +{ + "100": { + "unicode": "1f4af", + "unicode_alternates": "", + "name": "hundred points symbol", + "shortname": ":100:", + "category": "symbols", + "emoji_order": "856", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "symbol", + "wow", + "wow", + "win", + "win", + "perfect", + "perfect", + "parties", + "parties" + ] + }, + "1234": { + "unicode": "1f522", + "unicode_alternates": "", + "name": "input symbol for numbers", + "shortname": ":1234:", + "category": "symbols", + "emoji_order": "913", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "symbol" + ] + }, + "grinning": { + "unicode": "1f600", + "unicode_alternates": "", + "name": "grinning face", + "shortname": ":grinning:", + "category": "people", + "emoji_order": "1", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "happy", + "smiley", + "emotion", + "emotion" + ] + }, + "grimacing": { + "unicode": "1f62c", + "unicode_alternates": "", + "name": "grimacing face", + "shortname": ":grimacing:", + "category": "people", + "emoji_order": "2", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "silly", + "smiley", + "emotion", + "emotion", + "selfie", + "selfie" + ] + }, + "grin": { + "unicode": "1f601", + "unicode_alternates": "", + "name": "grinning face with smiling eyes", + "shortname": ":grin:", + "category": "people", + "emoji_order": "3", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "happy", + "silly", + "smiley", + "emotion", + "emotion", + "good", + "good", + "selfie", + "selfie" + ] + }, + "joy": { + "unicode": "1f602", + "unicode_alternates": "", + "name": "face with tears of joy", + "shortname": ":joy:", + "category": "people", + "emoji_order": "4", + "aliases": [], + "aliases_ascii": [ + ":')", + ":'-)" + ], + "keywords": [ + "happy", + "silly", + "smiley", + "cry", + "laugh", + "laugh", + "emotion", + "emotion", + "sarcastic", + "sarcastic" + ] + }, + "smiley": { + "unicode": "1f603", + "unicode_alternates": "", + "name": "smiling face with open mouth", + "shortname": ":smiley:", + "category": "people", + "emoji_order": "5", + "aliases": [], + "aliases_ascii": [ + ":D", + ":-D", + "=D" + ], + "keywords": [ + "happy", + "smiley", + "emotion", + "emotion", + "good", + "good" + ] + }, + "smile": { + "unicode": "1f604", + "unicode_alternates": "", + "name": "smiling face with open mouth and smiling eyes", + "shortname": ":smile:", + "category": "people", + "emoji_order": "6", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "happy", + "smiley", + "emotion", + "emotion" + ] + }, + "sweat_smile": { + "unicode": "1f605", + "unicode_alternates": "", + "name": "smiling face with open mouth and cold sweat", + "shortname": ":sweat_smile:", + "category": "people", + "emoji_order": "7", + "aliases": [], + "aliases_ascii": [ + "':)", + "':-)", + "'=)", + "':D", + "':-D", + "'=D" + ], + "keywords": [ + "smiley", + "workout", + "sweat", + "emotion", + "emotion" + ] + }, + "laughing": { + "unicode": "1f606", + "unicode_alternates": "", + "name": "smiling face with open mouth and tightly-closed eyes", + "shortname": ":laughing:", + "category": "people", + "emoji_order": "8", + "aliases": [ + ":satisfied:" + ], + "aliases_ascii": [ + ">:)", + ">;)", + ">:-)", + ">=)" + ], + "keywords": [ + "happy", + "smiley", + "laugh", + "laugh", + "emotion", + "emotion" + ] + }, + "innocent": { + "unicode": "1f607", + "unicode_alternates": "", + "name": "smiling face with halo", + "shortname": ":innocent:", + "category": "people", + "emoji_order": "9", + "aliases": [], + "aliases_ascii": [ + "O:-)", + "0:-3", + "0:3", + "0:-)", + "0:)", + "0;^)", + "O:)", + "O;-)", + "O=)", + "0;-)", + "O:-3", + "O:3" + ], + "keywords": [ + "smiley", + "emotion", + "emotion" + ] + }, + "wink": { + "unicode": "1f609", + "unicode_alternates": "", + "name": "winking face", + "shortname": ":wink:", + "category": "people", + "emoji_order": "10", + "aliases": [], + "aliases_ascii": [ + ";)", + ";-)", + "*-)", + "*)", + ";-]", + ";]", + ";D", + ";^)" + ], + "keywords": [ + "silly", + "smiley", + "emotion", + "emotion" + ] + }, + "blush": { + "unicode": "1f60a", + "unicode_alternates": "", + "name": "smiling face with smiling eyes", + "shortname": ":blush:", + "category": "people", + "emoji_order": "11", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "happy", + "smiley", + "emotion", + "emotion", + "good", + "good", + "beautiful", + "beautiful" + ] + }, + "slight_smile": { + "unicode": "1f642", + "unicode_alternates": "", + "name": "slightly smiling face", + "shortname": ":slight_smile:", + "category": "people", + "emoji_order": "12", + "aliases": [ + ":slightly_smiling_face:" + ], + "aliases_ascii": [ + ":)", + ":-)", + "=]", + "=)", + ":]" + ], + "keywords": [ + "happy", + "smiley" + ] + }, + "upside_down": { + "unicode": "1f643", + "unicode_alternates": "", + "name": "upside-down face", + "shortname": ":upside_down:", + "category": "people", + "emoji_order": "13", + "aliases": [ + ":upside_down_face:" + ], + "aliases_ascii": [], + "keywords": [ + "silly", + "smiley", + "sarcastic", + "sarcastic" + ] + }, + "relaxed": { + "unicode": "263a", + "unicode_alternates": "263a-fe0f", + "name": "white smiling face", + "shortname": ":relaxed:", + "category": "people", + "emoji_order": "14", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "happy", + "smiley" + ] + }, + "yum": { + "unicode": "1f60b", + "unicode_alternates": "", + "name": "face savouring delicious food", + "shortname": ":yum:", + "category": "people", + "emoji_order": "15", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "happy", + "silly", + "smiley", + "emotion", + "emotion", + "sarcastic", + "sarcastic", + "good", + "good" + ] + }, + "relieved": { + "unicode": "1f60c", + "unicode_alternates": "", + "name": "relieved face", + "shortname": ":relieved:", + "category": "people", + "emoji_order": "16", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smiley", + "emotion", + "emotion" + ] + }, + "heart_eyes": { + "unicode": "1f60d", + "unicode_alternates": "", + "name": "smiling face with heart-shaped eyes", + "shortname": ":heart_eyes:", + "category": "people", + "emoji_order": "17", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "happy", + "smiley", + "love", + "sex", + "heart eyes", + "emotion", + "emotion", + "beautiful", + "beautiful" + ] + }, + "kissing_heart": { + "unicode": "1f618", + "unicode_alternates": "", + "name": "face throwing a kiss", + "shortname": ":kissing_heart:", + "category": "people", + "emoji_order": "18", + "aliases": [], + "aliases_ascii": [ + ":*", + ":-*", + "=*", + ":^*" + ], + "keywords": [ + "smiley", + "love", + "sexy" + ] + }, + "kissing": { + "unicode": "1f617", + "unicode_alternates": "", + "name": "kissing face", + "shortname": ":kissing:", + "category": "people", + "emoji_order": "19", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smiley", + "sexy" + ] + }, + "kissing_smiling_eyes": { + "unicode": "1f619", + "unicode_alternates": "", + "name": "kissing face with smiling eyes", + "shortname": ":kissing_smiling_eyes:", + "category": "people", + "emoji_order": "20", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smiley", + "sexy" + ] + }, + "kissing_closed_eyes": { + "unicode": "1f61a", + "unicode_alternates": "", + "name": "kissing face with closed eyes", + "shortname": ":kissing_closed_eyes:", + "category": "people", + "emoji_order": "21", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smiley", + "sexy" + ] + }, + "stuck_out_tongue_winking_eye": { + "unicode": "1f61c", + "unicode_alternates": "", + "name": "face with stuck-out tongue and winking eye", + "shortname": ":stuck_out_tongue_winking_eye:", + "category": "people", + "emoji_order": "22", + "aliases": [], + "aliases_ascii": [ + ">:P", + "X-P", + "x-p" + ], + "keywords": [ + "happy", + "smiley", + "emotion", + "emotion", + "parties", + "parties" + ] + }, + "stuck_out_tongue_closed_eyes": { + "unicode": "1f61d", + "unicode_alternates": "", + "name": "face with stuck-out tongue and tightly-closed eyes", + "shortname": ":stuck_out_tongue_closed_eyes:", + "category": "people", + "emoji_order": "23", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "happy", + "smiley", + "emotion", + "emotion" + ] + }, + "stuck_out_tongue": { + "unicode": "1f61b", + "unicode_alternates": "", + "name": "face with stuck-out tongue", + "shortname": ":stuck_out_tongue:", + "category": "people", + "emoji_order": "24", + "aliases": [], + "aliases_ascii": [ + ":P", + ":-P", + "=P", + ":-p", + ":p", + "=p", + ":-Þ", + ":Þ", + ":þ", + ":-þ", + ":-b", + ":b", + "d:" + ], + "keywords": [ + "smiley", + "sex", + "emotion", + "emotion" + ] + }, + "money_mouth": { + "unicode": "1f911", + "unicode_alternates": "", + "name": "money-mouth face", + "shortname": ":money_mouth:", + "category": "people", + "emoji_order": "25", + "aliases": [ + ":money_mouth_face:" + ], + "aliases_ascii": [], + "keywords": [ + "smiley", + "win", + "win", + "money", + "money", + "emotion", + "emotion", + "boys night", + "boys night" + ] + }, + "nerd": { + "unicode": "1f913", + "unicode_alternates": "", + "name": "nerd face", + "shortname": ":nerd:", + "category": "people", + "emoji_order": "26", + "aliases": [ + ":nerd_face:" + ], + "aliases_ascii": [], + "keywords": [ + "smiley", + "glasses" + ] + }, + "sunglasses": { + "unicode": "1f60e", + "unicode_alternates": "", + "name": "smiling face with sunglasses", + "shortname": ":sunglasses:", + "category": "people", + "emoji_order": "27", + "aliases": [], + "aliases_ascii": [ + "B-)", + "B)", + "8)", + "8-)", + "B-D", + "8-D" + ], + "keywords": [ + "silly", + "smiley", + "emojione", + "glasses", + "boys night", + "boys night" + ] + }, + "hugging": { + "unicode": "1f917", + "unicode_alternates": "", + "name": "hugging face", + "shortname": ":hugging:", + "category": "people", + "emoji_order": "28", + "aliases": [ + ":hugging_face:" + ], + "aliases_ascii": [], + "keywords": [ + "smiley", + "hug", + "thank you" + ] + }, + "smirk": { + "unicode": "1f60f", + "unicode_alternates": "", + "name": "smirking face", + "shortname": ":smirk:", + "category": "people", + "emoji_order": "29", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "silly", + "smiley", + "sexy", + "sarcastic", + "sarcastic" + ] + }, + "no_mouth": { + "unicode": "1f636", + "unicode_alternates": "", + "name": "face without mouth", + "shortname": ":no_mouth:", + "category": "people", + "emoji_order": "30", + "aliases": [], + "aliases_ascii": [ + ":-X", + ":X", + ":-#", + ":#", + "=X", + "=x", + ":x", + ":-x", + "=#" + ], + "keywords": [ + "mad", + "smiley", + "neutral", + "emotion", + "emotion" + ] + }, + "neutral_face": { + "unicode": "1f610", + "unicode_alternates": "", + "name": "neutral face", + "shortname": ":neutral_face:", + "category": "people", + "emoji_order": "31", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "mad", + "smiley", + "shrug", + "neutral", + "emotion", + "emotion" + ] + }, + "expressionless": { + "unicode": "1f611", + "unicode_alternates": "", + "name": "expressionless face", + "shortname": ":expressionless:", + "category": "people", + "emoji_order": "32", + "aliases": [], + "aliases_ascii": [ + "-_-", + "-__-", + "-___-" + ], + "keywords": [ + "mad", + "smiley", + "neutral", + "emotion", + "emotion" + ] + }, + "unamused": { + "unicode": "1f612", + "unicode_alternates": "", + "name": "unamused face", + "shortname": ":unamused:", + "category": "people", + "emoji_order": "33", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "sad", + "mad", + "smiley", + "tired", + "emotion", + "emotion" + ] + }, + "rolling_eyes": { + "unicode": "1f644", + "unicode_alternates": "", + "name": "face with rolling eyes", + "shortname": ":rolling_eyes:", + "category": "people", + "emoji_order": "34", + "aliases": [ + ":face_with_rolling_eyes:" + ], + "aliases_ascii": [], + "keywords": [ + "mad", + "smiley", + "rolling eyes", + "emotion", + "emotion", + "sarcastic", + "sarcastic" + ] + }, + "thinking": { + "unicode": "1f914", + "unicode_alternates": "", + "name": "thinking face", + "shortname": ":thinking:", + "category": "people", + "emoji_order": "35", + "aliases": [ + ":thinking_face:" + ], + "aliases_ascii": [], + "keywords": [ + "smiley", + "thinking", + "boys night", + "boys night" + ] + }, + "flushed": { + "unicode": "1f633", + "unicode_alternates": "", + "name": "flushed face", + "shortname": ":flushed:", + "category": "people", + "emoji_order": "36", + "aliases": [], + "aliases_ascii": [ + ":$", + "=$" + ], + "keywords": [ + "smiley", + "emotion", + "emotion", + "omg", + "omg" + ] + }, + "disappointed": { + "unicode": "1f61e", + "unicode_alternates": "", + "name": "disappointed face", + "shortname": ":disappointed:", + "category": "people", + "emoji_order": "37", + "aliases": [], + "aliases_ascii": [ + ">:[", + ":-(", + ":(", + ":-[", + ":[", + "=(" + ], + "keywords": [ + "sad", + "smiley", + "tired", + "emotion", + "emotion" + ] + }, + "worried": { + "unicode": "1f61f", + "unicode_alternates": "", + "name": "worried face", + "shortname": ":worried:", + "category": "people", + "emoji_order": "38", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "sad", + "smiley", + "emotion", + "emotion" + ] + }, + "angry": { + "unicode": "1f620", + "unicode_alternates": "", + "name": "angry face", + "shortname": ":angry:", + "category": "people", + "emoji_order": "39", + "aliases": [], + "aliases_ascii": [ + ">:(", + ">:-(", + ":@" + ], + "keywords": [ + "mad", + "smiley", + "emotion", + "emotion" + ] + }, + "rage": { + "unicode": "1f621", + "unicode_alternates": "", + "name": "pouting face", + "shortname": ":rage:", + "category": "people", + "emoji_order": "40", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "mad", + "smiley", + "angry", + "emotion", + "emotion" + ] + }, + "pensive": { + "unicode": "1f614", + "unicode_alternates": "", + "name": "pensive face", + "shortname": ":pensive:", + "category": "people", + "emoji_order": "41", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "sad", + "smiley", + "emotion", + "emotion", + "rip", + "rip" + ] + }, + "confused": { + "unicode": "1f615", + "unicode_alternates": "", + "name": "confused face", + "shortname": ":confused:", + "category": "people", + "emoji_order": "42", + "aliases": [], + "aliases_ascii": [ + ">:\\", + ">: /", + ": -/", + ": -.", + ": /", + ": \\", + "=/", + "=\\", + ": L", + "=L" + ], + "keywords": [ + "smiley", + "surprised", + "emotion", + "emotion" + ] + }, + "slight_frown": { + "unicode": "1f641", + "unicode_alternates": "", + "name": "slightlyfrowningface", + "shortname": ": slight_frown: ", + "category": "people", + "emoji_order": "43", + "aliases": [ + ": slightly_frowning_face: " + ], + "aliases_ascii": [], + "keywords": [ + "sad", + "smiley", + "emotion", + "emotion" + ] + }, + "frowning2": { + "unicode": "2639", + "unicode_alternates": "2639-fe0f", + "name": "whitefrowningface", + "shortname": ": frowning2: ", + "category": "people", + "emoji_order": "44", + "aliases": [ + ": white_frowning_face: " + ], + "aliases_ascii": [], + "keywords": [ + "sad", + "smiley", + "emotion", + "emotion" + ] + }, + "persevere": { + "unicode": "1f623", + "unicode_alternates": "", + "name": "perseveringface", + "shortname": ": persevere: ", + "category": "people", + "emoji_order": "45", + "aliases": [], + "aliases_ascii": [ + ">.<" + ], + "keywords": [ + "sad", + "smiley", + "angry", + "emotion", + "emotion" + ] + }, + "confounded": { + "unicode": "1f616", + "unicode_alternates": "", + "name": "confoundedface", + "shortname": ": confounded: ", + "category": "people", + "emoji_order": "46", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "sad", + "smiley", + "angry", + "emotion", + "emotion" + ] + }, + "tired_face": { + "unicode": "1f62b", + "unicode_alternates": "", + "name": "tiredface", + "shortname": ": tired_face: ", + "category": "people", + "emoji_order": "47", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "sad", + "smiley", + "tired", + "emotion", + "emotion" + ] + }, + "weary": { + "unicode": "1f629", + "unicode_alternates": "", + "name": "wearyface", + "shortname": ": weary: ", + "category": "people", + "emoji_order": "48", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "sad", + "smiley", + "tired", + "stressed", + "emotion", + "emotion" + ] + }, + "triumph": { + "unicode": "1f624", + "unicode_alternates": "", + "name": "facewithlookoftriumph", + "shortname": ": triumph: ", + "category": "people", + "emoji_order": "49", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "mad", + "smiley", + "angry", + "emotion", + "emotion", + "steam", + "steam" + ] + }, + "open_mouth": { + "unicode": "1f62e", + "unicode_alternates": "", + "name": "facewithopenmouth", + "shortname": ": open_mouth: ", + "category": "people", + "emoji_order": "50", + "aliases": [], + "aliases_ascii": [ + ": -O", + ": O", + ": -o", + ": o", + "O_O", + ">: O" + ], + "keywords": [ + "smiley", + "surprised", + "wow", + "wow", + "emotion", + "emotion" + ] + }, + "scream": { + "unicode": "1f631", + "unicode_alternates": "", + "name": "facescreaminginfear", + "shortname": ": scream: ", + "category": "people", + "emoji_order": "51", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smiley", + "surprised", + "wow", + "wow", + "emotion", + "emotion", + "omg", + "omg" + ] + }, + "fearful": { + "unicode": "1f628", + "unicode_alternates": "", + "name": "fearfulface", + "shortname": ": fearful: ", + "category": "people", + "emoji_order": "52", + "aliases": [], + "aliases_ascii": [ + "D: " + ], + "keywords": [ + "smiley", + "surprised", + "emotion", + "emotion" + ] + }, + "cold_sweat": { + "unicode": "1f630", + "unicode_alternates": "", + "name": "facewithopenmouthandcoldsweat", + "shortname": ": cold_sweat: ", + "category": "people", + "emoji_order": "53", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smiley", + "sweat", + "emotion", + "emotion" + ] + }, + "hushed": { + "unicode": "1f62f", + "unicode_alternates": "", + "name": "hushedface", + "shortname": ": hushed: ", + "category": "people", + "emoji_order": "54", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smiley", + "surprised", + "wow", + "wow" + ] + }, + "frowning": { + "unicode": "1f626", + "unicode_alternates": "", + "name": "frowningfacewithopenmouth", + "shortname": ": frowning: ", + "category": "people", + "emoji_order": "55", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "sad", + "smiley", + "surprised", + "emotion", + "emotion" + ] + }, + "anguished": { + "unicode": "1f627", + "unicode_alternates": "", + "name": "anguishedface", + "shortname": ": anguished: ", + "category": "people", + "emoji_order": "56", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "sad", + "smiley", + "surprised", + "emotion", + "emotion" + ] + }, + "cry": { + "unicode": "1f622", + "unicode_alternates": "", + "name": "cryingface", + "shortname": ": cry: ", + "category": "people", + "emoji_order": "57", + "aliases": [], + "aliases_ascii": [ + ": '(", + ":'-(", + ";(", + ";-(" + ], + "keywords": [ + "sad", + "smiley", + "cry", + "emotion", + "emotion", + "rip", + "rip", + "heartbreak", + "heartbreak" + ] + }, + "disappointed_relieved": { + "unicode": "1f625", + "unicode_alternates": "", + "name": "disappointedbutrelievedface", + "shortname": ": disappointed_relieved: ", + "category": "people", + "emoji_order": "58", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "sad", + "smiley", + "stressed", + "sweat", + "cry", + "emotion", + "emotion" + ] + }, + "sleepy": { + "unicode": "1f62a", + "unicode_alternates": "", + "name": "sleepyface", + "shortname": ": sleepy: ", + "category": "people", + "emoji_order": "59", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smiley", + "sick", + "emotion", + "emotion" + ] + }, + "sweat": { + "unicode": "1f613", + "unicode_alternates": "", + "name": "facewithcoldsweat", + "shortname": ": sweat: ", + "category": "people", + "emoji_order": "60", + "aliases": [], + "aliases_ascii": [ + "':(", + "': -(", + "'=(" + ], + "keywords": [ + "sad", + "smiley", + "stressed", + "sweat", + "emotion", + "emotion" + ] + }, + "sob": { + "unicode": "1f62d", + "unicode_alternates": "", + "name": "loudly crying face", + "shortname": ":sob:", + "category": "people", + "emoji_order": "61", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "sad", + "smiley", + "cry", + "emotion", + "emotion", + "heartbreak", + "heartbreak" + ] + }, + "dizzy_face": { + "unicode": "1f635", + "unicode_alternates": "", + "name": "dizzy face", + "shortname": ":dizzy_face:", + "category": "people", + "emoji_order": "62", + "aliases": [], + "aliases_ascii": [ + "#-)", + "#)", + "%-)", + "%)", + "X)", + "X-)" + ], + "keywords": [ + "smiley", + "surprised", + "dead", + "wow", + "wow", + "emotion", + "emotion", + "omg", + "omg" + ] + }, + "astonished": { + "unicode": "1f632", + "unicode_alternates": "", + "name": "astonished face", + "shortname": ":astonished:", + "category": "people", + "emoji_order": "63", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smiley", + "surprised", + "wow", + "wow", + "emotion", + "emotion", + "omg", + "omg" + ] + }, + "zipper_mouth": { + "unicode": "1f910", + "unicode_alternates": "", + "name": "zipper-mouth face", + "shortname": ":zipper_mouth:", + "category": "people", + "emoji_order": "64", + "aliases": [ + ":zipper_mouth_face:" + ], + "aliases_ascii": [], + "keywords": [ + "mad", + "smiley" + ] + }, + "mask": { + "unicode": "1f637", + "unicode_alternates": "", + "name": "face with medical mask", + "shortname": ":mask:", + "category": "people", + "emoji_order": "65", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smiley", + "dead", + "health", + "sick" + ] + }, + "thermometer_face": { + "unicode": "1f912", + "unicode_alternates": "", + "name": "face with thermometer", + "shortname": ":thermometer_face:", + "category": "people", + "emoji_order": "66", + "aliases": [ + ":face_with_thermometer:" + ], + "aliases_ascii": [], + "keywords": [ + "smiley", + "health", + "sick", + "emotion", + "emotion" + ] + }, + "head_bandage": { + "unicode": "1f915", + "unicode_alternates": "", + "name": "face with head-bandage", + "shortname": ":head_bandage:", + "category": "people", + "emoji_order": "67", + "aliases": [ + ":face_with_head_bandage:" + ], + "aliases_ascii": [], + "keywords": [ + "smiley", + "health", + "sick", + "emotion", + "emotion" + ] + }, + "sleeping": { + "unicode": "1f634", + "unicode_alternates": "", + "name": "sleeping face", + "shortname": ":sleeping:", + "category": "people", + "emoji_order": "68", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smiley", + "tired", + "emotion", + "emotion", + "goodnight", + "goodnight" + ] + }, + "zzz": { + "unicode": "1f4a4", + "unicode_alternates": "", + "name": "sleeping symbol", + "shortname": ":zzz:", + "category": "people", + "emoji_order": "69", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "tired", + "goodnight", + "goodnight" + ] + }, + "poop": { + "unicode": "1f4a9", + "unicode_alternates": "", + "name": "pile of poo", + "shortname": ":poop:", + "category": "people", + "emoji_order": "70", + "aliases": [ + ":shit:", + ":hankey:", + ":poo:" + ], + "aliases_ascii": [], + "keywords": [ + "bathroom", + "shit", + "sol", + "sol", + "diarrhea", + "diarrhea" + ] + }, + "smiling_imp": { + "unicode": "1f608", + "unicode_alternates": "", + "name": "smiling face with horns", + "shortname": ":smiling_imp:", + "category": "people", + "emoji_order": "71", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "silly", + "smiley", + "angry", + "monster", + "devil", + "devil", + "boys night", + "boys night" + ] + }, + "imp": { + "unicode": "1f47f", + "unicode_alternates": "", + "name": "imp", + "shortname": ":imp:", + "category": "people", + "emoji_order": "72", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smiley", + "monster", + "devil", + "devil", + "wth", + "wth" + ] + }, + "japanese_ogre": { + "unicode": "1f479", + "unicode_alternates": "", + "name": "japanese ogre", + "shortname": ":japanese_ogre:", + "category": "people", + "emoji_order": "73", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "monster" + ] + }, + "japanese_goblin": { + "unicode": "1f47a", + "unicode_alternates": "", + "name": "japanese goblin", + "shortname": ":japanese_goblin:", + "category": "people", + "emoji_order": "74", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "angry", + "monster" + ] + }, + "skull": { + "unicode": "1f480", + "unicode_alternates": "", + "name": "skull", + "shortname": ":skull:", + "category": "people", + "emoji_order": "75", + "aliases": [ + ":skeleton:" + ], + "aliases_ascii": [], + "keywords": [ + "dead", + "halloween", + "skull" + ] + }, + "ghost": { + "unicode": "1f47b", + "unicode_alternates": "", + "name": "ghost", + "shortname": ":ghost:", + "category": "people", + "emoji_order": "76", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "holidays", + "halloween", + "monster" + ] + }, + "alien": { + "unicode": "1f47d", + "unicode_alternates": "", + "name": "extraterrestrial alien", + "shortname": ":alien:", + "category": "people", + "emoji_order": "77", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space", + "monster", + "alien", + "scientology", + "scientology" + ] + }, + "robot": { + "unicode": "1f916", + "unicode_alternates": "", + "name": "robot face", + "shortname": ":robot:", + "category": "people", + "emoji_order": "78", + "aliases": [ + ":robot_face:" + ], + "aliases_ascii": [], + "keywords": [ + "monster", + "robot" + ] + }, + "smiley_cat": { + "unicode": "1f63a", + "unicode_alternates": "", + "name": "smiling cat face with open mouth", + "shortname": ":smiley_cat:", + "category": "people", + "emoji_order": "79", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "happy", + "cat", + "cat", + "animal", + "animal" + ] + }, + "smile_cat": { + "unicode": "1f638", + "unicode_alternates": "", + "name": "grinning cat face with smiling eyes", + "shortname": ":smile_cat:", + "category": "people", + "emoji_order": "80", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "happy", + "cat", + "cat", + "animal", + "animal" + ] + }, + "joy_cat": { + "unicode": "1f639", + "unicode_alternates": "", + "name": "cat face with tears of joy", + "shortname": ":joy_cat:", + "category": "people", + "emoji_order": "81", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "happy", + "silly", + "cry", + "laugh", + "laugh", + "cat", + "cat", + "animal", + "animal", + "sarcastic", + "sarcastic" + ] + }, + "heart_eyes_cat": { + "unicode": "1f63b", + "unicode_alternates": "", + "name": "smiling cat face with heart-shaped eyes", + "shortname": ":heart_eyes_cat:", + "category": "people", + "emoji_order": "82", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "heart eyes", + "cat", + "cat", + "animal", + "animal", + "beautiful", + "beautiful" + ] + }, + "smirk_cat": { + "unicode": "1f63c", + "unicode_alternates": "", + "name": "cat face with wry smile", + "shortname": ":smirk_cat:", + "category": "people", + "emoji_order": "83", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "cat", + "cat", + "animal", + "animal" + ] + }, + "kissing_cat": { + "unicode": "1f63d", + "unicode_alternates": "", + "name": "kissing cat face with closed eyes", + "shortname": ":kissing_cat:", + "category": "people", + "emoji_order": "84", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "cat", + "cat", + "animal", + "animal" + ] + }, + "scream_cat": { + "unicode": "1f640", + "unicode_alternates": "", + "name": "weary cat face", + "shortname": ":scream_cat:", + "category": "people", + "emoji_order": "85", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "cat", + "cat", + "animal", + "animal" + ] + }, + "crying_cat_face": { + "unicode": "1f63f", + "unicode_alternates": "", + "name": "crying cat face", + "shortname": ":crying_cat_face:", + "category": "people", + "emoji_order": "86", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "cry", + "cat", + "cat", + "animal", + "animal" + ] + }, + "pouting_cat": { + "unicode": "1f63e", + "unicode_alternates": "", + "name": "pouting cat face", + "shortname": ":pouting_cat:", + "category": "people", + "emoji_order": "87", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "cat", + "cat", + "animal", + "animal" + ] + }, + "raised_hands": { + "unicode": "1f64c", + "unicode_alternates": "", + "name": "person raising both hands in celebration", + "shortname": ":raised_hands:", + "category": "people", + "emoji_order": "88", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "diversity", + "diversity", + "perfect", + "perfect", + "good", + "good", + "parties", + "parties" + ] + }, + "clap": { + "unicode": "1f44f", + "unicode_alternates": "", + "name": "clapping hands sign", + "shortname": ":clap:", + "category": "people", + "emoji_order": "89", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "win", + "win", + "diversity", + "diversity", + "good", + "good", + "beautiful", + "beautiful" + ] + }, + "wave": { + "unicode": "1f44b", + "unicode_alternates": "", + "name": "waving hand sign", + "shortname": ":wave:", + "category": "people", + "emoji_order": "90", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "hi", + "diversity", + "diversity" + ] + }, + "thumbsup": { + "unicode": "1f44d", + "unicode_alternates": "", + "name": "thumbs up sign", + "shortname": ":thumbsup:", + "category": "people", + "emoji_order": "91", + "aliases": [ + ":+1:", + ":thumbup:" + ], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "hi", + "luck", + "thank you", + "diversity", + "diversity", + "perfect", + "perfect", + "good", + "good", + "beautiful", + "beautiful" + ] + }, + "thumbsdown": { + "unicode": "1f44e", + "unicode_alternates": "", + "name": "thumbs down sign", + "shortname": ":thumbsdown:", + "category": "people", + "emoji_order": "92", + "aliases": [ + ":-1:", + ":thumbdown:" + ], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "diversity", + "diversity" + ] + }, + "punch": { + "unicode": "1f44a", + "unicode_alternates": "", + "name": "fisted hand sign", + "shortname": ":punch:", + "category": "people", + "emoji_order": "93", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "hi", + "fist bump", + "diversity", + "diversity", + "boys night", + "boys night" + ] + }, + "fist": { + "unicode": "270a", + "unicode_alternates": "", + "name": "raised fist", + "shortname": ":fist:", + "category": "people", + "emoji_order": "94", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "hi", + "fist bump", + "diversity", + "diversity", + "condolence", + "condolence" + ] + }, + "v": { + "unicode": "270c", + "unicode_alternates": "270c-fe0f", + "name": "victory hand", + "shortname": ":v:", + "category": "people", + "emoji_order": "95", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "hi", + "thank you", + "peace", + "peace", + "diversity", + "diversity", + "girls night", + "girls night" + ] + }, + "ok_hand": { + "unicode": "1f44c", + "unicode_alternates": "", + "name": "ok hand sign", + "shortname": ":ok_hand:", + "category": "people", + "emoji_order": "96", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "hi", + "diversity", + "diversity", + "perfect", + "perfect", + "good", + "good", + "beautiful", + "beautiful" + ] + }, + "raised_hand": { + "unicode": "270b", + "unicode_alternates": "", + "name": "raised hand", + "shortname": ":raised_hand:", + "category": "people", + "emoji_order": "97", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "hi", + "diversity", + "diversity", + "girls night", + "girls night" + ] + }, + "open_hands": { + "unicode": "1f450", + "unicode_alternates": "", + "name": "open hands sign", + "shortname": ":open_hands:", + "category": "people", + "emoji_order": "98", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "diversity", + "diversity", + "condolence", + "condolence" + ] + }, + "muscle": { + "unicode": "1f4aa", + "unicode_alternates": "", + "name": "flexed biceps", + "shortname": ":muscle:", + "category": "people", + "emoji_order": "99", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "workout", + "flex", + "win", + "win", + "diversity", + "diversity", + "feminist", + "feminist", + "boys night", + "boys night" + ] + }, + "pray": { + "unicode": "1f64f", + "unicode_alternates": "", + "name": "person with folded hands", + "shortname": ":pray:", + "category": "people", + "emoji_order": "100", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "hi", + "luck", + "thank you", + "pray", + "pray", + "diversity", + "diversity", + "scientology", + "scientology" + ] + }, + "point_up": { + "unicode": "261d", + "unicode_alternates": "261d-fe0f", + "name": "white up pointing index", + "shortname": ":point_up:", + "category": "people", + "emoji_order": "101", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "emojione", + "diversity", + "diversity" + ] + }, + "point_up_2": { + "unicode": "1f446", + "unicode_alternates": "", + "name": "white up pointing backhand index", + "shortname": ":point_up_2:", + "category": "people", + "emoji_order": "102", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "diversity", + "diversity" + ] + }, + "point_down": { + "unicode": "1f447", + "unicode_alternates": "", + "name": "white down pointing backhand index", + "shortname": ":point_down:", + "category": "people", + "emoji_order": "103", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "diversity", + "diversity" + ] + }, + "point_left": { + "unicode": "1f448", + "unicode_alternates": "", + "name": "white left pointing backhand index", + "shortname": ":point_left:", + "category": "people", + "emoji_order": "104", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "hi", + "diversity", + "diversity" + ] + }, + "point_right": { + "unicode": "1f449", + "unicode_alternates": "", + "name": "white right pointing backhand index", + "shortname": ":point_right:", + "category": "people", + "emoji_order": "105", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "hi", + "diversity", + "diversity" + ] + }, + "middle_finger": { + "unicode": "1f595", + "unicode_alternates": "", + "name": "reversed hand with middle finger extended", + "shortname": ":middle_finger:", + "category": "people", + "emoji_order": "106", + "aliases": [ + ":reversed_hand_with_middle_finger_extended:" + ], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "middle finger", + "diversity", + "diversity" + ] + }, + "hand_splayed": { + "unicode": "1f590", + "unicode_alternates": "1f590-fe0f", + "name": "raised hand with fingers splayed", + "shortname": ":hand_splayed:", + "category": "people", + "emoji_order": "107", + "aliases": [ + ":raised_hand_with_fingers_splayed:" + ], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "hi", + "diversity", + "diversity" + ] + }, + "metal": { + "unicode": "1f918", + "unicode_alternates": "", + "name": "sign of the horns", + "shortname": ":metal:", + "category": "people", + "emoji_order": "108", + "aliases": [ + ":sign_of_the_horns:" + ], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "hi", + "diversity", + "diversity", + "boys night", + "boys night", + "parties", + "parties" + ] + }, + "vulcan": { + "unicode": "1f596", + "unicode_alternates": "", + "name": "raised hand with part between middle and ring fingers", + "shortname": ":vulcan:", + "category": "people", + "emoji_order": "109", + "aliases": [ + ":raised_hand_with_part_between_middle_and_ring_fingers:" + ], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "hi", + "diversity", + "diversity" + ] + }, + "writing_hand": { + "unicode": "270d", + "unicode_alternates": "270d-fe0f", + "name": "writing hand", + "shortname": ":writing_hand:", + "category": "people", + "emoji_order": "110", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "write", + "diversity", + "diversity" + ] + }, + "nail_care": { + "unicode": "1f485", + "unicode_alternates": "", + "name": "nail polish", + "shortname": ":nail_care:", + "category": "people", + "emoji_order": "111", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "women", + "body", + "hands", + "nailpolish", + "diversity", + "diversity", + "girls night", + "girls night" + ] + }, + "lips": { + "unicode": "1f444", + "unicode_alternates": "", + "name": "mouth", + "shortname": ":lips:", + "category": "people", + "emoji_order": "112", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "women", + "body", + "sexy", + "lip" + ] + }, + "tongue": { + "unicode": "1f445", + "unicode_alternates": "", + "name": "tongue", + "shortname": ":tongue:", + "category": "people", + "emoji_order": "113", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "sexy", + "lip" + ] + }, + "ear": { + "unicode": "1f442", + "unicode_alternates": "", + "name": "ear", + "shortname": ":ear:", + "category": "people", + "emoji_order": "114", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "diversity", + "diversity" + ] + }, + "nose": { + "unicode": "1f443", + "unicode_alternates": "", + "name": "nose", + "shortname": ":nose:", + "category": "people", + "emoji_order": "115", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "diversity", + "diversity" + ] + }, + "eye": { + "unicode": "1f441", + "unicode_alternates": "1f441-fe0f", + "name": "eye", + "shortname": ":eye:", + "category": "people", + "emoji_order": "116", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "eyes" + ] + }, + "eyes": { + "unicode": "1f440", + "unicode_alternates": "", + "name": "eyes", + "shortname": ":eyes:", + "category": "people", + "emoji_order": "117", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "eyes" + ] + }, + "bust_in_silhouette": { + "unicode": "1f464", + "unicode_alternates": "", + "name": "bust in silhouette", + "shortname": ":bust_in_silhouette:", + "category": "people", + "emoji_order": "118", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people" + ] + }, + "busts_in_silhouette": { + "unicode": "1f465", + "unicode_alternates": "", + "name": "busts in silhouette", + "shortname": ":busts_in_silhouette:", + "category": "people", + "emoji_order": "119", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people" + ] + }, + "speaking_head": { + "unicode": "1f5e3", + "unicode_alternates": "1f5e3-fe0f", + "name": "speaking head in silhouette", + "shortname": ":speaking_head:", + "category": "people", + "emoji_order": "120", + "aliases": [ + ":speaking_head_in_silhouette:" + ], + "aliases_ascii": [], + "keywords": [ + "people", + "talk" + ] + }, + "baby": { + "unicode": "1f476", + "unicode_alternates": "", + "name": "baby", + "shortname": ":baby:", + "category": "people", + "emoji_order": "121", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "baby", + "diversity", + "diversity" + ] + }, + "boy": { + "unicode": "1f466", + "unicode_alternates": "", + "name": "boy", + "shortname": ":boy:", + "category": "people", + "emoji_order": "122", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "baby", + "diversity", + "diversity" + ] + }, + "girl": { + "unicode": "1f467", + "unicode_alternates": "", + "name": "girl", + "shortname": ":girl:", + "category": "people", + "emoji_order": "123", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "women", + "baby", + "diversity", + "diversity" + ] + }, + "man": { + "unicode": "1f468", + "unicode_alternates": "", + "name": "man", + "shortname": ":man:", + "category": "people", + "emoji_order": "124", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "men", + "sex", + "diversity", + "diversity", + "selfie", + "selfie", + "boys night", + "boys night" + ] + }, + "woman": { + "unicode": "1f469", + "unicode_alternates": "", + "name": "woman", + "shortname": ":woman:", + "category": "people", + "emoji_order": "125", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "women", + "sex", + "diversity", + "diversity", + "feminist", + "feminist", + "selfie", + "selfie", + "girls night", + "girls night" + ] + }, + "person_with_blond_hair": { + "unicode": "1f471", + "unicode_alternates": "", + "name": "person with blond hair", + "shortname": ":person_with_blond_hair:", + "category": "people", + "emoji_order": "126", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "men", + "diversity", + "diversity" + ] + }, + "older_man": { + "unicode": "1f474", + "unicode_alternates": "", + "name": "older man", + "shortname": ":older_man:", + "category": "people", + "emoji_order": "127", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "men", + "old people", + "diversity", + "diversity" + ] + }, + "older_woman": { + "unicode": "1f475", + "unicode_alternates": "", + "name": "older woman", + "shortname": ":older_woman:", + "category": "people", + "emoji_order": "128", + "aliases": [ + ":grandma:" + ], + "aliases_ascii": [], + "keywords": [ + "people", + "old people", + "diversity", + "diversity" + ] + }, + "man_with_gua_pi_mao": { + "unicode": "1f472", + "unicode_alternates": "", + "name": "man with gua pi mao", + "shortname": ":man_with_gua_pi_mao:", + "category": "people", + "emoji_order": "129", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "hat", + "men", + "diversity", + "diversity" + ] + }, + "man_with_turban": { + "unicode": "1f473", + "unicode_alternates": "", + "name": "man with turban", + "shortname": ":man_with_turban:", + "category": "people", + "emoji_order": "130", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "hat", + "diversity", + "diversity" + ] + }, + "cop": { + "unicode": "1f46e", + "unicode_alternates": "", + "name": "police officer", + "shortname": ":cop:", + "category": "people", + "emoji_order": "131", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "hat", + "men", + "diversity", + "diversity", + "job", + "job", + "police", + "police", + "911", + "911" + ] + }, + "construction_worker": { + "unicode": "1f477", + "unicode_alternates": "", + "name": "construction worker", + "shortname": ":construction_worker:", + "category": "people", + "emoji_order": "132", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "hat", + "men", + "diversity", + "diversity", + "job", + "job" + ] + }, + "guardsman": { + "unicode": "1f482", + "unicode_alternates": "", + "name": "guardsman", + "shortname": ":guardsman:", + "category": "people", + "emoji_order": "133", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "hat", + "men", + "diversity", + "diversity", + "job", + "job" + ] + }, + "spy": { + "unicode": "1f575", + "unicode_alternates": "1f575-fe0f", + "name": "sleuth or spy", + "shortname": ":spy:", + "category": "people", + "emoji_order": "134", + "aliases": [ + ":sleuth_or_spy:" + ], + "aliases_ascii": [], + "keywords": [ + "people", + "hat", + "men", + "glasses", + "diversity", + "diversity", + "job", + "job" + ] + }, + "santa": { + "unicode": "1f385", + "unicode_alternates": "", + "name": "father christmas", + "shortname": ":santa:", + "category": "people", + "emoji_order": "135", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "hat", + "winter", + "holidays", + "christmas", + "diversity", + "diversity", + "santa", + "santa" + ] + }, + "angel": { + "unicode": "1f47c", + "unicode_alternates": "", + "name": "baby angel", + "shortname": ":angel:", + "category": "people", + "emoji_order": "136", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "diversity", + "diversity", + "omg", + "omg" + ] + }, + "princess": { + "unicode": "1f478", + "unicode_alternates": "", + "name": "princess", + "shortname": ":princess:", + "category": "people", + "emoji_order": "137", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "women", + "diversity", + "diversity", + "beautiful", + "beautiful", + "girls night", + "girls night" + ] + }, + "bride_with_veil": { + "unicode": "1f470", + "unicode_alternates": "", + "name": "bride with veil", + "shortname": ":bride_with_veil:", + "category": "people", + "emoji_order": "138", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "wedding", + "women", + "diversity", + "diversity" + ] + }, + "walking": { + "unicode": "1f6b6", + "unicode_alternates": "", + "name": "pedestrian", + "shortname": ":walking:", + "category": "people", + "emoji_order": "139", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "men", + "diversity", + "diversity" + ] + }, + "runner": { + "unicode": "1f3c3", + "unicode_alternates": "", + "name": "runner", + "shortname": ":runner:", + "category": "people", + "emoji_order": "140", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "men", + "diversity", + "diversity", + "boys night", + "boys night", + "run", + "run" + ] + }, + "dancer": { + "unicode": "1f483", + "unicode_alternates": "", + "name": "dancer", + "shortname": ":dancer:", + "category": "people", + "emoji_order": "141", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "women", + "sexy", + "diversity", + "diversity", + "girls night", + "girls night", + "dance", + "dance" + ] + }, + "dancers": { + "unicode": "1f46f", + "unicode_alternates": "", + "name": "woman with bunny ears", + "shortname": ":dancers:", + "category": "people", + "emoji_order": "142", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "women", + "sexy", + "girls night", + "girls night", + "boys night", + "boys night", + "parties", + "parties", + "dance", + "dance" + ] + }, + "couple": { + "unicode": "1f46b", + "unicode_alternates": "", + "name": "man and woman holding hands", + "shortname": ":couple:", + "category": "people", + "emoji_order": "143", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "sex", + "creationism", + "creationism" + ] + }, + "two_men_holding_hands": { + "unicode": "1f46c", + "unicode_alternates": "", + "name": "two men holding hands", + "shortname": ":two_men_holding_hands:", + "category": "people", + "emoji_order": "144", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "gay", + "men", + "sex", + "lgbt", + "lgbt" + ] + }, + "two_women_holding_hands": { + "unicode": "1f46d", + "unicode_alternates": "", + "name": "two women holding hands", + "shortname": ":two_women_holding_hands:", + "category": "people", + "emoji_order": "145", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "women", + "sex", + "lgbt", + "lgbt", + "lesbian", + "lesbian", + "girls night", + "girls night" + ] + }, + "bow": { + "unicode": "1f647", + "unicode_alternates": "", + "name": "person bowing deeply", + "shortname": ":bow:", + "category": "people", + "emoji_order": "146", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "pray", + "pray", + "diversity", + "diversity" + ] + }, + "information_desk_person": { + "unicode": "1f481", + "unicode_alternates": "", + "name": "information desk person", + "shortname": ":information_desk_person:", + "category": "people", + "emoji_order": "147", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "women", + "diversity", + "diversity" + ] + }, + "no_good": { + "unicode": "1f645", + "unicode_alternates": "", + "name": "face with no good gesture", + "shortname": ":no_good:", + "category": "people", + "emoji_order": "148", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "women", + "diversity", + "diversity", + "girls night", + "girls night" + ] + }, + "ok_woman": { + "unicode": "1f646", + "unicode_alternates": "", + "name": "face with ok gesture", + "shortname": ":ok_woman:", + "category": "people", + "emoji_order": "149", + "aliases": [], + "aliases_ascii": [ + "*\\0/*", + "\\0/", + "*\\O/*", + "\\O/" + ], + "keywords": [ + "people", + "women", + "diversity", + "diversity" + ] + }, + "raising_hand": { + "unicode": "1f64b", + "unicode_alternates": "", + "name": "happy person raising one hand", + "shortname": ":raising_hand:", + "category": "people", + "emoji_order": "150", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "women", + "diversity", + "diversity" + ] + }, + "person_with_pouting_face": { + "unicode": "1f64e", + "unicode_alternates": "", + "name": "person with pouting face", + "shortname": ":person_with_pouting_face:", + "category": "people", + "emoji_order": "151", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "women", + "diversity", + "diversity" + ] + }, + "person_frowning": { + "unicode": "1f64d", + "unicode_alternates": "", + "name": "person frowning", + "shortname": ":person_frowning:", + "category": "people", + "emoji_order": "152", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "women", + "diversity", + "diversity" + ] + }, + "haircut": { + "unicode": "1f487", + "unicode_alternates": "", + "name": "haircut", + "shortname": ":haircut:", + "category": "people", + "emoji_order": "153", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "women", + "diversity", + "diversity" + ] + }, + "massage": { + "unicode": "1f486", + "unicode_alternates": "", + "name": "face massage", + "shortname": ":massage:", + "category": "people", + "emoji_order": "154", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "women", + "diversity", + "diversity" + ] + }, + "couple_with_heart": { + "unicode": "1f491", + "unicode_alternates": "", + "name": "couple with heart", + "shortname": ":couple_with_heart:", + "category": "people", + "emoji_order": "155", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "love", + "sex" + ] + }, + "couple_ww": { + "unicode": "1f469-2764-1f469", + "unicode_alternates": "1f469-200d-2764-fe0f-200d-1f469", + "name": "couple (woman,woman)", + "shortname": ":couple_ww:", + "category": "people", + "emoji_order": "156", + "aliases": [ + ":couple_with_heart_ww:" + ], + "aliases_ascii": [], + "keywords": [ + "people", + "women", + "love", + "sex", + "lgbt", + "lgbt" + ] + }, + "couple_mm": { + "unicode": "1f468-2764-1f468", + "unicode_alternates": "1f468-200d-2764-fe0f-200d-1f468", + "name": "couple (man,man)", + "shortname": ":couple_mm:", + "category": "people", + "emoji_order": "157", + "aliases": [ + ":couple_with_heart_mm:" + ], + "aliases_ascii": [], + "keywords": [ + "people", + "gay", + "men", + "love", + "sex", + "lgbt", + "lgbt" + ] + }, + "couplekiss": { + "unicode": "1f48f", + "unicode_alternates": "", + "name": "kiss", + "shortname": ":couplekiss:", + "category": "people", + "emoji_order": "158", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "love", + "sex" + ] + }, + "kiss_ww": { + "unicode": "1f469-2764-1f48b-1f469", + "unicode_alternates": "1f469-200d-2764-fe0f-200d-1f48b-200d-1f469", + "name": "kiss (woman,woman)", + "shortname": ":kiss_ww:", + "category": "people", + "emoji_order": "159", + "aliases": [ + ":couplekiss_ww:" + ], + "aliases_ascii": [], + "keywords": [ + "people", + "women", + "love", + "sex", + "lgbt", + "lgbt", + "lesbian", + "lesbian" + ] + }, + "kiss_mm": { + "unicode": "1f468-2764-1f48b-1f468", + "unicode_alternates": "1f468-200d-2764-fe0f-200d-1f48b-200d-1f468", + "name": "kiss (man,man)", + "shortname": ":kiss_mm:", + "category": "people", + "emoji_order": "160", + "aliases": [ + ":couplekiss_mm:" + ], + "aliases_ascii": [], + "keywords": [ + "people", + "gay", + "men", + "love", + "sex", + "lgbt", + "lgbt" + ] + }, + "family": { + "unicode": "1f46a", + "unicode_alternates": "", + "name": "family", + "shortname": ":family:", + "category": "people", + "emoji_order": "161", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "family", + "baby" + ] + }, + "family_mwg": { + "unicode": "1f468-1f469-1f467", + "unicode_alternates": "1f468-200d-1f469-200d-1f467", + "name": "family (man,woman,girl)", + "shortname": ":family_mwg:", + "category": "people", + "emoji_order": "162", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "family", + "baby" + ] + }, + "family_mwgb": { + "unicode": "1f468-1f469-1f467-1f466", + "unicode_alternates": "1f468-200d-1f469-200d-1f467-200d-1f466", + "name": "family (man,woman,girl,boy)", + "shortname": ":family_mwgb:", + "category": "people", + "emoji_order": "163", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "family", + "baby" + ] + }, + "family_mwbb": { + "unicode": "1f468-1f469-1f466-1f466", + "unicode_alternates": "1f468-200d-1f469-200d-1f466-200d-1f466", + "name": "family (man,woman,boy,boy)", + "shortname": ":family_mwbb:", + "category": "people", + "emoji_order": "164", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "family", + "baby" + ] + }, + "family_mwgg": { + "unicode": "1f468-1f469-1f467-1f467", + "unicode_alternates": "1f468-200d-1f469-200d-1f467-200d-1f467", + "name": "family (man,woman,girl,girl)", + "shortname": ":family_mwgg:", + "category": "people", + "emoji_order": "165", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "family", + "baby" + ] + }, + "family_wwb": { + "unicode": "1f469-1f469-1f466", + "unicode_alternates": "1f469-200d-1f469-200d-1f466", + "name": "family (woman,woman,boy)", + "shortname": ":family_wwb:", + "category": "people", + "emoji_order": "166", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "family", + "women", + "baby", + "lgbt", + "lgbt", + "lesbian", + "lesbian" + ] + }, + "family_wwg": { + "unicode": "1f469-1f469-1f467", + "unicode_alternates": "1f469-200d-1f469-200d-1f467", + "name": "family (woman,woman,girl)", + "shortname": ":family_wwg:", + "category": "people", + "emoji_order": "167", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "family", + "women", + "baby", + "lgbt", + "lgbt", + "lesbian", + "lesbian" + ] + }, + "family_wwgb": { + "unicode": "1f469-1f469-1f467-1f466", + "unicode_alternates": "1f469-200d-1f469-200d-1f467-200d-1f466", + "name": "family (woman,woman,girl,boy)", + "shortname": ":family_wwgb:", + "category": "people", + "emoji_order": "168", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "family", + "women", + "baby", + "lgbt", + "lgbt", + "lesbian", + "lesbian" + ] + }, + "family_wwbb": { + "unicode": "1f469-1f469-1f466-1f466", + "unicode_alternates": "1f469-200d-1f469-200d-1f466-200d-1f466", + "name": "family (woman,woman,boy,boy)", + "shortname": ":family_wwbb:", + "category": "people", + "emoji_order": "169", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "family", + "women", + "baby", + "lgbt", + "lgbt", + "lesbian", + "lesbian" + ] + }, + "family_wwgg": { + "unicode": "1f469-1f469-1f467-1f467", + "unicode_alternates": "1f469-200d-1f469-200d-1f467-200d-1f467", + "name": "family (woman,woman,girl,girl)", + "shortname": ":family_wwgg:", + "category": "people", + "emoji_order": "170", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "family", + "women", + "baby", + "lgbt", + "lgbt", + "lesbian", + "lesbian" + ] + }, + "family_mmb": { + "unicode": "1f468-1f468-1f466", + "unicode_alternates": "1f468-200d-1f468-200d-1f466", + "name": "family (man,man,boy)", + "shortname": ":family_mmb:", + "category": "people", + "emoji_order": "171", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "gay", + "family", + "men", + "baby", + "lgbt", + "lgbt" + ] + }, + "family_mmg": { + "unicode": "1f468-1f468-1f467", + "unicode_alternates": "1f468-200d-1f468-200d-1f467", + "name": "family (man,man,girl)", + "shortname": ":family_mmg:", + "category": "people", + "emoji_order": "172", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "gay", + "family", + "men", + "baby", + "lgbt", + "lgbt" + ] + }, + "family_mmgb": { + "unicode": "1f468-1f468-1f467-1f466", + "unicode_alternates": "1f468-200d-1f468-200d-1f467-200d-1f466", + "name": "family (man,man,girl,boy)", + "shortname": ":family_mmgb:", + "category": "people", + "emoji_order": "173", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "gay", + "family", + "men", + "baby", + "lgbt", + "lgbt" + ] + }, + "family_mmbb": { + "unicode": "1f468-1f468-1f466-1f466", + "unicode_alternates": "1f468-200d-1f468-200d-1f466-200d-1f466", + "name": "family (man,man,boy,boy)", + "shortname": ":family_mmbb:", + "category": "people", + "emoji_order": "174", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "gay", + "family", + "men", + "baby", + "lgbt", + "lgbt" + ] + }, + "family_mmgg": { + "unicode": "1f468-1f468-1f467-1f467", + "unicode_alternates": "1f468-200d-1f468-200d-1f467-200d-1f467", + "name": "family (man,man,girl,girl)", + "shortname": ":family_mmgg:", + "category": "people", + "emoji_order": "175", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "gay", + "family", + "men", + "baby", + "lgbt", + "lgbt" + ] + }, + "womans_clothes": { + "unicode": "1f45a", + "unicode_alternates": "", + "name": "womans clothes", + "shortname": ":womans_clothes:", + "category": "people", + "emoji_order": "176", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "women", + "fashion" + ] + }, + "shirt": { + "unicode": "1f455", + "unicode_alternates": "", + "name": "t-shirt", + "shortname": ":shirt:", + "category": "people", + "emoji_order": "177", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fashion" + ] + }, + "jeans": { + "unicode": "1f456", + "unicode_alternates": "", + "name": "jeans", + "shortname": ":jeans:", + "category": "people", + "emoji_order": "178", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fashion" + ] + }, + "necktie": { + "unicode": "1f454", + "unicode_alternates": "", + "name": "necktie", + "shortname": ":necktie:", + "category": "people", + "emoji_order": "179", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fashion" + ] + }, + "dress": { + "unicode": "1f457", + "unicode_alternates": "", + "name": "dress", + "shortname": ":dress:", + "category": "people", + "emoji_order": "180", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "women", + "fashion", + "sexy", + "girls night", + "girls night" + ] + }, + "bikini": { + "unicode": "1f459", + "unicode_alternates": "", + "name": "bikini", + "shortname": ":bikini:", + "category": "people", + "emoji_order": "181", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "women", + "fashion", + "sexy", + "vacation", + "tropical", + "swim" + ] + }, + "kimono": { + "unicode": "1f458", + "unicode_alternates": "", + "name": "kimono", + "shortname": ":kimono:", + "category": "people", + "emoji_order": "182", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fashion" + ] + }, + "lipstick": { + "unicode": "1f484", + "unicode_alternates": "", + "name": "lipstick", + "shortname": ":lipstick:", + "category": "people", + "emoji_order": "183", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "women", + "fashion", + "sexy", + "lip" + ] + }, + "kiss": { + "unicode": "1f48b", + "unicode_alternates": "", + "name": "kiss mark", + "shortname": ":kiss:", + "category": "people", + "emoji_order": "184", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "women", + "love", + "sexy", + "lip", + "beautiful", + "beautiful", + "girls night", + "girls night" + ] + }, + "footprints": { + "unicode": "1f463", + "unicode_alternates": "", + "name": "footprints", + "shortname": ":footprints:", + "category": "people", + "emoji_order": "185", + "aliases": [], + "aliases_ascii": [], + "keywords": [] + }, + "high_heel": { + "unicode": "1f460", + "unicode_alternates": "", + "name": "high-heeled shoe", + "shortname": ":high_heel:", + "category": "people", + "emoji_order": "186", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "women", + "fashion", + "shoe", + "sexy", + "accessories", + "girls night", + "girls night" + ] + }, + "sandal": { + "unicode": "1f461", + "unicode_alternates": "", + "name": "womans sandal", + "shortname": ":sandal:", + "category": "people", + "emoji_order": "187", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fashion", + "shoe", + "accessories" + ] + }, + "boot": { + "unicode": "1f462", + "unicode_alternates": "", + "name": "womans boots", + "shortname": ":boot:", + "category": "people", + "emoji_order": "188", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "women", + "fashion", + "shoe", + "sexy", + "accessories" + ] + }, + "mans_shoe": { + "unicode": "1f45e", + "unicode_alternates": "", + "name": "mans shoe", + "shortname": ":mans_shoe:", + "category": "people", + "emoji_order": "189", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fashion", + "shoe", + "accessories" + ] + }, + "athletic_shoe": { + "unicode": "1f45f", + "unicode_alternates": "", + "name": "athletic shoe", + "shortname": ":athletic_shoe:", + "category": "people", + "emoji_order": "190", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fashion", + "shoe", + "accessories", + "boys night", + "boys night" + ] + }, + "womans_hat": { + "unicode": "1f452", + "unicode_alternates": "", + "name": "womans hat", + "shortname": ":womans_hat:", + "category": "people", + "emoji_order": "191", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "women", + "fashion", + "accessories" + ] + }, + "tophat": { + "unicode": "1f3a9", + "unicode_alternates": "", + "name": "top hat", + "shortname": ":tophat:", + "category": "people", + "emoji_order": "192", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "hat", + "fashion", + "accessories" + ] + }, + "helmet_with_cross": { + "unicode": "26d1", + "unicode_alternates": "26d1-fe0f", + "name": "helmet with white cross", + "shortname": ":helmet_with_cross:", + "category": "people", + "emoji_order": "193", + "aliases": [ + ":helmet_with_white_cross:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "hat", + "accessories", + "job", + "job" + ] + }, + "mortar_board": { + "unicode": "1f393", + "unicode_alternates": "", + "name": "graduation cap", + "shortname": ":mortar_board:", + "category": "people", + "emoji_order": "194", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "hat", + "office", + "accessories" + ] + }, + "crown": { + "unicode": "1f451", + "unicode_alternates": "", + "name": "crown", + "shortname": ":crown:", + "category": "people", + "emoji_order": "195", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "gem", + "accessories" + ] + }, + "school_satchel": { + "unicode": "1f392", + "unicode_alternates": "", + "name": "school satchel", + "shortname": ":school_satchel:", + "category": "people", + "emoji_order": "196", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "bag", + "fashion", + "office", + "vacation", + "accessories" + ] + }, + "pouch": { + "unicode": "1f45d", + "unicode_alternates": "", + "name": "pouch", + "shortname": ":pouch:", + "category": "people", + "emoji_order": "197", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "bag", + "women", + "fashion", + "accessories" + ] + }, + "purse": { + "unicode": "1f45b", + "unicode_alternates": "", + "name": "purse", + "shortname": ":purse:", + "category": "people", + "emoji_order": "198", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "bag", + "women", + "fashion", + "accessories", + "money", + "money" + ] + }, + "handbag": { + "unicode": "1f45c", + "unicode_alternates": "", + "name": "handbag", + "shortname": ":handbag:", + "category": "people", + "emoji_order": "199", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "bag", + "women", + "fashion", + "vacation", + "accessories" + ] + }, + "briefcase": { + "unicode": "1f4bc", + "unicode_alternates": "", + "name": "briefcase", + "shortname": ":briefcase:", + "category": "people", + "emoji_order": "200", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "bag", + "work", + "accessories", + "nutcase", + "nutcase", + "job", + "job" + ] + }, + "eyeglasses": { + "unicode": "1f453", + "unicode_alternates": "", + "name": "eyeglasses", + "shortname": ":eyeglasses:", + "category": "people", + "emoji_order": "201", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fashion", + "glasses", + "accessories" + ] + }, + "dark_sunglasses": { + "unicode": "1f576", + "unicode_alternates": "1f576-fe0f", + "name": "dark sunglasses", + "shortname": ":dark_sunglasses:", + "category": "people", + "emoji_order": "202", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fashion", + "glasses", + "accessories" + ] + }, + "ring": { + "unicode": "1f48d", + "unicode_alternates": "", + "name": "ring", + "shortname": ":ring:", + "category": "people", + "emoji_order": "203", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wedding", + "object", + "fashion", + "gem", + "accessories" + ] + }, + "closed_umbrella": { + "unicode": "1f302", + "unicode_alternates": "", + "name": "closed umbrella", + "shortname": ":closed_umbrella:", + "category": "people", + "emoji_order": "204", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "sky", + "rain", + "accessories" + ] + }, + "dog": { + "unicode": "1f436", + "unicode_alternates": "", + "name": "dog face", + "shortname": ":dog:", + "category": "nature", + "emoji_order": "205", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "dog", + "dog", + "pug", + "pug", + "animal", + "animal" + ] + }, + "cat": { + "unicode": "1f431", + "unicode_alternates": "", + "name": "cat face", + "shortname": ":cat:", + "category": "nature", + "emoji_order": "206", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "halloween", + "vagina", + "cat", + "cat", + "animal", + "animal" + ] + }, + "mouse": { + "unicode": "1f42d", + "unicode_alternates": "", + "name": "mouse face", + "shortname": ":mouse:", + "category": "nature", + "emoji_order": "207", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "hamster": { + "unicode": "1f439", + "unicode_alternates": "", + "name": "hamster face", + "shortname": ":hamster:", + "category": "nature", + "emoji_order": "208", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "rabbit": { + "unicode": "1f430", + "unicode_alternates": "", + "name": "rabbit face", + "shortname": ":rabbit:", + "category": "nature", + "emoji_order": "209", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "bear": { + "unicode": "1f43b", + "unicode_alternates": "", + "name": "bear face", + "shortname": ":bear:", + "category": "nature", + "emoji_order": "210", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "roar", + "animal", + "animal" + ] + }, + "panda_face": { + "unicode": "1f43c", + "unicode_alternates": "", + "name": "panda face", + "shortname": ":panda_face:", + "category": "nature", + "emoji_order": "211", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "roar", + "animal", + "animal" + ] + }, + "koala": { + "unicode": "1f428", + "unicode_alternates": "", + "name": "koala", + "shortname": ":koala:", + "category": "nature", + "emoji_order": "212", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "tiger": { + "unicode": "1f42f", + "unicode_alternates": "", + "name": "tiger face", + "shortname": ":tiger:", + "category": "nature", + "emoji_order": "213", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "roar", + "cat", + "cat", + "animal", + "animal" + ] + }, + "lion_face": { + "unicode": "1f981", + "unicode_alternates": "", + "name": "lion face", + "shortname": ":lion_face:", + "category": "nature", + "emoji_order": "214", + "aliases": [ + ":lion:" + ], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "roar", + "cat", + "cat", + "animal", + "animal" + ] + }, + "cow": { + "unicode": "1f42e", + "unicode_alternates": "", + "name": "cow face", + "shortname": ":cow:", + "category": "nature", + "emoji_order": "215", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "pig": { + "unicode": "1f437", + "unicode_alternates": "", + "name": "pig face", + "shortname": ":pig:", + "category": "nature", + "emoji_order": "216", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "pig_nose": { + "unicode": "1f43d", + "unicode_alternates": "", + "name": "pig nose", + "shortname": ":pig_nose:", + "category": "nature", + "emoji_order": "217", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "frog": { + "unicode": "1f438", + "unicode_alternates": "", + "name": "frog face", + "shortname": ":frog:", + "category": "nature", + "emoji_order": "218", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "octopus": { + "unicode": "1f419", + "unicode_alternates": "", + "name": "octopus", + "shortname": ":octopus:", + "category": "nature", + "emoji_order": "219", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "monkey_face": { + "unicode": "1f435", + "unicode_alternates": "", + "name": "monkey face", + "shortname": ":monkey_face:", + "category": "nature", + "emoji_order": "220", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "see_no_evil": { + "unicode": "1f648", + "unicode_alternates": "", + "name": "see-no-evil monkey", + "shortname": ":see_no_evil:", + "category": "nature", + "emoji_order": "221", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "hear_no_evil": { + "unicode": "1f649", + "unicode_alternates": "", + "name": "hear-no-evil monkey", + "shortname": ":hear_no_evil:", + "category": "nature", + "emoji_order": "222", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "speak_no_evil": { + "unicode": "1f64a", + "unicode_alternates": "", + "name": "speak-no-evil monkey", + "shortname": ":speak_no_evil:", + "category": "nature", + "emoji_order": "223", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "monkey": { + "unicode": "1f412", + "unicode_alternates": "", + "name": "monkey", + "shortname": ":monkey:", + "category": "nature", + "emoji_order": "224", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "chicken": { + "unicode": "1f414", + "unicode_alternates": "", + "name": "chicken", + "shortname": ":chicken:", + "category": "nature", + "emoji_order": "225", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal", + "chicken", + "chicken" + ] + }, + "penguin": { + "unicode": "1f427", + "unicode_alternates": "", + "name": "penguin", + "shortname": ":penguin:", + "category": "nature", + "emoji_order": "226", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "bird": { + "unicode": "1f426", + "unicode_alternates": "", + "name": "bird", + "shortname": ":bird:", + "category": "nature", + "emoji_order": "227", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "baby_chick": { + "unicode": "1f424", + "unicode_alternates": "", + "name": "baby chick", + "shortname": ":baby_chick:", + "category": "nature", + "emoji_order": "228", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal", + "chicken", + "chicken" + ] + }, + "hatching_chick": { + "unicode": "1f423", + "unicode_alternates": "", + "name": "hatching chick", + "shortname": ":hatching_chick:", + "category": "nature", + "emoji_order": "229", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal", + "chicken", + "chicken" + ] + }, + "hatched_chick": { + "unicode": "1f425", + "unicode_alternates": "", + "name": "front-facing baby chick", + "shortname": ":hatched_chick:", + "category": "nature", + "emoji_order": "230", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal", + "chicken", + "chicken" + ] + }, + "wolf": { + "unicode": "1f43a", + "unicode_alternates": "", + "name": "wolf face", + "shortname": ":wolf:", + "category": "nature", + "emoji_order": "231", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "roar", + "animal", + "animal" + ] + }, + "boar": { + "unicode": "1f417", + "unicode_alternates": "", + "name": "boar", + "shortname": ":boar:", + "category": "nature", + "emoji_order": "232", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "horse": { + "unicode": "1f434", + "unicode_alternates": "", + "name": "horse face", + "shortname": ":horse:", + "category": "nature", + "emoji_order": "233", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "unicorn": { + "unicode": "1f984", + "unicode_alternates": "", + "name": "unicorn face", + "shortname": ":unicorn:", + "category": "nature", + "emoji_order": "234", + "aliases": [ + ":unicorn_face:" + ], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "bee": { + "unicode": "1f41d", + "unicode_alternates": "", + "name": "honeybee", + "shortname": ":bee:", + "category": "nature", + "emoji_order": "235", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "insects", + "animal", + "animal" + ] + }, + "bug": { + "unicode": "1f41b", + "unicode_alternates": "", + "name": "bug", + "shortname": ":bug:", + "category": "nature", + "emoji_order": "236", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "insects", + "animal", + "animal" + ] + }, + "snail": { + "unicode": "1f40c", + "unicode_alternates": "", + "name": "snail", + "shortname": ":snail:", + "category": "nature", + "emoji_order": "237", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "insects", + "animal", + "animal" + ] + }, + "beetle": { + "unicode": "1f41e", + "unicode_alternates": "", + "name": "lady beetle", + "shortname": ":beetle:", + "category": "nature", + "emoji_order": "238", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "insects", + "animal", + "animal" + ] + }, + "ant": { + "unicode": "1f41c", + "unicode_alternates": "", + "name": "ant", + "shortname": ":ant:", + "category": "nature", + "emoji_order": "239", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "insects", + "animal", + "animal" + ] + }, + "spider": { + "unicode": "1f577", + "unicode_alternates": "1f577-fe0f", + "name": "spider", + "shortname": ":spider:", + "category": "nature", + "emoji_order": "240", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "insects", + "halloween", + "animal", + "animal" + ] + }, + "scorpion": { + "unicode": "1f982", + "unicode_alternates": "", + "name": "scorpion", + "shortname": ":scorpion:", + "category": "nature", + "emoji_order": "241", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "insects", + "reptile", + "reptile", + "animal", + "animal" + ] + }, + "crab": { + "unicode": "1f980", + "unicode_alternates": "", + "name": "crab", + "shortname": ":crab:", + "category": "nature", + "emoji_order": "242", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "tropical", + "animal", + "animal" + ] + }, + "snake": { + "unicode": "1f40d", + "unicode_alternates": "", + "name": "snake", + "shortname": ":snake:", + "category": "nature", + "emoji_order": "243", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "reptile", + "reptile", + "animal", + "animal", + "creationism", + "creationism" + ] + }, + "turtle": { + "unicode": "1f422", + "unicode_alternates": "", + "name": "turtle", + "shortname": ":turtle:", + "category": "nature", + "emoji_order": "244", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "reptile", + "reptile", + "animal", + "animal" + ] + }, + "tropical_fish": { + "unicode": "1f420", + "unicode_alternates": "", + "name": "tropical fish", + "shortname": ":tropical_fish:", + "category": "nature", + "emoji_order": "245", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "fish": { + "unicode": "1f41f", + "unicode_alternates": "", + "name": "fish", + "shortname": ":fish:", + "category": "nature", + "emoji_order": "246", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "blowfish": { + "unicode": "1f421", + "unicode_alternates": "", + "name": "blowfish", + "shortname": ":blowfish:", + "category": "nature", + "emoji_order": "247", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "dolphin": { + "unicode": "1f42c", + "unicode_alternates": "", + "name": "dolphin", + "shortname": ":dolphin:", + "category": "nature", + "emoji_order": "248", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "tropical", + "animal", + "animal" + ] + }, + "whale": { + "unicode": "1f433", + "unicode_alternates": "", + "name": "spouting whale", + "shortname": ":whale:", + "category": "nature", + "emoji_order": "249", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "tropical", + "whales", + "whales", + "animal", + "animal" + ] + }, + "whale2": { + "unicode": "1f40b", + "unicode_alternates": "", + "name": "whale", + "shortname": ":whale2:", + "category": "nature", + "emoji_order": "250", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "tropical", + "whales", + "whales", + "animal", + "animal" + ] + }, + "crocodile": { + "unicode": "1f40a", + "unicode_alternates": "", + "name": "crocodile", + "shortname": ":crocodile:", + "category": "nature", + "emoji_order": "251", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "reptile", + "reptile", + "animal", + "animal" + ] + }, + "leopard": { + "unicode": "1f406", + "unicode_alternates": "", + "name": "leopard", + "shortname": ":leopard:", + "category": "nature", + "emoji_order": "252", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "roar", + "animal", + "animal" + ] + }, + "tiger2": { + "unicode": "1f405", + "unicode_alternates": "", + "name": "tiger", + "shortname": ":tiger2:", + "category": "nature", + "emoji_order": "253", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "roar", + "animal", + "animal" + ] + }, + "water_buffalo": { + "unicode": "1f403", + "unicode_alternates": "", + "name": "water buffalo", + "shortname": ":water_buffalo:", + "category": "nature", + "emoji_order": "254", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "ox": { + "unicode": "1f402", + "unicode_alternates": "", + "name": "ox", + "shortname": ":ox:", + "category": "nature", + "emoji_order": "255", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "cow2": { + "unicode": "1f404", + "unicode_alternates": "", + "name": "cow", + "shortname": ":cow2:", + "category": "nature", + "emoji_order": "256", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "dromedary_camel": { + "unicode": "1f42a", + "unicode_alternates": "", + "name": "dromedary camel", + "shortname": ":dromedary_camel:", + "category": "nature", + "emoji_order": "257", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "camel": { + "unicode": "1f42b", + "unicode_alternates": "", + "name": "bactrian camel", + "shortname": ":camel:", + "category": "nature", + "emoji_order": "258", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal", + "hump day", + "hump day" + ] + }, + "elephant": { + "unicode": "1f418", + "unicode_alternates": "", + "name": "elephant", + "shortname": ":elephant:", + "category": "nature", + "emoji_order": "259", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "goat": { + "unicode": "1f410", + "unicode_alternates": "", + "name": "goat", + "shortname": ":goat:", + "category": "nature", + "emoji_order": "260", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "ram": { + "unicode": "1f40f", + "unicode_alternates": "", + "name": "ram", + "shortname": ":ram:", + "category": "nature", + "emoji_order": "261", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "sheep": { + "unicode": "1f411", + "unicode_alternates": "", + "name": "sheep", + "shortname": ":sheep:", + "category": "nature", + "emoji_order": "262", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "racehorse": { + "unicode": "1f40e", + "unicode_alternates": "", + "name": "horse", + "shortname": ":racehorse:", + "category": "nature", + "emoji_order": "263", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "pig2": { + "unicode": "1f416", + "unicode_alternates": "", + "name": "pig", + "shortname": ":pig2:", + "category": "nature", + "emoji_order": "264", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "rat": { + "unicode": "1f400", + "unicode_alternates": "", + "name": "rat", + "shortname": ":rat:", + "category": "nature", + "emoji_order": "265", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "mouse2": { + "unicode": "1f401", + "unicode_alternates": "", + "name": "mouse", + "shortname": ":mouse2:", + "category": "nature", + "emoji_order": "266", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "rooster": { + "unicode": "1f413", + "unicode_alternates": "", + "name": "rooster", + "shortname": ":rooster:", + "category": "nature", + "emoji_order": "267", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "turkey": { + "unicode": "1f983", + "unicode_alternates": "", + "name": "turkey", + "shortname": ":turkey:", + "category": "nature", + "emoji_order": "268", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "dove": { + "unicode": "1f54a", + "unicode_alternates": "1f54a-fe0f", + "name": "dove of peace", + "shortname": ":dove:", + "category": "nature", + "emoji_order": "269", + "aliases": [ + ":dove_of_peace:" + ], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "dog2": { + "unicode": "1f415", + "unicode_alternates": "", + "name": "dog", + "shortname": ":dog2:", + "category": "nature", + "emoji_order": "270", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "dog", + "dog", + "pug", + "pug", + "animal", + "animal" + ] + }, + "poodle": { + "unicode": "1f429", + "unicode_alternates": "", + "name": "poodle", + "shortname": ":poodle:", + "category": "nature", + "emoji_order": "271", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "dog", + "dog", + "animal", + "animal" + ] + }, + "cat2": { + "unicode": "1f408", + "unicode_alternates": "", + "name": "cat", + "shortname": ":cat2:", + "category": "nature", + "emoji_order": "272", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "halloween", + "cat", + "cat", + "animal", + "animal" + ] + }, + "rabbit2": { + "unicode": "1f407", + "unicode_alternates": "", + "name": "rabbit", + "shortname": ":rabbit2:", + "category": "nature", + "emoji_order": "273", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "chipmunk": { + "unicode": "1f43f", + "unicode_alternates": "1f43f-fe0f", + "name": "chipmunk", + "shortname": ":chipmunk:", + "category": "nature", + "emoji_order": "274", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "wildlife", + "animal", + "animal" + ] + }, + "feet": { + "unicode": "1f43e", + "unicode_alternates": "", + "name": "paw prints", + "shortname": ":feet:", + "category": "nature", + "emoji_order": "275", + "aliases": [ + ":paw_prints:" + ], + "aliases_ascii": [], + "keywords": [ + "animal", + "animal" + ] + }, + "dragon": { + "unicode": "1f409", + "unicode_alternates": "", + "name": "dragon", + "shortname": ":dragon:", + "category": "nature", + "emoji_order": "276", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "roar", + "reptile", + "reptile", + "animal", + "animal" + ] + }, + "dragon_face": { + "unicode": "1f432", + "unicode_alternates": "", + "name": "dragon face", + "shortname": ":dragon_face:", + "category": "nature", + "emoji_order": "277", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "roar", + "monster", + "reptile", + "reptile", + "animal", + "animal" + ] + }, + "cactus": { + "unicode": "1f335", + "unicode_alternates": "", + "name": "cactus", + "shortname": ":cactus:", + "category": "nature", + "emoji_order": "278", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "plant", + "trees", + "trees" + ] + }, + "christmas_tree": { + "unicode": "1f384", + "unicode_alternates": "", + "name": "christmas tree", + "shortname": ":christmas_tree:", + "category": "nature", + "emoji_order": "279", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "plant", + "holidays", + "christmas", + "trees", + "trees" + ] + }, + "evergreen_tree": { + "unicode": "1f332", + "unicode_alternates": "", + "name": "evergreen tree", + "shortname": ":evergreen_tree:", + "category": "nature", + "emoji_order": "280", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "plant", + "holidays", + "christmas", + "camp", + "trees", + "trees" + ] + }, + "deciduous_tree": { + "unicode": "1f333", + "unicode_alternates": "", + "name": "deciduous tree", + "shortname": ":deciduous_tree:", + "category": "nature", + "emoji_order": "281", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "plant", + "camp", + "trees", + "trees" + ] + }, + "palm_tree": { + "unicode": "1f334", + "unicode_alternates": "", + "name": "palm tree", + "shortname": ":palm_tree:", + "category": "nature", + "emoji_order": "282", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "plant", + "tropical", + "trees", + "trees" + ] + }, + "seedling": { + "unicode": "1f331", + "unicode_alternates": "", + "name": "seedling", + "shortname": ":seedling:", + "category": "nature", + "emoji_order": "283", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "plant", + "leaf", + "leaf" + ] + }, + "herb": { + "unicode": "1f33f", + "unicode_alternates": "", + "name": "herb", + "shortname": ":herb:", + "category": "nature", + "emoji_order": "284", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "plant", + "leaf", + "leaf" + ] + }, + "shamrock": { + "unicode": "2618", + "unicode_alternates": "2618-fe0f", + "name": "shamrock", + "shortname": ":shamrock:", + "category": "nature", + "emoji_order": "285", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "plant", + "luck", + "leaf", + "leaf" + ] + }, + "four_leaf_clover": { + "unicode": "1f340", + "unicode_alternates": "", + "name": "four leaf clover", + "shortname": ":four_leaf_clover:", + "category": "nature", + "emoji_order": "286", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "plant", + "luck", + "leaf", + "leaf", + "sol", + "sol" + ] + }, + "bamboo": { + "unicode": "1f38d", + "unicode_alternates": "", + "name": "pine decoration", + "shortname": ":bamboo:", + "category": "nature", + "emoji_order": "287", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "plant" + ] + }, + "tanabata_tree": { + "unicode": "1f38b", + "unicode_alternates": "", + "name": "tanabata tree", + "shortname": ":tanabata_tree:", + "category": "nature", + "emoji_order": "288", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "plant", + "trees", + "trees" + ] + }, + "leaves": { + "unicode": "1f343", + "unicode_alternates": "", + "name": "leaf fluttering in wind", + "shortname": ":leaves:", + "category": "nature", + "emoji_order": "289", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "plant", + "leaf", + "leaf" + ] + }, + "fallen_leaf": { + "unicode": "1f342", + "unicode_alternates": "", + "name": "fallen leaf", + "shortname": ":fallen_leaf:", + "category": "nature", + "emoji_order": "290", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "plant", + "leaf", + "leaf" + ] + }, + "maple_leaf": { + "unicode": "1f341", + "unicode_alternates": "", + "name": "maple leaf", + "shortname": ":maple_leaf:", + "category": "nature", + "emoji_order": "291", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "plant", + "leaf", + "leaf" + ] + }, + "ear_of_rice": { + "unicode": "1f33e", + "unicode_alternates": "", + "name": "ear of rice", + "shortname": ":ear_of_rice:", + "category": "nature", + "emoji_order": "292", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "plant", + "leaf", + "leaf" + ] + }, + "hibiscus": { + "unicode": "1f33a", + "unicode_alternates": "", + "name": "hibiscus", + "shortname": ":hibiscus:", + "category": "nature", + "emoji_order": "293", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "flower", + "plant", + "tropical" + ] + }, + "sunflower": { + "unicode": "1f33b", + "unicode_alternates": "", + "name": "sunflower", + "shortname": ":sunflower:", + "category": "nature", + "emoji_order": "294", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "flower", + "plant" + ] + }, + "rose": { + "unicode": "1f339", + "unicode_alternates": "", + "name": "rose", + "shortname": ":rose:", + "category": "nature", + "emoji_order": "295", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "flower", + "plant", + "rip", + "rip", + "condolence", + "condolence", + "beautiful", + "beautiful" + ] + }, + "tulip": { + "unicode": "1f337", + "unicode_alternates": "", + "name": "tulip", + "shortname": ":tulip:", + "category": "nature", + "emoji_order": "296", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "flower", + "plant", + "vagina", + "girls night", + "girls night" + ] + }, + "blossom": { + "unicode": "1f33c", + "unicode_alternates": "", + "name": "blossom", + "shortname": ":blossom:", + "category": "nature", + "emoji_order": "297", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "flower", + "plant" + ] + }, + "cherry_blossom": { + "unicode": "1f338", + "unicode_alternates": "", + "name": "cherry blossom", + "shortname": ":cherry_blossom:", + "category": "nature", + "emoji_order": "298", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "flower", + "plant", + "tropical" + ] + }, + "bouquet": { + "unicode": "1f490", + "unicode_alternates": "", + "name": "bouquet", + "shortname": ":bouquet:", + "category": "nature", + "emoji_order": "299", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "flower", + "plant", + "rip", + "rip", + "condolence", + "condolence" + ] + }, + "mushroom": { + "unicode": "1f344", + "unicode_alternates": "", + "name": "mushroom", + "shortname": ":mushroom:", + "category": "nature", + "emoji_order": "300", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "plant", + "drugs", + "drugs" + ] + }, + "chestnut": { + "unicode": "1f330", + "unicode_alternates": "", + "name": "chestnut", + "shortname": ":chestnut:", + "category": "nature", + "emoji_order": "301", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "nature", + "plant" + ] + }, + "jack_o_lantern": { + "unicode": "1f383", + "unicode_alternates": "", + "name": "jack-o-lantern", + "shortname": ":jack_o_lantern:", + "category": "nature", + "emoji_order": "302", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "holidays", + "halloween" + ] + }, + "shell": { + "unicode": "1f41a", + "unicode_alternates": "", + "name": "spiral shell", + "shortname": ":shell:", + "category": "nature", + "emoji_order": "303", + "aliases": [], + "aliases_ascii": [], + "keywords": [] + }, + "spider_web": { + "unicode": "1f578", + "unicode_alternates": "1f578-fe0f", + "name": "spider web", + "shortname": ":spider_web:", + "category": "nature", + "emoji_order": "304", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "halloween" + ] + }, + "earth_americas": { + "unicode": "1f30e", + "unicode_alternates": "", + "name": "earth globe americas", + "shortname": ":earth_americas:", + "category": "nature", + "emoji_order": "305", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "map", + "vacation", + "globe", + "globe" + ] + }, + "earth_africa": { + "unicode": "1f30d", + "unicode_alternates": "", + "name": "earth globe europe-africa", + "shortname": ":earth_africa:", + "category": "nature", + "emoji_order": "306", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "map", + "vacation", + "globe", + "globe" + ] + }, + "earth_asia": { + "unicode": "1f30f", + "unicode_alternates": "", + "name": "earth globe asia-australia", + "shortname": ":earth_asia:", + "category": "nature", + "emoji_order": "307", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "map", + "vacation", + "globe", + "globe" + ] + }, + "full_moon": { + "unicode": "1f315", + "unicode_alternates": "", + "name": "full moon symbol", + "shortname": ":full_moon:", + "category": "nature", + "emoji_order": "308", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space", + "sky", + "moon", + "moon" + ] + }, + "waning_gibbous_moon": { + "unicode": "1f316", + "unicode_alternates": "", + "name": "waning gibbous moon symbol", + "shortname": ":waning_gibbous_moon:", + "category": "nature", + "emoji_order": "309", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space", + "sky", + "moon", + "moon" + ] + }, + "last_quarter_moon": { + "unicode": "1f317", + "unicode_alternates": "", + "name": "last quarter moon symbol", + "shortname": ":last_quarter_moon:", + "category": "nature", + "emoji_order": "310", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space", + "sky", + "moon", + "moon" + ] + }, + "waning_crescent_moon": { + "unicode": "1f318", + "unicode_alternates": "", + "name": "waning crescent moon symbol", + "shortname": ":waning_crescent_moon:", + "category": "nature", + "emoji_order": "311", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space", + "sky", + "moon", + "moon" + ] + }, + "new_moon": { + "unicode": "1f311", + "unicode_alternates": "", + "name": "new moon symbol", + "shortname": ":new_moon:", + "category": "nature", + "emoji_order": "312", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space", + "sky", + "moon", + "moon" + ] + }, + "waxing_crescent_moon": { + "unicode": "1f312", + "unicode_alternates": "", + "name": "waxing crescent moon symbol", + "shortname": ":waxing_crescent_moon:", + "category": "nature", + "emoji_order": "313", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space", + "sky", + "moon", + "moon" + ] + }, + "first_quarter_moon": { + "unicode": "1f313", + "unicode_alternates": "", + "name": "first quarter moon symbol", + "shortname": ":first_quarter_moon:", + "category": "nature", + "emoji_order": "314", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space", + "sky", + "moon", + "moon" + ] + }, + "waxing_gibbous_moon": { + "unicode": "1f314", + "unicode_alternates": "", + "name": "waxing gibbous moon symbol", + "shortname": ":waxing_gibbous_moon:", + "category": "nature", + "emoji_order": "315", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space", + "sky", + "moon", + "moon" + ] + }, + "new_moon_with_face": { + "unicode": "1f31a", + "unicode_alternates": "", + "name": "new moon with face", + "shortname": ":new_moon_with_face:", + "category": "nature", + "emoji_order": "316", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space", + "sky", + "goodnight", + "goodnight", + "moon", + "moon" + ] + }, + "full_moon_with_face": { + "unicode": "1f31d", + "unicode_alternates": "", + "name": "full moon with face", + "shortname": ":full_moon_with_face:", + "category": "nature", + "emoji_order": "317", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space", + "sky", + "goodnight", + "goodnight", + "moon", + "moon" + ] + }, + "first_quarter_moon_with_face": { + "unicode": "1f31b", + "unicode_alternates": "", + "name": "first quarter moon with face", + "shortname": ":first_quarter_moon_with_face:", + "category": "nature", + "emoji_order": "318", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space", + "sky", + "moon", + "moon" + ] + }, + "last_quarter_moon_with_face": { + "unicode": "1f31c", + "unicode_alternates": "", + "name": "last quarter moon with face", + "shortname": ":last_quarter_moon_with_face:", + "category": "nature", + "emoji_order": "319", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space", + "sky", + "moon", + "moon" + ] + }, + "sun_with_face": { + "unicode": "1f31e", + "unicode_alternates": "", + "name": "sun with face", + "shortname": ":sun_with_face:", + "category": "nature", + "emoji_order": "320", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "sky", + "day", + "sun", + "hump day", + "hump day", + "morning", + "morning" + ] + }, + "crescent_moon": { + "unicode": "1f319", + "unicode_alternates": "", + "name": "crescent moon", + "shortname": ":crescent_moon:", + "category": "nature", + "emoji_order": "321", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space", + "sky", + "goodnight", + "goodnight", + "moon", + "moon" + ] + }, + "star": { + "unicode": "2b50", + "unicode_alternates": "2b50-fe0f", + "name": "white medium star", + "shortname": ":star:", + "category": "nature", + "emoji_order": "322", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space", + "sky", + "star" + ] + }, + "star2": { + "unicode": "1f31f", + "unicode_alternates": "", + "name": "glowing star", + "shortname": ":star2:", + "category": "nature", + "emoji_order": "323", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space", + "sky", + "star" + ] + }, + "dizzy": { + "unicode": "1f4ab", + "unicode_alternates": "", + "name": "dizzy symbol", + "shortname": ":dizzy:", + "category": "nature", + "emoji_order": "324", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "star", + "symbol" + ] + }, + "sparkles": { + "unicode": "2728", + "unicode_alternates": "", + "name": "sparkles", + "shortname": ":sparkles:", + "category": "nature", + "emoji_order": "325", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "star", + "girls night", + "girls night" + ] + }, + "comet": { + "unicode": "2604", + "unicode_alternates": "2604-fe0f", + "name": "comet", + "shortname": ":comet:", + "category": "nature", + "emoji_order": "326", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space", + "sky" + ] + }, + "sunny": { + "unicode": "2600", + "unicode_alternates": "2600-fe0f", + "name": "black sun with rays", + "shortname": ":sunny:", + "category": "nature", + "emoji_order": "327", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "weather", + "sky", + "day", + "sun", + "hot", + "hot", + "morning", + "morning" + ] + }, + "white_sun_small_cloud": { + "unicode": "1f324", + "unicode_alternates": "1f324-fe0f", + "name": "white sun with small cloud", + "shortname": ":white_sun_small_cloud:", + "category": "nature", + "emoji_order": "328", + "aliases": [ + ":white_sun_with_small_cloud:" + ], + "aliases_ascii": [], + "keywords": [ + "weather", + "sky", + "cloud", + "sun" + ] + }, + "partly_sunny": { + "unicode": "26c5", + "unicode_alternates": "26c5-fe0f", + "name": "sun behind cloud", + "shortname": ":partly_sunny:", + "category": "nature", + "emoji_order": "329", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "weather", + "sky", + "cloud", + "sun" + ] + }, + "white_sun_cloud": { + "unicode": "1f325", + "unicode_alternates": "1f325-fe0f", + "name": "white sun behind cloud", + "shortname": ":white_sun_cloud:", + "category": "nature", + "emoji_order": "330", + "aliases": [ + ":white_sun_behind_cloud:" + ], + "aliases_ascii": [], + "keywords": [ + "weather", + "sky", + "cloud", + "cold", + "sun" + ] + }, + "white_sun_rain_cloud": { + "unicode": "1f326", + "unicode_alternates": "1f326-fe0f", + "name": "white sun behind cloud with rain", + "shortname": ":white_sun_rain_cloud:", + "category": "nature", + "emoji_order": "331", + "aliases": [ + ":white_sun_behind_cloud_with_rain:" + ], + "aliases_ascii": [], + "keywords": [ + "weather", + "sky", + "cloud", + "cold", + "rain", + "sun" + ] + }, + "cloud": { + "unicode": "2601", + "unicode_alternates": "2601-fe0f", + "name": "cloud", + "shortname": ":cloud:", + "category": "nature", + "emoji_order": "332", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "weather", + "sky", + "cloud", + "cold", + "rain" + ] + }, + "cloud_rain": { + "unicode": "1f327", + "unicode_alternates": "1f327-fe0f", + "name": "cloud with rain", + "shortname": ":cloud_rain:", + "category": "nature", + "emoji_order": "333", + "aliases": [ + ":cloud_with_rain:" + ], + "aliases_ascii": [], + "keywords": [ + "weather", + "winter", + "sky", + "cloud", + "cold", + "rain" + ] + }, + "thunder_cloud_rain": { + "unicode": "26c8", + "unicode_alternates": "26c8-fe0f", + "name": "thunder cloud and rain", + "shortname": ":thunder_cloud_rain:", + "category": "nature", + "emoji_order": "334", + "aliases": [ + ":thunder_cloud_and_rain:" + ], + "aliases_ascii": [], + "keywords": [ + "weather", + "sky", + "cloud", + "cold", + "rain" + ] + }, + "cloud_lightning": { + "unicode": "1f329", + "unicode_alternates": "1f329-fe0f", + "name": "cloud with lightning", + "shortname": ":cloud_lightning:", + "category": "nature", + "emoji_order": "335", + "aliases": [ + ":cloud_with_lightning:" + ], + "aliases_ascii": [], + "keywords": [ + "weather", + "sky", + "cloud", + "cold", + "rain" + ] + }, + "zap": { + "unicode": "26a1", + "unicode_alternates": "26a1-fe0f", + "name": "high voltage sign", + "shortname": ":zap:", + "category": "nature", + "emoji_order": "336", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "weather", + "sky", + "diarrhea", + "diarrhea" + ] + }, + "fire": { + "unicode": "1f525", + "unicode_alternates": "", + "name": "fire", + "shortname": ":fire:", + "category": "nature", + "emoji_order": "337", + "aliases": [ + ":flame:" + ], + "aliases_ascii": [], + "keywords": [ + "wth", + "wth", + "hot", + "hot" + ] + }, + "boom": { + "unicode": "1f4a5", + "unicode_alternates": "", + "name": "collision symbol", + "shortname": ":boom:", + "category": "nature", + "emoji_order": "338", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "symbol", + "blast", + "blast" + ] + }, + "snowflake": { + "unicode": "2744", + "unicode_alternates": "2744-fe0f", + "name": "snowflake", + "shortname": ":snowflake:", + "category": "nature", + "emoji_order": "339", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "weather", + "winter", + "sky", + "holidays", + "cold", + "snow", + "snow" + ] + }, + "cloud_snow": { + "unicode": "1f328", + "unicode_alternates": "1f328-fe0f", + "name": "cloud with snow", + "shortname": ":cloud_snow:", + "category": "nature", + "emoji_order": "340", + "aliases": [ + ":cloud_with_snow:" + ], + "aliases_ascii": [], + "keywords": [ + "weather", + "winter", + "sky", + "cloud", + "cold", + "snow", + "snow" + ] + }, + "snowman2": { + "unicode": "2603", + "unicode_alternates": "2603-fe0f", + "name": "snowman", + "shortname": ":snowman2:", + "category": "nature", + "emoji_order": "341", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "weather", + "winter", + "holidays", + "christmas", + "cold", + "snow", + "snow" + ] + }, + "snowman": { + "unicode": "26c4", + "unicode_alternates": "26c4-fe0f", + "name": "snowman without snow", + "shortname": ":snowman:", + "category": "nature", + "emoji_order": "342", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "weather", + "winter", + "holidays", + "cold", + "snow", + "snow" + ] + }, + "wind_blowing_face": { + "unicode": "1f32c", + "unicode_alternates": "1f32c-fe0f", + "name": "wind blowing face", + "shortname": ":wind_blowing_face:", + "category": "nature", + "emoji_order": "343", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "weather", + "cold" + ] + }, + "dash": { + "unicode": "1f4a8", + "unicode_alternates": "", + "name": "dash symbol", + "shortname": ":dash:", + "category": "nature", + "emoji_order": "344", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "cloud", + "cold", + "smoking", + "smoking" + ] + }, + "cloud_tornado": { + "unicode": "1f32a", + "unicode_alternates": "1f32a-fe0f", + "name": "cloud with tornado", + "shortname": ":cloud_tornado:", + "category": "nature", + "emoji_order": "345", + "aliases": [ + ":cloud_with_tornado:" + ], + "aliases_ascii": [], + "keywords": [ + "weather", + "sky", + "cold" + ] + }, + "fog": { + "unicode": "1f32b", + "unicode_alternates": "1f32b-fe0f", + "name": "fog", + "shortname": ":fog:", + "category": "nature", + "emoji_order": "346", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "weather", + "sky", + "cold" + ] + }, + "umbrella2": { + "unicode": "2602", + "unicode_alternates": "2602-fe0f", + "name": "umbrella", + "shortname": ":umbrella2:", + "category": "nature", + "emoji_order": "347", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "weather", + "object", + "sky", + "cold" + ] + }, + "umbrella": { + "unicode": "2614", + "unicode_alternates": "2614-fe0f", + "name": "umbrella with rain drops", + "shortname": ":umbrella:", + "category": "nature", + "emoji_order": "348", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "weather", + "sky", + "cold", + "rain" + ] + }, + "droplet": { + "unicode": "1f4a7", + "unicode_alternates": "", + "name": "droplet", + "shortname": ":droplet:", + "category": "nature", + "emoji_order": "349", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "weather", + "sky", + "rain" + ] + }, + "sweat_drops": { + "unicode": "1f4a6", + "unicode_alternates": "", + "name": "splashing sweat symbol", + "shortname": ":sweat_drops:", + "category": "nature", + "emoji_order": "350", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "rain", + "stressed", + "sweat" + ] + }, + "ocean": { + "unicode": "1f30a", + "unicode_alternates": "", + "name": "water wave", + "shortname": ":ocean:", + "category": "nature", + "emoji_order": "351", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "weather", + "boat", + "tropical", + "swim" + ] + }, + "green_apple": { + "unicode": "1f34f", + "unicode_alternates": "", + "name": "green apple", + "shortname": ":green_apple:", + "category": "food", + "emoji_order": "352", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fruit", + "food" + ] + }, + "apple": { + "unicode": "1f34e", + "unicode_alternates": "", + "name": "red apple", + "shortname": ":apple:", + "category": "food", + "emoji_order": "353", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fruit", + "food", + "creationism", + "creationism" + ] + }, + "pear": { + "unicode": "1f350", + "unicode_alternates": "", + "name": "pear", + "shortname": ":pear:", + "category": "food", + "emoji_order": "354", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fruit", + "food" + ] + }, + "tangerine": { + "unicode": "1f34a", + "unicode_alternates": "", + "name": "tangerine", + "shortname": ":tangerine:", + "category": "food", + "emoji_order": "355", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fruit", + "food" + ] + }, + "lemon": { + "unicode": "1f34b", + "unicode_alternates": "", + "name": "lemon", + "shortname": ":lemon:", + "category": "food", + "emoji_order": "356", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fruit", + "food" + ] + }, + "banana": { + "unicode": "1f34c", + "unicode_alternates": "", + "name": "banana", + "shortname": ":banana:", + "category": "food", + "emoji_order": "357", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fruit", + "penis", + "food" + ] + }, + "watermelon": { + "unicode": "1f349", + "unicode_alternates": "", + "name": "watermelon", + "shortname": ":watermelon:", + "category": "food", + "emoji_order": "358", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fruit", + "food" + ] + }, + "grapes": { + "unicode": "1f347", + "unicode_alternates": "", + "name": "grapes", + "shortname": ":grapes:", + "category": "food", + "emoji_order": "359", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fruit", + "food" + ] + }, + "strawberry": { + "unicode": "1f353", + "unicode_alternates": "", + "name": "strawberry", + "shortname": ":strawberry:", + "category": "food", + "emoji_order": "360", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fruit", + "food" + ] + }, + "melon": { + "unicode": "1f348", + "unicode_alternates": "", + "name": "melon", + "shortname": ":melon:", + "category": "food", + "emoji_order": "361", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fruit", + "boobs", + "food" + ] + }, + "cherries": { + "unicode": "1f352", + "unicode_alternates": "", + "name": "cherries", + "shortname": ":cherries:", + "category": "food", + "emoji_order": "362", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fruit", + "food" + ] + }, + "peach": { + "unicode": "1f351", + "unicode_alternates": "", + "name": "peach", + "shortname": ":peach:", + "category": "food", + "emoji_order": "363", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fruit", + "butt", + "food" + ] + }, + "pineapple": { + "unicode": "1f34d", + "unicode_alternates": "", + "name": "pineapple", + "shortname": ":pineapple:", + "category": "food", + "emoji_order": "364", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fruit", + "food", + "tropical" + ] + }, + "tomato": { + "unicode": "1f345", + "unicode_alternates": "", + "name": "tomato", + "shortname": ":tomato:", + "category": "food", + "emoji_order": "365", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fruit", + "vegetables", + "food" + ] + }, + "eggplant": { + "unicode": "1f346", + "unicode_alternates": "", + "name": "aubergine", + "shortname": ":eggplant:", + "category": "food", + "emoji_order": "366", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "vegetables", + "penis", + "food" + ] + }, + "hot_pepper": { + "unicode": "1f336", + "unicode_alternates": "1f336-fe0f", + "name": "hot pepper", + "shortname": ":hot_pepper:", + "category": "food", + "emoji_order": "367", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "vegetables", + "food" + ] + }, + "corn": { + "unicode": "1f33d", + "unicode_alternates": "", + "name": "ear of maize", + "shortname": ":corn:", + "category": "food", + "emoji_order": "368", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "vegetables", + "food" + ] + }, + "sweet_potato": { + "unicode": "1f360", + "unicode_alternates": "", + "name": "roasted sweet potato", + "shortname": ":sweet_potato:", + "category": "food", + "emoji_order": "369", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "vegetables", + "food" + ] + }, + "honey_pot": { + "unicode": "1f36f", + "unicode_alternates": "", + "name": "honey pot", + "shortname": ":honey_pot:", + "category": "food", + "emoji_order": "370", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food", + "vagina" + ] + }, + "bread": { + "unicode": "1f35e", + "unicode_alternates": "", + "name": "bread", + "shortname": ":bread:", + "category": "food", + "emoji_order": "371", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food" + ] + }, + "cheese": { + "unicode": "1f9c0", + "unicode_alternates": "", + "name": "cheese wedge", + "shortname": ":cheese:", + "category": "food", + "emoji_order": "372", + "aliases": [ + ":cheese_wedge:" + ], + "aliases_ascii": [], + "keywords": [ + "food" + ] + }, + "poultry_leg": { + "unicode": "1f357", + "unicode_alternates": "", + "name": "poultry leg", + "shortname": ":poultry_leg:", + "category": "food", + "emoji_order": "373", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food", + "holidays" + ] + }, + "meat_on_bone": { + "unicode": "1f356", + "unicode_alternates": "", + "name": "meat on bone", + "shortname": ":meat_on_bone:", + "category": "food", + "emoji_order": "374", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food" + ] + }, + "fried_shrimp": { + "unicode": "1f364", + "unicode_alternates": "", + "name": "fried shrimp", + "shortname": ":fried_shrimp:", + "category": "food", + "emoji_order": "375", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food" + ] + }, + "egg": { + "unicode": "1f95a", + "unicode_alternates": "", + "name": "egg", + "shortname": ":egg:", + "category": "unicode9", + "emoji_order": "75", + "aliases": [], + "aliases_ascii": [], + "keywords": [] + }, + "hamburger": { + "unicode": "1f354", + "unicode_alternates": "", + "name": "hamburger", + "shortname": ":hamburger:", + "category": "food", + "emoji_order": "377", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "america", + "food" + ] + }, + "fries": { + "unicode": "1f35f", + "unicode_alternates": "", + "name": "french fries", + "shortname": ":fries:", + "category": "food", + "emoji_order": "378", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "america", + "food" + ] + }, + "hotdog": { + "unicode": "1f32d", + "unicode_alternates": "", + "name": "hot dog", + "shortname": ":hotdog:", + "category": "food", + "emoji_order": "379", + "aliases": [ + ":hot_dog:" + ], + "aliases_ascii": [], + "keywords": [ + "america", + "food" + ] + }, + "pizza": { + "unicode": "1f355", + "unicode_alternates": "", + "name": "slice of pizza", + "shortname": ":pizza:", + "category": "food", + "emoji_order": "380", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "italian", + "food", + "boys night", + "boys night" + ] + }, + "spaghetti": { + "unicode": "1f35d", + "unicode_alternates": "", + "name": "spaghetti", + "shortname": ":spaghetti:", + "category": "food", + "emoji_order": "381", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "noodles", + "pasta", + "italian", + "food" + ] + }, + "taco": { + "unicode": "1f32e", + "unicode_alternates": "", + "name": "taco", + "shortname": ":taco:", + "category": "food", + "emoji_order": "382", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food", + "mexican", + "vagina" + ] + }, + "burrito": { + "unicode": "1f32f", + "unicode_alternates": "", + "name": "burrito", + "shortname": ":burrito:", + "category": "food", + "emoji_order": "383", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food", + "mexican" + ] + }, + "ramen": { + "unicode": "1f35c", + "unicode_alternates": "", + "name": "steaming bowl", + "shortname": ":ramen:", + "category": "food", + "emoji_order": "384", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "noodles", + "ramen", + "japan", + "food" + ] + }, + "stew": { + "unicode": "1f372", + "unicode_alternates": "", + "name": "pot of food", + "shortname": ":stew:", + "category": "food", + "emoji_order": "385", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food", + "steam", + "steam" + ] + }, + "fish_cake": { + "unicode": "1f365", + "unicode_alternates": "", + "name": "fish cake with swirl design", + "shortname": ":fish_cake:", + "category": "food", + "emoji_order": "386", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "sushi", + "food" + ] + }, + "sushi": { + "unicode": "1f363", + "unicode_alternates": "", + "name": "sushi", + "shortname": ":sushi:", + "category": "food", + "emoji_order": "387", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "sushi", + "japan", + "food" + ] + }, + "bento": { + "unicode": "1f371", + "unicode_alternates": "", + "name": "bento box", + "shortname": ":bento:", + "category": "food", + "emoji_order": "388", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "sushi", + "japan", + "food" + ] + }, + "curry": { + "unicode": "1f35b", + "unicode_alternates": "", + "name": "curry and rice", + "shortname": ":curry:", + "category": "food", + "emoji_order": "389", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food" + ] + }, + "rice_ball": { + "unicode": "1f359", + "unicode_alternates": "", + "name": "rice ball", + "shortname": ":rice_ball:", + "category": "food", + "emoji_order": "390", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "sushi", + "japan", + "food" + ] + }, + "rice": { + "unicode": "1f35a", + "unicode_alternates": "", + "name": "cooked rice", + "shortname": ":rice:", + "category": "food", + "emoji_order": "391", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "sushi", + "japan", + "food" + ] + }, + "rice_cracker": { + "unicode": "1f358", + "unicode_alternates": "", + "name": "rice cracker", + "shortname": ":rice_cracker:", + "category": "food", + "emoji_order": "392", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "sushi", + "food" + ] + }, + "oden": { + "unicode": "1f362", + "unicode_alternates": "", + "name": "oden", + "shortname": ":oden:", + "category": "food", + "emoji_order": "393", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food" + ] + }, + "dango": { + "unicode": "1f361", + "unicode_alternates": "", + "name": "dango", + "shortname": ":dango:", + "category": "food", + "emoji_order": "394", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food" + ] + }, + "shaved_ice": { + "unicode": "1f367", + "unicode_alternates": "", + "name": "shaved ice", + "shortname": ":shaved_ice:", + "category": "food", + "emoji_order": "395", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food" + ] + }, + "ice_cream": { + "unicode": "1f368", + "unicode_alternates": "", + "name": "ice cream", + "shortname": ":ice_cream:", + "category": "food", + "emoji_order": "396", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food" + ] + }, + "icecream": { + "unicode": "1f366", + "unicode_alternates": "", + "name": "soft ice cream", + "shortname": ":icecream:", + "category": "food", + "emoji_order": "397", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food" + ] + }, + "cake": { + "unicode": "1f370", + "unicode_alternates": "", + "name": "shortcake", + "shortname": ":cake:", + "category": "food", + "emoji_order": "398", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food" + ] + }, + "birthday": { + "unicode": "1f382", + "unicode_alternates": "", + "name": "birthday cake", + "shortname": ":birthday:", + "category": "food", + "emoji_order": "399", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "birthday", + "food", + "parties", + "parties" + ] + }, + "custard": { + "unicode": "1f36e", + "unicode_alternates": "", + "name": "custard", + "shortname": ":custard:", + "category": "food", + "emoji_order": "400", + "aliases": [ + ":pudding:", + ":flan:" + ], + "aliases_ascii": [], + "keywords": [ + "food" + ] + }, + "candy": { + "unicode": "1f36c", + "unicode_alternates": "", + "name": "candy", + "shortname": ":candy:", + "category": "food", + "emoji_order": "401", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food", + "halloween" + ] + }, + "lollipop": { + "unicode": "1f36d", + "unicode_alternates": "", + "name": "lollipop", + "shortname": ":lollipop:", + "category": "food", + "emoji_order": "402", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food", + "halloween" + ] + }, + "chocolate_bar": { + "unicode": "1f36b", + "unicode_alternates": "", + "name": "chocolate bar", + "shortname": ":chocolate_bar:", + "category": "food", + "emoji_order": "403", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food", + "halloween" + ] + }, + "popcorn": { + "unicode": "1f37f", + "unicode_alternates": "", + "name": "popcorn", + "shortname": ":popcorn:", + "category": "food", + "emoji_order": "404", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food", + "parties", + "parties" + ] + }, + "doughnut": { + "unicode": "1f369", + "unicode_alternates": "", + "name": "doughnut", + "shortname": ":doughnut:", + "category": "food", + "emoji_order": "405", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food" + ] + }, + "cookie": { + "unicode": "1f36a", + "unicode_alternates": "", + "name": "cookie", + "shortname": ":cookie:", + "category": "food", + "emoji_order": "406", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "food", + "vagina" + ] + }, + "beer": { + "unicode": "1f37a", + "unicode_alternates": "", + "name": "beer mug", + "shortname": ":beer:", + "category": "food", + "emoji_order": "407", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "drink", + "beer", + "alcohol", + "parties", + "parties" + ] + }, + "beers": { + "unicode": "1f37b", + "unicode_alternates": "", + "name": "clinking beer mugs", + "shortname": ":beers:", + "category": "food", + "emoji_order": "408", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "drink", + "cheers", + "beer", + "alcohol", + "thank you", + "boys night", + "boys night", + "parties", + "parties" + ] + }, + "wine_glass": { + "unicode": "1f377", + "unicode_alternates": "", + "name": "wine glass", + "shortname": ":wine_glass:", + "category": "food", + "emoji_order": "409", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "drink", + "italian", + "alcohol", + "girls night", + "girls night", + "parties", + "parties" + ] + }, + "cocktail": { + "unicode": "1f378", + "unicode_alternates": "", + "name": "cocktail glass", + "shortname": ":cocktail:", + "category": "food", + "emoji_order": "410", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "drink", + "cocktail", + "alcohol", + "girls night", + "girls night", + "parties", + "parties" + ] + }, + "tropical_drink": { + "unicode": "1f379", + "unicode_alternates": "", + "name": "tropical drink", + "shortname": ":tropical_drink:", + "category": "food", + "emoji_order": "411", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "drink", + "cocktail", + "tropical", + "alcohol" + ] + }, + "champagne": { + "unicode": "1f37e", + "unicode_alternates": "", + "name": "bottle with popping cork", + "shortname": ":champagne:", + "category": "food", + "emoji_order": "412", + "aliases": [ + ":bottle_with_popping_cork:" + ], + "aliases_ascii": [], + "keywords": [ + "drink", + "cheers", + "alcohol", + "parties", + "parties" + ] + }, + "sake": { + "unicode": "1f376", + "unicode_alternates": "", + "name": "sake bottle and cup", + "shortname": ":sake:", + "category": "food", + "emoji_order": "413", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "drink", + "japan", + "sake", + "alcohol", + "girls night", + "girls night" + ] + }, + "tea": { + "unicode": "1f375", + "unicode_alternates": "", + "name": "teacup without handle", + "shortname": ":tea:", + "category": "food", + "emoji_order": "414", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "drink", + "japan", + "caffeine", + "steam", + "steam", + "morning", + "morning" + ] + }, + "coffee": { + "unicode": "2615", + "unicode_alternates": "2615-fe0f", + "name": "hot beverage", + "shortname": ":coffee:", + "category": "food", + "emoji_order": "415", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "drink", + "caffeine", + "steam", + "steam", + "morning", + "morning" + ] + }, + "baby_bottle": { + "unicode": "1f37c", + "unicode_alternates": "", + "name": "baby bottle", + "shortname": ":baby_bottle:", + "category": "food", + "emoji_order": "416", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "drink", + "object", + "food", + "baby" + ] + }, + "fork_and_knife": { + "unicode": "1f374", + "unicode_alternates": "", + "name": "fork and knife", + "shortname": ":fork_and_knife:", + "category": "food", + "emoji_order": "417", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "weapon", + "food" + ] + }, + "fork_knife_plate": { + "unicode": "1f37d", + "unicode_alternates": "1f37d-fe0f", + "name": "fork and knife with plate", + "shortname": ":fork_knife_plate:", + "category": "food", + "emoji_order": "418", + "aliases": [ + ":fork_and_knife_with_plate:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "food" + ] + }, + "soccer": { + "unicode": "26bd", + "unicode_alternates": "26bd-fe0f", + "name": "soccer ball", + "shortname": ":soccer:", + "category": "activity", + "emoji_order": "419", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "game", + "ball", + "sport", + "soccer", + "football" + ] + }, + "basketball": { + "unicode": "1f3c0", + "unicode_alternates": "", + "name": "basketball and hoop", + "shortname": ":basketball:", + "category": "activity", + "emoji_order": "420", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "game", + "ball", + "sport", + "basketball" + ] + }, + "football": { + "unicode": "1f3c8", + "unicode_alternates": "", + "name": "american football", + "shortname": ":football:", + "category": "activity", + "emoji_order": "421", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "america", + "game", + "ball", + "sport", + "football" + ] + }, + "baseball": { + "unicode": "26be", + "unicode_alternates": "26be-fe0f", + "name": "baseball", + "shortname": ":baseball:", + "category": "activity", + "emoji_order": "422", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "game", + "ball", + "sport", + "baseball" + ] + }, + "tennis": { + "unicode": "1f3be", + "unicode_alternates": "", + "name": "tennis racquet and ball", + "shortname": ":tennis:", + "category": "activity", + "emoji_order": "423", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "game", + "ball", + "sport", + "tennis" + ] + }, + "volleyball": { + "unicode": "1f3d0", + "unicode_alternates": "", + "name": "volleyball", + "shortname": ":volleyball:", + "category": "activity", + "emoji_order": "424", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "game", + "ball", + "sport", + "volleyball" + ] + }, + "rugby_football": { + "unicode": "1f3c9", + "unicode_alternates": "", + "name": "rugby football", + "shortname": ":rugby_football:", + "category": "activity", + "emoji_order": "425", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "game", + "sport", + "football" + ] + }, + "8ball": { + "unicode": "1f3b1", + "unicode_alternates": "", + "name": "billiards", + "shortname": ":8ball:", + "category": "activity", + "emoji_order": "426", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "game", + "ball", + "sport", + "billiards", + "luck", + "boys night", + "boys night" + ] + }, + "golf": { + "unicode": "26f3", + "unicode_alternates": "26f3-fe0f", + "name": "flag in hole", + "shortname": ":golf:", + "category": "activity", + "emoji_order": "427", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "game", + "ball", + "vacation", + "sport", + "golf", + "golf" + ] + }, + "golfer": { + "unicode": "1f3cc", + "unicode_alternates": "1f3cc-fe0f", + "name": "golfer", + "shortname": ":golfer:", + "category": "activity", + "emoji_order": "428", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "men", + "game", + "ball", + "vacation", + "sport", + "golf", + "golf" + ] + }, + "ping_pong": { + "unicode": "1f3d3", + "unicode_alternates": "", + "name": "table tennis paddle and ball", + "shortname": ":ping_pong:", + "category": "activity", + "emoji_order": "429", + "aliases": [ + ":table_tennis:" + ], + "aliases_ascii": [], + "keywords": [ + "game", + "ball", + "sport", + "ping pong" + ] + }, + "badminton": { + "unicode": "1f3f8", + "unicode_alternates": "", + "name": "badminton racquet", + "shortname": ":badminton:", + "category": "activity", + "emoji_order": "430", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "game", + "sport", + "badminton" + ] + }, + "hockey": { + "unicode": "1f3d2", + "unicode_alternates": "", + "name": "ice hockey stick and puck", + "shortname": ":hockey:", + "category": "activity", + "emoji_order": "431", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "game", + "sport", + "hockey" + ] + }, + "field_hockey": { + "unicode": "1f3d1", + "unicode_alternates": "", + "name": "field hockey stick and ball", + "shortname": ":field_hockey:", + "category": "activity", + "emoji_order": "432", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "ball", + "sport", + "hockey" + ] + }, + "cricket": { + "unicode": "1f3cf", + "unicode_alternates": "", + "name": "cricket bat and ball", + "shortname": ":cricket:", + "category": "activity", + "emoji_order": "433", + "aliases": [ + ":cricket_bat_ball:" + ], + "aliases_ascii": [], + "keywords": [ + "ball", + "sport", + "cricket" + ] + }, + "ski": { + "unicode": "1f3bf", + "unicode_alternates": "", + "name": "ski and ski boot", + "shortname": ":ski:", + "category": "activity", + "emoji_order": "434", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "cold", + "sport", + "skiing" + ] + }, + "skier": { + "unicode": "26f7", + "unicode_alternates": "26f7-fe0f", + "name": "skier", + "shortname": ":skier:", + "category": "activity", + "emoji_order": "435", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "hat", + "vacation", + "cold", + "sport", + "skiing" + ] + }, + "snowboarder": { + "unicode": "1f3c2", + "unicode_alternates": "", + "name": "snowboarder", + "shortname": ":snowboarder:", + "category": "activity", + "emoji_order": "436", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "hat", + "vacation", + "cold", + "sport", + "snowboarding" + ] + }, + "ice_skate": { + "unicode": "26f8", + "unicode_alternates": "26f8-fe0f", + "name": "ice skate", + "shortname": ":ice_skate:", + "category": "activity", + "emoji_order": "437", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "cold", + "sport", + "ice skating" + ] + }, + "bow_and_arrow": { + "unicode": "1f3f9", + "unicode_alternates": "", + "name": "bow and arrow", + "shortname": ":bow_and_arrow:", + "category": "activity", + "emoji_order": "438", + "aliases": [ + ":archery:" + ], + "aliases_ascii": [], + "keywords": [ + "weapon", + "sport" + ] + }, + "fishing_pole_and_fish": { + "unicode": "1f3a3", + "unicode_alternates": "", + "name": "fishing pole and fish", + "shortname": ":fishing_pole_and_fish:", + "category": "activity", + "emoji_order": "439", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "vacation", + "sport", + "fishing" + ] + }, + "rowboat": { + "unicode": "1f6a3", + "unicode_alternates": "", + "name": "rowboat", + "shortname": ":rowboat:", + "category": "activity", + "emoji_order": "440", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "men", + "workout", + "sport", + "rowing", + "diversity", + "diversity" + ] + }, + "swimmer": { + "unicode": "1f3ca", + "unicode_alternates": "", + "name": "swimmer", + "shortname": ":swimmer:", + "category": "activity", + "emoji_order": "441", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "workout", + "sport", + "swim", + "diversity", + "diversity" + ] + }, + "surfer": { + "unicode": "1f3c4", + "unicode_alternates": "", + "name": "surfer", + "shortname": ":surfer:", + "category": "activity", + "emoji_order": "442", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "men", + "vacation", + "tropical", + "sport", + "diversity", + "diversity" + ] + }, + "bath": { + "unicode": "1f6c0", + "unicode_alternates": "", + "name": "bath", + "shortname": ":bath:", + "category": "activity", + "emoji_order": "443", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "bathroom", + "tired", + "diversity", + "diversity", + "steam", + "steam" + ] + }, + "basketball_player": { + "unicode": "26f9", + "unicode_alternates": "26f9-fe0f", + "name": "person with ball", + "shortname": ":basketball_player:", + "category": "activity", + "emoji_order": "444", + "aliases": [ + ":person_with_ball:" + ], + "aliases_ascii": [], + "keywords": [ + "men", + "game", + "ball", + "sport", + "basketball", + "diversity", + "diversity" + ] + }, + "lifter": { + "unicode": "1f3cb", + "unicode_alternates": "1f3cb-fe0f", + "name": "weight lifter", + "shortname": ":lifter:", + "category": "activity", + "emoji_order": "445", + "aliases": [ + ":weight_lifter:" + ], + "aliases_ascii": [], + "keywords": [ + "men", + "workout", + "flex", + "sport", + "weight lifting", + "win", + "win", + "diversity", + "diversity" + ] + }, + "bicyclist": { + "unicode": "1f6b4", + "unicode_alternates": "", + "name": "bicyclist", + "shortname": ":bicyclist:", + "category": "activity", + "emoji_order": "446", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "men", + "workout", + "sport", + "bike", + "diversity", + "diversity" + ] + }, + "mountain_bicyclist": { + "unicode": "1f6b5", + "unicode_alternates": "", + "name": "mountain bicyclist", + "shortname": ":mountain_bicyclist:", + "category": "activity", + "emoji_order": "447", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "men", + "sport", + "bike", + "diversity", + "diversity" + ] + }, + "horse_racing": { + "unicode": "1f3c7", + "unicode_alternates": "", + "name": "horse racing", + "shortname": ":horse_racing:", + "category": "activity", + "emoji_order": "448", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "men", + "sport", + "horse racing" + ] + }, + "levitate": { + "unicode": "1f574", + "unicode_alternates": "1f574-fe0f", + "name": "man in business suit levitating", + "shortname": ":levitate:", + "category": "activity", + "emoji_order": "449", + "aliases": [ + ":man_in_business_suit_levitating:" + ], + "aliases_ascii": [], + "keywords": [ + "men", + "job", + "job" + ] + }, + "trophy": { + "unicode": "1f3c6", + "unicode_alternates": "", + "name": "trophy", + "shortname": ":trophy:", + "category": "activity", + "emoji_order": "450", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "game", + "award", + "win", + "win", + "perfect", + "perfect", + "parties", + "parties" + ] + }, + "running_shirt_with_sash": { + "unicode": "1f3bd", + "unicode_alternates": "", + "name": "running shirt with sash", + "shortname": ":running_shirt_with_sash:", + "category": "activity", + "emoji_order": "451", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "award" + ] + }, + "medal": { + "unicode": "1f3c5", + "unicode_alternates": "", + "name": "sports medal", + "shortname": ":medal:", + "category": "activity", + "emoji_order": "452", + "aliases": [ + ":sports_medal:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "award", + "sport", + "win", + "win", + "perfect", + "perfect" + ] + }, + "military_medal": { + "unicode": "1f396", + "unicode_alternates": "1f396-fe0f", + "name": "military medal", + "shortname": ":military_medal:", + "category": "activity", + "emoji_order": "453", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "award", + "win", + "win" + ] + }, + "reminder_ribbon": { + "unicode": "1f397", + "unicode_alternates": "1f397-fe0f", + "name": "reminder ribbon", + "shortname": ":reminder_ribbon:", + "category": "activity", + "emoji_order": "454", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "award" + ] + }, + "rosette": { + "unicode": "1f3f5", + "unicode_alternates": "1f3f5-fe0f", + "name": "rosette", + "shortname": ":rosette:", + "category": "activity", + "emoji_order": "455", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "tropical" + ] + }, + "ticket": { + "unicode": "1f3ab", + "unicode_alternates": "", + "name": "ticket", + "shortname": ":ticket:", + "category": "activity", + "emoji_order": "456", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "theatre", + "movie", + "parties", + "parties" + ] + }, + "tickets": { + "unicode": "1f39f", + "unicode_alternates": "1f39f-fe0f", + "name": "admission tickets", + "shortname": ":tickets:", + "category": "activity", + "emoji_order": "457", + "aliases": [ + ":admission_tickets:" + ], + "aliases_ascii": [], + "keywords": [ + "theatre", + "movie", + "parties", + "parties" + ] + }, + "performing_arts": { + "unicode": "1f3ad", + "unicode_alternates": "", + "name": "performing arts", + "shortname": ":performing_arts:", + "category": "activity", + "emoji_order": "458", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "theatre", + "movie" + ] + }, + "art": { + "unicode": "1f3a8", + "unicode_alternates": "", + "name": "artist palette", + "shortname": ":art:", + "category": "activity", + "emoji_order": "459", + "aliases": [], + "aliases_ascii": [], + "keywords": [] + }, + "circus_tent": { + "unicode": "1f3aa", + "unicode_alternates": "", + "name": "circus tent", + "shortname": ":circus_tent:", + "category": "activity", + "emoji_order": "460", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "circus tent" + ] + }, + "microphone": { + "unicode": "1f3a4", + "unicode_alternates": "", + "name": "microphone", + "shortname": ":microphone:", + "category": "activity", + "emoji_order": "461", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "instruments" + ] + }, + "headphones": { + "unicode": "1f3a7", + "unicode_alternates": "", + "name": "headphone", + "shortname": ":headphones:", + "category": "activity", + "emoji_order": "462", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "instruments" + ] + }, + "musical_score": { + "unicode": "1f3bc", + "unicode_alternates": "", + "name": "musical score", + "shortname": ":musical_score:", + "category": "activity", + "emoji_order": "463", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "instruments" + ] + }, + "musical_keyboard": { + "unicode": "1f3b9", + "unicode_alternates": "", + "name": "musical keyboard", + "shortname": ":musical_keyboard:", + "category": "activity", + "emoji_order": "464", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "instruments" + ] + }, + "saxophone": { + "unicode": "1f3b7", + "unicode_alternates": "", + "name": "saxophone", + "shortname": ":saxophone:", + "category": "activity", + "emoji_order": "465", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "instruments" + ] + }, + "trumpet": { + "unicode": "1f3ba", + "unicode_alternates": "", + "name": "trumpet", + "shortname": ":trumpet:", + "category": "activity", + "emoji_order": "466", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "instruments" + ] + }, + "guitar": { + "unicode": "1f3b8", + "unicode_alternates": "", + "name": "guitar", + "shortname": ":guitar:", + "category": "activity", + "emoji_order": "467", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "instruments" + ] + }, + "violin": { + "unicode": "1f3bb", + "unicode_alternates": "", + "name": "violin", + "shortname": ":violin:", + "category": "activity", + "emoji_order": "468", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "instruments", + "sarcastic", + "sarcastic" + ] + }, + "clapper": { + "unicode": "1f3ac", + "unicode_alternates": "", + "name": "clapper board", + "shortname": ":clapper:", + "category": "activity", + "emoji_order": "469", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "movie" + ] + }, + "video_game": { + "unicode": "1f3ae", + "unicode_alternates": "", + "name": "video game", + "shortname": ":video_game:", + "category": "activity", + "emoji_order": "470", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "game", + "boys night", + "boys night" + ] + }, + "space_invader": { + "unicode": "1f47e", + "unicode_alternates": "", + "name": "alien monster", + "shortname": ":space_invader:", + "category": "activity", + "emoji_order": "471", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "monster", + "alien" + ] + }, + "dart": { + "unicode": "1f3af", + "unicode_alternates": "", + "name": "direct hit", + "shortname": ":dart:", + "category": "activity", + "emoji_order": "472", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "game", + "sport", + "boys night", + "boys night" + ] + }, + "game_die": { + "unicode": "1f3b2", + "unicode_alternates": "", + "name": "game die", + "shortname": ":game_die:", + "category": "activity", + "emoji_order": "473", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "game", + "boys night", + "boys night" + ] + }, + "slot_machine": { + "unicode": "1f3b0", + "unicode_alternates": "", + "name": "slot machine", + "shortname": ":slot_machine:", + "category": "activity", + "emoji_order": "474", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "game", + "boys night", + "boys night" + ] + }, + "bowling": { + "unicode": "1f3b3", + "unicode_alternates": "", + "name": "bowling", + "shortname": ":bowling:", + "category": "activity", + "emoji_order": "475", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "game", + "ball", + "sport", + "boys night", + "boys night" + ] + }, + "red_car": { + "unicode": "1f697", + "unicode_alternates": "", + "name": "automobile", + "shortname": ":red_car:", + "category": "travel", + "emoji_order": "476", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "car", + "travel" + ] + }, + "taxi": { + "unicode": "1f695", + "unicode_alternates": "", + "name": "taxi", + "shortname": ":taxi:", + "category": "travel", + "emoji_order": "477", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "car", + "travel" + ] + }, + "blue_car": { + "unicode": "1f699", + "unicode_alternates": "", + "name": "recreational vehicle", + "shortname": ":blue_car:", + "category": "travel", + "emoji_order": "478", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "car", + "travel" + ] + }, + "bus": { + "unicode": "1f68c", + "unicode_alternates": "", + "name": "bus", + "shortname": ":bus:", + "category": "travel", + "emoji_order": "479", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "bus", + "office" + ] + }, + "trolleybus": { + "unicode": "1f68e", + "unicode_alternates": "", + "name": "trolleybus", + "shortname": ":trolleybus:", + "category": "travel", + "emoji_order": "480", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "bus", + "travel" + ] + }, + "race_car": { + "unicode": "1f3ce", + "unicode_alternates": "1f3ce-fe0f", + "name": "racing car", + "shortname": ":race_car:", + "category": "travel", + "emoji_order": "481", + "aliases": [ + ":racing_car:" + ], + "aliases_ascii": [], + "keywords": [ + "transportation", + "car" + ] + }, + "police_car": { + "unicode": "1f693", + "unicode_alternates": "", + "name": "police car", + "shortname": ":police_car:", + "category": "travel", + "emoji_order": "482", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "car", + "police", + "police", + "911", + "911" + ] + }, + "ambulance": { + "unicode": "1f691", + "unicode_alternates": "", + "name": "ambulance", + "shortname": ":ambulance:", + "category": "travel", + "emoji_order": "483", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "911", + "911" + ] + }, + "fire_engine": { + "unicode": "1f692", + "unicode_alternates": "", + "name": "fire engine", + "shortname": ":fire_engine:", + "category": "travel", + "emoji_order": "484", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "truck", + "911", + "911" + ] + }, + "minibus": { + "unicode": "1f690", + "unicode_alternates": "", + "name": "minibus", + "shortname": ":minibus:", + "category": "travel", + "emoji_order": "485", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "bus" + ] + }, + "truck": { + "unicode": "1f69a", + "unicode_alternates": "", + "name": "delivery truck", + "shortname": ":truck:", + "category": "travel", + "emoji_order": "486", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "truck" + ] + }, + "articulated_lorry": { + "unicode": "1f69b", + "unicode_alternates": "", + "name": "articulated lorry", + "shortname": ":articulated_lorry:", + "category": "travel", + "emoji_order": "487", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "truck" + ] + }, + "tractor": { + "unicode": "1f69c", + "unicode_alternates": "", + "name": "tractor", + "shortname": ":tractor:", + "category": "travel", + "emoji_order": "488", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation" + ] + }, + "motorcycle": { + "unicode": "1f3cd", + "unicode_alternates": "1f3cd-fe0f", + "name": "racing motorcycle", + "shortname": ":motorcycle:", + "category": "travel", + "emoji_order": "489", + "aliases": [ + ":racing_motorcycle:" + ], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "bike" + ] + }, + "bike": { + "unicode": "1f6b2", + "unicode_alternates": "", + "name": "bicycle", + "shortname": ":bike:", + "category": "travel", + "emoji_order": "490", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "bike" + ] + }, + "rotating_light": { + "unicode": "1f6a8", + "unicode_alternates": "", + "name": "police cars revolving light", + "shortname": ":rotating_light:", + "category": "travel", + "emoji_order": "491", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "object", + "police", + "police", + "911", + "911" + ] + }, + "oncoming_police_car": { + "unicode": "1f694", + "unicode_alternates": "", + "name": "oncoming police car", + "shortname": ":oncoming_police_car:", + "category": "travel", + "emoji_order": "492", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "car", + "police", + "police", + "911", + "911" + ] + }, + "oncoming_bus": { + "unicode": "1f68d", + "unicode_alternates": "", + "name": "oncoming bus", + "shortname": ":oncoming_bus:", + "category": "travel", + "emoji_order": "493", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "bus", + "travel" + ] + }, + "oncoming_automobile": { + "unicode": "1f698", + "unicode_alternates": "", + "name": "oncoming automobile", + "shortname": ":oncoming_automobile:", + "category": "travel", + "emoji_order": "494", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "car", + "travel" + ] + }, + "oncoming_taxi": { + "unicode": "1f696", + "unicode_alternates": "", + "name": "oncoming taxi", + "shortname": ":oncoming_taxi:", + "category": "travel", + "emoji_order": "495", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "car", + "travel" + ] + }, + "aerial_tramway": { + "unicode": "1f6a1", + "unicode_alternates": "", + "name": "aerial tramway", + "shortname": ":aerial_tramway:", + "category": "travel", + "emoji_order": "496", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "train" + ] + }, + "mountain_cableway": { + "unicode": "1f6a0", + "unicode_alternates": "", + "name": "mountain cableway", + "shortname": ":mountain_cableway:", + "category": "travel", + "emoji_order": "497", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "train" + ] + }, + "suspension_railway": { + "unicode": "1f69f", + "unicode_alternates": "", + "name": "suspension railway", + "shortname": ":suspension_railway:", + "category": "travel", + "emoji_order": "498", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "train" + ] + }, + "railway_car": { + "unicode": "1f683", + "unicode_alternates": "", + "name": "railway car", + "shortname": ":railway_car:", + "category": "travel", + "emoji_order": "499", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "train" + ] + }, + "train": { + "unicode": "1f68b", + "unicode_alternates": "", + "name": "tram car", + "shortname": ":train:", + "category": "travel", + "emoji_order": "500", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "train" + ] + }, + "monorail": { + "unicode": "1f69d", + "unicode_alternates": "", + "name": "monorail", + "shortname": ":monorail:", + "category": "travel", + "emoji_order": "501", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "train", + "vacation" + ] + }, + "bullettrain_side": { + "unicode": "1f684", + "unicode_alternates": "", + "name": "high-speed train", + "shortname": ":bullettrain_side:", + "category": "travel", + "emoji_order": "502", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "train" + ] + }, + "bullettrain_front": { + "unicode": "1f685", + "unicode_alternates": "", + "name": "high-speed train with bullet nose", + "shortname": ":bullettrain_front:", + "category": "travel", + "emoji_order": "503", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "train" + ] + }, + "light_rail": { + "unicode": "1f688", + "unicode_alternates": "", + "name": "light rail", + "shortname": ":light_rail:", + "category": "travel", + "emoji_order": "504", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "train" + ] + }, + "mountain_railway": { + "unicode": "1f69e", + "unicode_alternates": "", + "name": "mountain railway", + "shortname": ":mountain_railway:", + "category": "travel", + "emoji_order": "505", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "train" + ] + }, + "steam_locomotive": { + "unicode": "1f682", + "unicode_alternates": "", + "name": "steam locomotive", + "shortname": ":steam_locomotive:", + "category": "travel", + "emoji_order": "506", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "train", + "steam", + "steam" + ] + }, + "train2": { + "unicode": "1f686", + "unicode_alternates": "", + "name": "train", + "shortname": ":train2:", + "category": "travel", + "emoji_order": "507", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "train" + ] + }, + "metro": { + "unicode": "1f687", + "unicode_alternates": "", + "name": "metro", + "shortname": ":metro:", + "category": "travel", + "emoji_order": "508", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "train" + ] + }, + "tram": { + "unicode": "1f68a", + "unicode_alternates": "", + "name": "tram", + "shortname": ":tram:", + "category": "travel", + "emoji_order": "509", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "train" + ] + }, + "station": { + "unicode": "1f689", + "unicode_alternates": "", + "name": "station", + "shortname": ":station:", + "category": "travel", + "emoji_order": "510", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "train" + ] + }, + "helicopter": { + "unicode": "1f681", + "unicode_alternates": "", + "name": "helicopter", + "shortname": ":helicopter:", + "category": "travel", + "emoji_order": "511", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "plane", + "travel", + "fly", + "fly" + ] + }, + "airplane_small": { + "unicode": "1f6e9", + "unicode_alternates": "1f6e9-fe0f", + "name": "small airplane", + "shortname": ":airplane_small:", + "category": "travel", + "emoji_order": "512", + "aliases": [ + ":small_airplane:" + ], + "aliases_ascii": [], + "keywords": [ + "transportation", + "plane", + "travel", + "vacation", + "fly", + "fly" + ] + }, + "airplane": { + "unicode": "2708", + "unicode_alternates": "2708-fe0f", + "name": "airplane", + "shortname": ":airplane:", + "category": "travel", + "emoji_order": "513", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "plane", + "travel", + "vacation", + "fly", + "fly" + ] + }, + "airplane_departure": { + "unicode": "1f6eb", + "unicode_alternates": "", + "name": "airplane departure", + "shortname": ":airplane_departure:", + "category": "travel", + "emoji_order": "514", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "plane", + "travel", + "vacation", + "fly", + "fly" + ] + }, + "airplane_arriving": { + "unicode": "1f6ec", + "unicode_alternates": "", + "name": "airplane arriving", + "shortname": ":airplane_arriving:", + "category": "travel", + "emoji_order": "515", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "plane", + "travel", + "vacation", + "fly", + "fly" + ] + }, + "sailboat": { + "unicode": "26f5", + "unicode_alternates": "26f5-fe0f", + "name": "sailboat", + "shortname": ":sailboat:", + "category": "travel", + "emoji_order": "516", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "boat", + "vacation" + ] + }, + "motorboat": { + "unicode": "1f6e5", + "unicode_alternates": "1f6e5-fe0f", + "name": "motorboat", + "shortname": ":motorboat:", + "category": "travel", + "emoji_order": "517", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "boat" + ] + }, + "speedboat": { + "unicode": "1f6a4", + "unicode_alternates": "", + "name": "speedboat", + "shortname": ":speedboat:", + "category": "travel", + "emoji_order": "518", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "boat", + "vacation", + "tropical" + ] + }, + "ferry": { + "unicode": "26f4", + "unicode_alternates": "26f4-fe0f", + "name": "ferry", + "shortname": ":ferry:", + "category": "travel", + "emoji_order": "519", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "boat", + "vacation" + ] + }, + "cruise_ship": { + "unicode": "1f6f3", + "unicode_alternates": "1f6f3-fe0f", + "name": "passenger ship", + "shortname": ":cruise_ship:", + "category": "travel", + "emoji_order": "520", + "aliases": [ + ":passenger_ship:" + ], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "boat", + "vacation" + ] + }, + "rocket": { + "unicode": "1f680", + "unicode_alternates": "", + "name": "rocket", + "shortname": ":rocket:", + "category": "travel", + "emoji_order": "521", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "object", + "space", + "fly", + "fly", + "blast", + "blast" + ] + }, + "satellite_orbital": { + "unicode": "1f6f0", + "unicode_alternates": "1f6f0-fe0f", + "name": "satellite", + "shortname": ":satellite_orbital:", + "category": "travel", + "emoji_order": "522", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "seat": { + "unicode": "1f4ba", + "unicode_alternates": "", + "name": "seat", + "shortname": ":seat:", + "category": "travel", + "emoji_order": "523", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "object", + "travel", + "vacation" + ] + }, + "anchor": { + "unicode": "2693", + "unicode_alternates": "2693-fe0f", + "name": "anchor", + "shortname": ":anchor:", + "category": "travel", + "emoji_order": "524", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "travel", + "boat", + "vacation" + ] + }, + "construction": { + "unicode": "1f6a7", + "unicode_alternates": "", + "name": "construction sign", + "shortname": ":construction:", + "category": "travel", + "emoji_order": "525", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "fuelpump": { + "unicode": "26fd", + "unicode_alternates": "26fd-fe0f", + "name": "fuel pump", + "shortname": ":fuelpump:", + "category": "travel", + "emoji_order": "526", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "gas pump" + ] + }, + "busstop": { + "unicode": "1f68f", + "unicode_alternates": "", + "name": "bus stop", + "shortname": ":busstop:", + "category": "travel", + "emoji_order": "527", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "vertical_traffic_light": { + "unicode": "1f6a6", + "unicode_alternates": "", + "name": "vertical traffic light", + "shortname": ":vertical_traffic_light:", + "category": "travel", + "emoji_order": "528", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "stop light" + ] + }, + "traffic_light": { + "unicode": "1f6a5", + "unicode_alternates": "", + "name": "horizontal traffic light", + "shortname": ":traffic_light:", + "category": "travel", + "emoji_order": "529", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "stop light" + ] + }, + "checkered_flag": { + "unicode": "1f3c1", + "unicode_alternates": "", + "name": "chequered flag", + "shortname": ":checkered_flag:", + "category": "travel", + "emoji_order": "530", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "ship": { + "unicode": "1f6a2", + "unicode_alternates": "", + "name": "ship", + "shortname": ":ship:", + "category": "travel", + "emoji_order": "531", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "transportation", + "travel", + "boat", + "vacation" + ] + }, + "ferris_wheel": { + "unicode": "1f3a1", + "unicode_alternates": "", + "name": "ferris wheel", + "shortname": ":ferris_wheel:", + "category": "travel", + "emoji_order": "532", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "vacation", + "ferris wheel" + ] + }, + "roller_coaster": { + "unicode": "1f3a2", + "unicode_alternates": "", + "name": "roller coaster", + "shortname": ":roller_coaster:", + "category": "travel", + "emoji_order": "533", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "vacation", + "roller coaster" + ] + }, + "carousel_horse": { + "unicode": "1f3a0", + "unicode_alternates": "", + "name": "carousel horse", + "shortname": ":carousel_horse:", + "category": "travel", + "emoji_order": "534", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "object", + "vacation", + "roller coaster", + "carousel" + ] + }, + "construction_site": { + "unicode": "1f3d7", + "unicode_alternates": "1f3d7-fe0f", + "name": "building construction", + "shortname": ":construction_site:", + "category": "travel", + "emoji_order": "535", + "aliases": [ + ":building_construction:" + ], + "aliases_ascii": [], + "keywords": [ + "building", + "crane" + ] + }, + "foggy": { + "unicode": "1f301", + "unicode_alternates": "", + "name": "foggy", + "shortname": ":foggy:", + "category": "travel", + "emoji_order": "536", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "sky", + "travel", + "vacation" + ] + }, + "tokyo_tower": { + "unicode": "1f5fc", + "unicode_alternates": "", + "name": "tokyo tower", + "shortname": ":tokyo_tower:", + "category": "travel", + "emoji_order": "537", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "travel", + "vacation", + "eiffel tower" + ] + }, + "factory": { + "unicode": "1f3ed", + "unicode_alternates": "", + "name": "factory", + "shortname": ":factory:", + "category": "travel", + "emoji_order": "538", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "travel", + "steam", + "steam" + ] + }, + "fountain": { + "unicode": "26f2", + "unicode_alternates": "26f2-fe0f", + "name": "fountain", + "shortname": ":fountain:", + "category": "travel", + "emoji_order": "539", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "travel", + "vacation" + ] + }, + "rice_scene": { + "unicode": "1f391", + "unicode_alternates": "", + "name": "moon viewing ceremony", + "shortname": ":rice_scene:", + "category": "travel", + "emoji_order": "540", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "space", + "sky", + "travel" + ] + }, + "mountain": { + "unicode": "26f0", + "unicode_alternates": "26f0-fe0f", + "name": "mountain", + "shortname": ":mountain:", + "category": "travel", + "emoji_order": "541", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "travel", + "vacation", + "camp" + ] + }, + "mountain_snow": { + "unicode": "1f3d4", + "unicode_alternates": "1f3d4-fe0f", + "name": "snow capped mountain", + "shortname": ":mountain_snow:", + "category": "travel", + "emoji_order": "542", + "aliases": [ + ":snow_capped_mountain:" + ], + "aliases_ascii": [], + "keywords": [ + "places", + "travel", + "vacation", + "cold", + "camp" + ] + }, + "mount_fuji": { + "unicode": "1f5fb", + "unicode_alternates": "", + "name": "mount fuji", + "shortname": ":mount_fuji:", + "category": "travel", + "emoji_order": "543", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "travel", + "vacation", + "cold", + "camp" + ] + }, + "volcano": { + "unicode": "1f30b", + "unicode_alternates": "", + "name": "volcano", + "shortname": ":volcano:", + "category": "travel", + "emoji_order": "544", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "tropical" + ] + }, + "japan": { + "unicode": "1f5fe", + "unicode_alternates": "", + "name": "silhouette of japan", + "shortname": ":japan:", + "category": "travel", + "emoji_order": "545", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "travel", + "map", + "vacation", + "tropical" + ] + }, + "camping": { + "unicode": "1f3d5", + "unicode_alternates": "1f3d5-fe0f", + "name": "camping", + "shortname": ":camping:", + "category": "travel", + "emoji_order": "546", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "travel", + "vacation", + "camp" + ] + }, + "tent": { + "unicode": "26fa", + "unicode_alternates": "26fa-fe0f", + "name": "tent", + "shortname": ":tent:", + "category": "travel", + "emoji_order": "547", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "travel", + "vacation", + "camp" + ] + }, + "park": { + "unicode": "1f3de", + "unicode_alternates": "1f3de-fe0f", + "name": "national park", + "shortname": ":park:", + "category": "travel", + "emoji_order": "548", + "aliases": [ + ":national_park:" + ], + "aliases_ascii": [], + "keywords": [ + "travel", + "vacation", + "park", + "camp" + ] + }, + "motorway": { + "unicode": "1f6e3", + "unicode_alternates": "1f6e3-fe0f", + "name": "motorway", + "shortname": ":motorway:", + "category": "travel", + "emoji_order": "549", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "travel", + "vacation", + "camp" + ] + }, + "railway_track": { + "unicode": "1f6e4", + "unicode_alternates": "1f6e4-fe0f", + "name": "railway track", + "shortname": ":railway_track:", + "category": "travel", + "emoji_order": "550", + "aliases": [ + ":railroad_track:" + ], + "aliases_ascii": [], + "keywords": [ + "travel", + "train", + "vacation" + ] + }, + "sunrise": { + "unicode": "1f305", + "unicode_alternates": "", + "name": "sunrise", + "shortname": ":sunrise:", + "category": "travel", + "emoji_order": "551", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "sky", + "travel", + "vacation", + "tropical", + "day", + "sun", + "hump day", + "hump day", + "morning", + "morning" + ] + }, + "sunrise_over_mountains": { + "unicode": "1f304", + "unicode_alternates": "", + "name": "sunrise over mountains", + "shortname": ":sunrise_over_mountains:", + "category": "travel", + "emoji_order": "552", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "sky", + "travel", + "vacation", + "day", + "sun", + "camp", + "morning", + "morning" + ] + }, + "desert": { + "unicode": "1f3dc", + "unicode_alternates": "1f3dc-fe0f", + "name": "desert", + "shortname": ":desert:", + "category": "travel", + "emoji_order": "553", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "travel", + "vacation", + "hot", + "hot" + ] + }, + "beach": { + "unicode": "1f3d6", + "unicode_alternates": "1f3d6-fe0f", + "name": "beach with umbrella", + "shortname": ":beach:", + "category": "travel", + "emoji_order": "554", + "aliases": [ + ":beach_with_umbrella:" + ], + "aliases_ascii": [], + "keywords": [ + "places", + "travel", + "vacation", + "tropical", + "beach", + "swim" + ] + }, + "island": { + "unicode": "1f3dd", + "unicode_alternates": "1f3dd-fe0f", + "name": "desert island", + "shortname": ":island:", + "category": "travel", + "emoji_order": "555", + "aliases": [ + ":desert_island:" + ], + "aliases_ascii": [], + "keywords": [ + "places", + "travel", + "vacation", + "tropical", + "beach", + "swim" + ] + }, + "city_sunset": { + "unicode": "1f307", + "unicode_alternates": "", + "name": "sunset over buildings", + "shortname": ":city_sunset:", + "category": "travel", + "emoji_order": "556", + "aliases": [ + ":city_sunrise:" + ], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "sky", + "vacation" + ] + }, + "city_dusk": { + "unicode": "1f306", + "unicode_alternates": "", + "name": "cityscape at dusk", + "shortname": ":city_dusk:", + "category": "travel", + "emoji_order": "557", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building" + ] + }, + "cityscape": { + "unicode": "1f3d9", + "unicode_alternates": "1f3d9-fe0f", + "name": "cityscape", + "shortname": ":cityscape:", + "category": "travel", + "emoji_order": "558", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "vacation" + ] + }, + "night_with_stars": { + "unicode": "1f303", + "unicode_alternates": "", + "name": "night with stars", + "shortname": ":night_with_stars:", + "category": "travel", + "emoji_order": "559", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "sky", + "vacation", + "goodnight", + "goodnight" + ] + }, + "bridge_at_night": { + "unicode": "1f309", + "unicode_alternates": "", + "name": "bridge at night", + "shortname": ":bridge_at_night:", + "category": "travel", + "emoji_order": "560", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "travel", + "vacation", + "goodnight", + "goodnight" + ] + }, + "milky_way": { + "unicode": "1f30c", + "unicode_alternates": "", + "name": "milky way", + "shortname": ":milky_way:", + "category": "travel", + "emoji_order": "561", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "space", + "sky", + "travel", + "vacation" + ] + }, + "stars": { + "unicode": "1f320", + "unicode_alternates": "", + "name": "shooting star", + "shortname": ":stars:", + "category": "travel", + "emoji_order": "562", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "space" + ] + }, + "sparkler": { + "unicode": "1f387", + "unicode_alternates": "", + "name": "firework sparkler", + "shortname": ":sparkler:", + "category": "travel", + "emoji_order": "563", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "parties", + "parties" + ] + }, + "fireworks": { + "unicode": "1f386", + "unicode_alternates": "", + "name": "fireworks", + "shortname": ":fireworks:", + "category": "travel", + "emoji_order": "564", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "parties", + "parties" + ] + }, + "rainbow": { + "unicode": "1f308", + "unicode_alternates": "", + "name": "rainbow", + "shortname": ":rainbow:", + "category": "travel", + "emoji_order": "565", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "weather", + "gay", + "sky", + "rain" + ] + }, + "homes": { + "unicode": "1f3d8", + "unicode_alternates": "1f3d8-fe0f", + "name": "house buildings", + "shortname": ":homes:", + "category": "travel", + "emoji_order": "566", + "aliases": [ + ":house_buildings:" + ], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "house" + ] + }, + "european_castle": { + "unicode": "1f3f0", + "unicode_alternates": "", + "name": "european castle", + "shortname": ":european_castle:", + "category": "travel", + "emoji_order": "567", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "travel", + "vacation" + ] + }, + "japanese_castle": { + "unicode": "1f3ef", + "unicode_alternates": "", + "name": "japanese castle", + "shortname": ":japanese_castle:", + "category": "travel", + "emoji_order": "568", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "travel", + "vacation" + ] + }, + "stadium": { + "unicode": "1f3df", + "unicode_alternates": "1f3df-fe0f", + "name": "stadium", + "shortname": ":stadium:", + "category": "travel", + "emoji_order": "569", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "travel", + "vacation", + "boys night", + "boys night" + ] + }, + "statue_of_liberty": { + "unicode": "1f5fd", + "unicode_alternates": "", + "name": "statue of liberty", + "shortname": ":statue_of_liberty:", + "category": "travel", + "emoji_order": "570", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "america", + "travel", + "vacation", + "statue of liberty", + "free speech", + "free speech" + ] + }, + "house": { + "unicode": "1f3e0", + "unicode_alternates": "", + "name": "house building", + "shortname": ":house:", + "category": "travel", + "emoji_order": "571", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "house" + ] + }, + "house_with_garden": { + "unicode": "1f3e1", + "unicode_alternates": "", + "name": "house with garden", + "shortname": ":house_with_garden:", + "category": "travel", + "emoji_order": "572", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "house" + ] + }, + "house_abandoned": { + "unicode": "1f3da", + "unicode_alternates": "1f3da-fe0f", + "name": "derelict house building", + "shortname": ":house_abandoned:", + "category": "travel", + "emoji_order": "573", + "aliases": [ + ":derelict_house_building:" + ], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "house" + ] + }, + "office": { + "unicode": "1f3e2", + "unicode_alternates": "", + "name": "office building", + "shortname": ":office:", + "category": "travel", + "emoji_order": "574", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "work" + ] + }, + "department_store": { + "unicode": "1f3ec", + "unicode_alternates": "", + "name": "department store", + "shortname": ":department_store:", + "category": "travel", + "emoji_order": "575", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building" + ] + }, + "post_office": { + "unicode": "1f3e3", + "unicode_alternates": "", + "name": "japanese post office", + "shortname": ":post_office:", + "category": "travel", + "emoji_order": "576", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "post office" + ] + }, + "european_post_office": { + "unicode": "1f3e4", + "unicode_alternates": "", + "name": "european post office", + "shortname": ":european_post_office:", + "category": "travel", + "emoji_order": "577", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "post office" + ] + }, + "hospital": { + "unicode": "1f3e5", + "unicode_alternates": "", + "name": "hospital", + "shortname": ":hospital:", + "category": "travel", + "emoji_order": "578", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "health", + "911", + "911" + ] + }, + "bank": { + "unicode": "1f3e6", + "unicode_alternates": "", + "name": "bank", + "shortname": ":bank:", + "category": "travel", + "emoji_order": "579", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building" + ] + }, + "hotel": { + "unicode": "1f3e8", + "unicode_alternates": "", + "name": "hotel", + "shortname": ":hotel:", + "category": "travel", + "emoji_order": "580", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "vacation" + ] + }, + "convenience_store": { + "unicode": "1f3ea", + "unicode_alternates": "", + "name": "convenience store", + "shortname": ":convenience_store:", + "category": "travel", + "emoji_order": "581", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building" + ] + }, + "school": { + "unicode": "1f3eb", + "unicode_alternates": "", + "name": "school", + "shortname": ":school:", + "category": "travel", + "emoji_order": "582", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building" + ] + }, + "love_hotel": { + "unicode": "1f3e9", + "unicode_alternates": "", + "name": "love hotel", + "shortname": ":love_hotel:", + "category": "travel", + "emoji_order": "583", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "love" + ] + }, + "wedding": { + "unicode": "1f492", + "unicode_alternates": "", + "name": "wedding", + "shortname": ":wedding:", + "category": "travel", + "emoji_order": "584", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "wedding", + "building", + "love", + "parties", + "parties" + ] + }, + "classical_building": { + "unicode": "1f3db", + "unicode_alternates": "1f3db-fe0f", + "name": "classical building", + "shortname": ":classical_building:", + "category": "travel", + "emoji_order": "585", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "travel", + "vacation" + ] + }, + "church": { + "unicode": "26ea", + "unicode_alternates": "26ea-fe0f", + "name": "church", + "shortname": ":church:", + "category": "travel", + "emoji_order": "586", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "wedding", + "religion", + "building", + "condolence", + "condolence" + ] + }, + "mosque": { + "unicode": "1f54c", + "unicode_alternates": "", + "name": "mosque", + "shortname": ":mosque:", + "category": "travel", + "emoji_order": "587", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "religion", + "building", + "vacation", + "condolence", + "condolence" + ] + }, + "synagogue": { + "unicode": "1f54d", + "unicode_alternates": "", + "name": "synagogue", + "shortname": ":synagogue:", + "category": "travel", + "emoji_order": "588", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "religion", + "building", + "travel", + "vacation", + "condolence", + "condolence" + ] + }, + "kaaba": { + "unicode": "1f54b", + "unicode_alternates": "", + "name": "kaaba", + "shortname": ":kaaba:", + "category": "travel", + "emoji_order": "589", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "religion", + "building", + "condolence", + "condolence" + ] + }, + "shinto_shrine": { + "unicode": "26e9", + "unicode_alternates": "26e9-fe0f", + "name": "shinto shrine", + "shortname": ":shinto_shrine:", + "category": "travel", + "emoji_order": "590", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "places", + "building", + "travel", + "vacation" + ] + }, + "watch": { + "unicode": "231a", + "unicode_alternates": "231a-fe0f", + "name": "watch", + "shortname": ":watch:", + "category": "objects", + "emoji_order": "591", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "time" + ] + }, + "iphone": { + "unicode": "1f4f1", + "unicode_alternates": "", + "name": "mobile phone", + "shortname": ":iphone:", + "category": "objects", + "emoji_order": "592", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "phone", + "selfie", + "selfie" + ] + }, + "calling": { + "unicode": "1f4f2", + "unicode_alternates": "", + "name": "mobile phone with rightwards arrow at left", + "shortname": ":calling:", + "category": "objects", + "emoji_order": "593", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "phone", + "selfie", + "selfie" + ] + }, + "computer": { + "unicode": "1f4bb", + "unicode_alternates": "", + "name": "personal computer", + "shortname": ":computer:", + "category": "objects", + "emoji_order": "594", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "work", + "office" + ] + }, + "keyboard": { + "unicode": "2328", + "unicode_alternates": "2328-fe0f", + "name": "keyboard", + "shortname": ":keyboard:", + "category": "objects", + "emoji_order": "595", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "work", + "office" + ] + }, + "desktop": { + "unicode": "1f5a5", + "unicode_alternates": "1f5a5-fe0f", + "name": "desktop computer", + "shortname": ":desktop:", + "category": "objects", + "emoji_order": "596", + "aliases": [ + ":desktop_computer:" + ], + "aliases_ascii": [], + "keywords": [ + "electronics", + "work" + ] + }, + "printer": { + "unicode": "1f5a8", + "unicode_alternates": "1f5a8-fe0f", + "name": "printer", + "shortname": ":printer:", + "category": "objects", + "emoji_order": "597", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "work", + "office" + ] + }, + "mouse_three_button": { + "unicode": "1f5b1", + "unicode_alternates": "1f5b1-fe0f", + "name": "three button mouse", + "shortname": ":mouse_three_button:", + "category": "objects", + "emoji_order": "598", + "aliases": [ + ":three_button_mouse:" + ], + "aliases_ascii": [], + "keywords": [ + "electronics", + "work", + "game", + "office" + ] + }, + "trackball": { + "unicode": "1f5b2", + "unicode_alternates": "1f5b2-fe0f", + "name": "trackball", + "shortname": ":trackball:", + "category": "objects", + "emoji_order": "599", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "work", + "game", + "office" + ] + }, + "joystick": { + "unicode": "1f579", + "unicode_alternates": "1f579-fe0f", + "name": "joystick", + "shortname": ":joystick:", + "category": "objects", + "emoji_order": "600", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "game", + "boys night", + "boys night" + ] + }, + "compression": { + "unicode": "1f5dc", + "unicode_alternates": "1f5dc-fe0f", + "name": "compression", + "shortname": ":compression:", + "category": "objects", + "emoji_order": "601", + "aliases": [], + "aliases_ascii": [], + "keywords": [] + }, + "minidisc": { + "unicode": "1f4bd", + "unicode_alternates": "", + "name": "minidisc", + "shortname": ":minidisc:", + "category": "objects", + "emoji_order": "602", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics" + ] + }, + "floppy_disk": { + "unicode": "1f4be", + "unicode_alternates": "", + "name": "floppy disk", + "shortname": ":floppy_disk:", + "category": "objects", + "emoji_order": "603", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "office" + ] + }, + "cd": { + "unicode": "1f4bf", + "unicode_alternates": "", + "name": "optical disc", + "shortname": ":cd:", + "category": "objects", + "emoji_order": "604", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics" + ] + }, + "dvd": { + "unicode": "1f4c0", + "unicode_alternates": "", + "name": "dvd", + "shortname": ":dvd:", + "category": "objects", + "emoji_order": "605", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics" + ] + }, + "vhs": { + "unicode": "1f4fc", + "unicode_alternates": "", + "name": "videocassette", + "shortname": ":vhs:", + "category": "objects", + "emoji_order": "606", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics" + ] + }, + "camera": { + "unicode": "1f4f7", + "unicode_alternates": "", + "name": "camera", + "shortname": ":camera:", + "category": "objects", + "emoji_order": "607", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "camera", + "selfie", + "selfie" + ] + }, + "camera_with_flash": { + "unicode": "1f4f8", + "unicode_alternates": "", + "name": "camera with flash", + "shortname": ":camera_with_flash:", + "category": "objects", + "emoji_order": "608", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "camera" + ] + }, + "video_camera": { + "unicode": "1f4f9", + "unicode_alternates": "", + "name": "video camera", + "shortname": ":video_camera:", + "category": "objects", + "emoji_order": "609", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "camera", + "movie" + ] + }, + "movie_camera": { + "unicode": "1f3a5", + "unicode_alternates": "", + "name": "movie camera", + "shortname": ":movie_camera:", + "category": "objects", + "emoji_order": "610", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "camera", + "movie" + ] + }, + "projector": { + "unicode": "1f4fd", + "unicode_alternates": "1f4fd-fe0f", + "name": "film projector", + "shortname": ":projector:", + "category": "objects", + "emoji_order": "611", + "aliases": [ + ":film_projector:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "camera", + "movie" + ] + }, + "film_frames": { + "unicode": "1f39e", + "unicode_alternates": "1f39e-fe0f", + "name": "film frames", + "shortname": ":film_frames:", + "category": "objects", + "emoji_order": "612", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "camera", + "movie" + ] + }, + "telephone_receiver": { + "unicode": "1f4de", + "unicode_alternates": "", + "name": "telephone receiver", + "shortname": ":telephone_receiver:", + "category": "objects", + "emoji_order": "613", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "phone" + ] + }, + "telephone": { + "unicode": "260e", + "unicode_alternates": "260e-fe0f", + "name": "black telephone", + "shortname": ":telephone:", + "category": "objects", + "emoji_order": "614", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "phone" + ] + }, + "pager": { + "unicode": "1f4df", + "unicode_alternates": "", + "name": "pager", + "shortname": ":pager:", + "category": "objects", + "emoji_order": "615", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "work" + ] + }, + "fax": { + "unicode": "1f4e0", + "unicode_alternates": "", + "name": "fax machine", + "shortname": ":fax:", + "category": "objects", + "emoji_order": "616", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "work", + "office" + ] + }, + "tv": { + "unicode": "1f4fa", + "unicode_alternates": "", + "name": "television", + "shortname": ":tv:", + "category": "objects", + "emoji_order": "617", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics" + ] + }, + "radio": { + "unicode": "1f4fb", + "unicode_alternates": "", + "name": "radio", + "shortname": ":radio:", + "category": "objects", + "emoji_order": "618", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics" + ] + }, + "microphone2": { + "unicode": "1f399", + "unicode_alternates": "1f399-fe0f", + "name": "studio microphone", + "shortname": ":microphone2:", + "category": "objects", + "emoji_order": "619", + "aliases": [ + ":studio_microphone:" + ], + "aliases_ascii": [], + "keywords": [ + "electronics", + "object" + ] + }, + "level_slider": { + "unicode": "1f39a", + "unicode_alternates": "1f39a-fe0f", + "name": "level slider", + "shortname": ":level_slider:", + "category": "objects", + "emoji_order": "620", + "aliases": [], + "aliases_ascii": [], + "keywords": [] + }, + "control_knobs": { + "unicode": "1f39b", + "unicode_alternates": "1f39b-fe0f", + "name": "control knobs", + "shortname": ":control_knobs:", + "category": "objects", + "emoji_order": "621", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "time" + ] + }, + "stopwatch": { + "unicode": "23f1", + "unicode_alternates": "23f1-fe0f", + "name": "stopwatch", + "shortname": ":stopwatch:", + "category": "objects", + "emoji_order": "622", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "time" + ] + }, + "timer": { + "unicode": "23f2", + "unicode_alternates": "23f2-fe0f", + "name": "timer clock", + "shortname": ":timer:", + "category": "objects", + "emoji_order": "623", + "aliases": [ + ":timer_clock:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "time" + ] + }, + "alarm_clock": { + "unicode": "23f0", + "unicode_alternates": "", + "name": "alarm clock", + "shortname": ":alarm_clock:", + "category": "objects", + "emoji_order": "624", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "time" + ] + }, + "clock": { + "unicode": "1f570", + "unicode_alternates": "1f570-fe0f", + "name": "mantlepiece clock", + "shortname": ":clock:", + "category": "objects", + "emoji_order": "625", + "aliases": [ + ":mantlepiece_clock:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "time" + ] + }, + "hourglass_flowing_sand": { + "unicode": "23f3", + "unicode_alternates": "", + "name": "hourglass with flowing sand", + "shortname": ":hourglass_flowing_sand:", + "category": "objects", + "emoji_order": "626", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "time" + ] + }, + "hourglass": { + "unicode": "231b", + "unicode_alternates": "231b-fe0f", + "name": "hourglass", + "shortname": ":hourglass:", + "category": "objects", + "emoji_order": "627", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "time" + ] + }, + "satellite": { + "unicode": "1f4e1", + "unicode_alternates": "", + "name": "satellite antenna", + "shortname": ":satellite:", + "category": "objects", + "emoji_order": "628", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "battery": { + "unicode": "1f50b", + "unicode_alternates": "", + "name": "battery", + "shortname": ":battery:", + "category": "objects", + "emoji_order": "629", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "electric_plug": { + "unicode": "1f50c", + "unicode_alternates": "", + "name": "electric plug", + "shortname": ":electric_plug:", + "category": "objects", + "emoji_order": "630", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics" + ] + }, + "bulb": { + "unicode": "1f4a1", + "unicode_alternates": "", + "name": "electric light bulb", + "shortname": ":bulb:", + "category": "objects", + "emoji_order": "631", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "science" + ] + }, + "flashlight": { + "unicode": "1f526", + "unicode_alternates": "", + "name": "electric torch", + "shortname": ":flashlight:", + "category": "objects", + "emoji_order": "632", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "electronics", + "object" + ] + }, + "candle": { + "unicode": "1f56f", + "unicode_alternates": "1f56f-fe0f", + "name": "candle", + "shortname": ":candle:", + "category": "objects", + "emoji_order": "633", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "wastebasket": { + "unicode": "1f5d1", + "unicode_alternates": "1f5d1-fe0f", + "name": "wastebasket", + "shortname": ":wastebasket:", + "category": "objects", + "emoji_order": "634", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "work" + ] + }, + "oil": { + "unicode": "1f6e2", + "unicode_alternates": "1f6e2-fe0f", + "name": "oil drum", + "shortname": ":oil:", + "category": "objects", + "emoji_order": "635", + "aliases": [ + ":oil_drum:" + ], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "money_with_wings": { + "unicode": "1f4b8", + "unicode_alternates": "", + "name": "money with wings", + "shortname": ":money_with_wings:", + "category": "objects", + "emoji_order": "636", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "money", + "money", + "boys night", + "boys night" + ] + }, + "dollar": { + "unicode": "1f4b5", + "unicode_alternates": "", + "name": "banknote with dollar sign", + "shortname": ":dollar:", + "category": "objects", + "emoji_order": "637", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "money", + "money" + ] + }, + "yen": { + "unicode": "1f4b4", + "unicode_alternates": "", + "name": "banknote with yen sign", + "shortname": ":yen:", + "category": "objects", + "emoji_order": "638", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "money", + "money" + ] + }, + "euro": { + "unicode": "1f4b6", + "unicode_alternates": "", + "name": "banknote with euro sign", + "shortname": ":euro:", + "category": "objects", + "emoji_order": "639", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "money", + "money" + ] + }, + "pound": { + "unicode": "1f4b7", + "unicode_alternates": "", + "name": "banknote with pound sign", + "shortname": ":pound:", + "category": "objects", + "emoji_order": "640", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "money", + "money" + ] + }, + "moneybag": { + "unicode": "1f4b0", + "unicode_alternates": "", + "name": "money bag", + "shortname": ":moneybag:", + "category": "objects", + "emoji_order": "641", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "bag", + "award", + "money", + "money" + ] + }, + "credit_card": { + "unicode": "1f4b3", + "unicode_alternates": "", + "name": "credit card", + "shortname": ":credit_card:", + "category": "objects", + "emoji_order": "642", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "money", + "money", + "boys night", + "boys night" + ] + }, + "gem": { + "unicode": "1f48e", + "unicode_alternates": "", + "name": "gem stone", + "shortname": ":gem:", + "category": "objects", + "emoji_order": "643", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "gem" + ] + }, + "scales": { + "unicode": "2696", + "unicode_alternates": "2696-fe0f", + "name": "scales", + "shortname": ":scales:", + "category": "objects", + "emoji_order": "644", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "wrench": { + "unicode": "1f527", + "unicode_alternates": "", + "name": "wrench", + "shortname": ":wrench:", + "category": "objects", + "emoji_order": "645", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "tool" + ] + }, + "hammer": { + "unicode": "1f528", + "unicode_alternates": "", + "name": "hammer", + "shortname": ":hammer:", + "category": "objects", + "emoji_order": "646", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "tool", + "weapon" + ] + }, + "hammer_pick": { + "unicode": "2692", + "unicode_alternates": "2692-fe0f", + "name": "hammer and pick", + "shortname": ":hammer_pick:", + "category": "objects", + "emoji_order": "647", + "aliases": [ + ":hammer_and_pick:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "tool", + "weapon" + ] + }, + "tools": { + "unicode": "1f6e0", + "unicode_alternates": "1f6e0-fe0f", + "name": "hammer and wrench", + "shortname": ":tools:", + "category": "objects", + "emoji_order": "648", + "aliases": [ + ":hammer_and_wrench:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "tool" + ] + }, + "pick": { + "unicode": "26cf", + "unicode_alternates": "26cf-fe0f", + "name": "pick", + "shortname": ":pick:", + "category": "objects", + "emoji_order": "649", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "tool", + "weapon" + ] + }, + "nut_and_bolt": { + "unicode": "1f529", + "unicode_alternates": "", + "name": "nut and bolt", + "shortname": ":nut_and_bolt:", + "category": "objects", + "emoji_order": "650", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "tool", + "nutcase", + "nutcase" + ] + }, + "gear": { + "unicode": "2699", + "unicode_alternates": "2699-fe0f", + "name": "gear", + "shortname": ":gear:", + "category": "objects", + "emoji_order": "651", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "tool" + ] + }, + "chains": { + "unicode": "26d3", + "unicode_alternates": "26d3-fe0f", + "name": "chains", + "shortname": ":chains:", + "category": "objects", + "emoji_order": "652", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "tool" + ] + }, + "gun": { + "unicode": "1f52b", + "unicode_alternates": "", + "name": "pistol", + "shortname": ":gun:", + "category": "objects", + "emoji_order": "653", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "weapon", + "dead", + "gun", + "sarcastic", + "sarcastic" + ] + }, + "bomb": { + "unicode": "1f4a3", + "unicode_alternates": "", + "name": "bomb", + "shortname": ":bomb:", + "category": "objects", + "emoji_order": "654", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "weapon", + "dead", + "blast", + "blast" + ] + }, + "knife": { + "unicode": "1f52a", + "unicode_alternates": "", + "name": "hocho", + "shortname": ":knife:", + "category": "objects", + "emoji_order": "655", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "weapon" + ] + }, + "dagger": { + "unicode": "1f5e1", + "unicode_alternates": "1f5e1-fe0f", + "name": "dagger knife", + "shortname": ":dagger:", + "category": "objects", + "emoji_order": "656", + "aliases": [ + ":dagger_knife:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "weapon" + ] + }, + "crossed_swords": { + "unicode": "2694", + "unicode_alternates": "2694-fe0f", + "name": "crossed swords", + "shortname": ":crossed_swords:", + "category": "objects", + "emoji_order": "657", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "weapon" + ] + }, + "shield": { + "unicode": "1f6e1", + "unicode_alternates": "1f6e1-fe0f", + "name": "shield", + "shortname": ":shield:", + "category": "objects", + "emoji_order": "658", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "smoking": { + "unicode": "1f6ac", + "unicode_alternates": "", + "name": "smoking symbol", + "shortname": ":smoking:", + "category": "objects", + "emoji_order": "659", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "symbol", + "drugs", + "drugs", + "smoking", + "smoking" + ] + }, + "skull_crossbones": { + "unicode": "2620", + "unicode_alternates": "2620-fe0f", + "name": "skull and crossbones", + "shortname": ":skull_crossbones:", + "category": "objects", + "emoji_order": "660", + "aliases": [ + ":skull_and_crossbones:" + ], + "aliases_ascii": [], + "keywords": [ + "symbol", + "dead", + "skull" + ] + }, + "coffin": { + "unicode": "26b0", + "unicode_alternates": "26b0-fe0f", + "name": "coffin", + "shortname": ":coffin:", + "category": "objects", + "emoji_order": "661", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "dead", + "rip", + "rip" + ] + }, + "urn": { + "unicode": "26b1", + "unicode_alternates": "26b1-fe0f", + "name": "funeral urn", + "shortname": ":urn:", + "category": "objects", + "emoji_order": "662", + "aliases": [ + ":funeral_urn:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "dead", + "rip", + "rip" + ] + }, + "amphora": { + "unicode": "1f3fa", + "unicode_alternates": "", + "name": "amphora", + "shortname": ":amphora:", + "category": "objects", + "emoji_order": "663", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "crystal_ball": { + "unicode": "1f52e", + "unicode_alternates": "", + "name": "crystal ball", + "shortname": ":crystal_ball:", + "category": "objects", + "emoji_order": "664", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "ball" + ] + }, + "prayer_beads": { + "unicode": "1f4ff", + "unicode_alternates": "", + "name": "prayer beads", + "shortname": ":prayer_beads:", + "category": "objects", + "emoji_order": "665", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "rosary" + ] + }, + "barber": { + "unicode": "1f488", + "unicode_alternates": "", + "name": "barber pole", + "shortname": ":barber:", + "category": "objects", + "emoji_order": "666", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "alembic": { + "unicode": "2697", + "unicode_alternates": "2697-fe0f", + "name": "alembic", + "shortname": ":alembic:", + "category": "objects", + "emoji_order": "667", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "science" + ] + }, + "telescope": { + "unicode": "1f52d", + "unicode_alternates": "", + "name": "telescope", + "shortname": ":telescope:", + "category": "objects", + "emoji_order": "668", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "space", + "science" + ] + }, + "microscope": { + "unicode": "1f52c", + "unicode_alternates": "", + "name": "microscope", + "shortname": ":microscope:", + "category": "objects", + "emoji_order": "669", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "science" + ] + }, + "hole": { + "unicode": "1f573", + "unicode_alternates": "1f573-fe0f", + "name": "hole", + "shortname": ":hole:", + "category": "objects", + "emoji_order": "670", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "pill": { + "unicode": "1f48a", + "unicode_alternates": "", + "name": "pill", + "shortname": ":pill:", + "category": "objects", + "emoji_order": "671", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "health", + "drugs", + "drugs" + ] + }, + "syringe": { + "unicode": "1f489", + "unicode_alternates": "", + "name": "syringe", + "shortname": ":syringe:", + "category": "objects", + "emoji_order": "672", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "weapon", + "health", + "drugs", + "drugs" + ] + }, + "thermometer": { + "unicode": "1f321", + "unicode_alternates": "1f321-fe0f", + "name": "thermometer", + "shortname": ":thermometer:", + "category": "objects", + "emoji_order": "673", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "science", + "health", + "hot", + "hot" + ] + }, + "label": { + "unicode": "1f3f7", + "unicode_alternates": "1f3f7-fe0f", + "name": "label", + "shortname": ":label:", + "category": "objects", + "emoji_order": "674", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "bookmark": { + "unicode": "1f516", + "unicode_alternates": "", + "name": "bookmark", + "shortname": ":bookmark:", + "category": "objects", + "emoji_order": "675", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "book" + ] + }, + "toilet": { + "unicode": "1f6bd", + "unicode_alternates": "", + "name": "toilet", + "shortname": ":toilet:", + "category": "objects", + "emoji_order": "676", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "bathroom" + ] + }, + "shower": { + "unicode": "1f6bf", + "unicode_alternates": "", + "name": "shower", + "shortname": ":shower:", + "category": "objects", + "emoji_order": "677", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "bathroom" + ] + }, + "bathtub": { + "unicode": "1f6c1", + "unicode_alternates": "", + "name": "bathtub", + "shortname": ":bathtub:", + "category": "objects", + "emoji_order": "678", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "bathroom", + "tired", + "steam", + "steam" + ] + }, + "key": { + "unicode": "1f511", + "unicode_alternates": "", + "name": "key", + "shortname": ":key:", + "category": "objects", + "emoji_order": "679", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "lock" + ] + }, + "key2": { + "unicode": "1f5dd", + "unicode_alternates": "1f5dd-fe0f", + "name": "old key", + "shortname": ":key2:", + "category": "objects", + "emoji_order": "680", + "aliases": [ + ":old_key:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "lock" + ] + }, + "couch": { + "unicode": "1f6cb", + "unicode_alternates": "1f6cb-fe0f", + "name": "couch and lamp", + "shortname": ":couch:", + "category": "objects", + "emoji_order": "681", + "aliases": [ + ":couch_and_lamp:" + ], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "sleeping_accommodation": { + "unicode": "1f6cc", + "unicode_alternates": "", + "name": "sleeping accommodation", + "shortname": ":sleeping_accommodation:", + "category": "objects", + "emoji_order": "682", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "tired" + ] + }, + "bed": { + "unicode": "1f6cf", + "unicode_alternates": "1f6cf-fe0f", + "name": "bed", + "shortname": ":bed:", + "category": "objects", + "emoji_order": "683", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "tired" + ] + }, + "door": { + "unicode": "1f6aa", + "unicode_alternates": "", + "name": "door", + "shortname": ":door:", + "category": "objects", + "emoji_order": "684", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "bellhop": { + "unicode": "1f6ce", + "unicode_alternates": "1f6ce-fe0f", + "name": "bellhop bell", + "shortname": ":bellhop:", + "category": "objects", + "emoji_order": "685", + "aliases": [ + ":bellhop_bell:" + ], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "frame_photo": { + "unicode": "1f5bc", + "unicode_alternates": "1f5bc-fe0f", + "name": "frame with picture", + "shortname": ":frame_photo:", + "category": "objects", + "emoji_order": "686", + "aliases": [ + ":frame_with_picture:" + ], + "aliases_ascii": [], + "keywords": [ + "travel", + "vacation" + ] + }, + "map": { + "unicode": "1f5fa", + "unicode_alternates": "1f5fa-fe0f", + "name": "world map", + "shortname": ":map:", + "category": "objects", + "emoji_order": "687", + "aliases": [ + ":world_map:" + ], + "aliases_ascii": [], + "keywords": [ + "travel", + "map", + "vacation" + ] + }, + "beach_umbrella": { + "unicode": "26f1", + "unicode_alternates": "26f1-fe0f", + "name": "umbrella on ground", + "shortname": ":beach_umbrella:", + "category": "objects", + "emoji_order": "688", + "aliases": [ + ":umbrella_on_ground:" + ], + "aliases_ascii": [], + "keywords": [ + "travel", + "vacation", + "tropical" + ] + }, + "moyai": { + "unicode": "1f5ff", + "unicode_alternates": "", + "name": "moyai", + "shortname": ":moyai:", + "category": "objects", + "emoji_order": "689", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "travel", + "vacation" + ] + }, + "shopping_bags": { + "unicode": "1f6cd", + "unicode_alternates": "1f6cd-fe0f", + "name": "shopping bags", + "shortname": ":shopping_bags:", + "category": "objects", + "emoji_order": "690", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "birthday", + "parties", + "parties" + ] + }, + "balloon": { + "unicode": "1f388", + "unicode_alternates": "", + "name": "balloon", + "shortname": ":balloon:", + "category": "objects", + "emoji_order": "691", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "birthday", + "good", + "good", + "parties", + "parties" + ] + }, + "flags": { + "unicode": "1f38f", + "unicode_alternates": "", + "name": "carp streamer", + "shortname": ":flags:", + "category": "objects", + "emoji_order": "692", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "japan" + ] + }, + "ribbon": { + "unicode": "1f380", + "unicode_alternates": "", + "name": "ribbon", + "shortname": ":ribbon:", + "category": "objects", + "emoji_order": "693", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "gift", + "birthday" + ] + }, + "gift": { + "unicode": "1f381", + "unicode_alternates": "", + "name": "wrapped present", + "shortname": ":gift:", + "category": "objects", + "emoji_order": "694", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "gift", + "birthday", + "holidays", + "christmas", + "parties", + "parties" + ] + }, + "confetti_ball": { + "unicode": "1f38a", + "unicode_alternates": "", + "name": "confetti ball", + "shortname": ":confetti_ball:", + "category": "objects", + "emoji_order": "695", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "birthday", + "holidays", + "cheers", + "girls night", + "girls night", + "boys night", + "boys night", + "parties", + "parties" + ] + }, + "tada": { + "unicode": "1f389", + "unicode_alternates": "", + "name": "party popper", + "shortname": ":tada:", + "category": "objects", + "emoji_order": "696", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "birthday", + "holidays", + "cheers", + "good", + "good", + "girls night", + "girls night", + "boys night", + "boys night", + "parties", + "parties" + ] + }, + "dolls": { + "unicode": "1f38e", + "unicode_alternates": "", + "name": "japanese dolls", + "shortname": ":dolls:", + "category": "objects", + "emoji_order": "697", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "people", + "japan" + ] + }, + "wind_chime": { + "unicode": "1f390", + "unicode_alternates": "", + "name": "wind chime", + "shortname": ":wind_chime:", + "category": "objects", + "emoji_order": "698", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "japan" + ] + }, + "crossed_flags": { + "unicode": "1f38c", + "unicode_alternates": "", + "name": "crossed flags", + "shortname": ":crossed_flags:", + "category": "objects", + "emoji_order": "699", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "japan" + ] + }, + "izakaya_lantern": { + "unicode": "1f3ee", + "unicode_alternates": "", + "name": "izakaya lantern", + "shortname": ":izakaya_lantern:", + "category": "objects", + "emoji_order": "700", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "japan" + ] + }, + "envelope": { + "unicode": "2709", + "unicode_alternates": "2709-fe0f", + "name": "envelope", + "shortname": ":envelope:", + "category": "objects", + "emoji_order": "701", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office", + "write" + ] + }, + "envelope_with_arrow": { + "unicode": "1f4e9", + "unicode_alternates": "", + "name": "envelope with downwards arrow above", + "shortname": ":envelope_with_arrow:", + "category": "objects", + "emoji_order": "702", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office" + ] + }, + "incoming_envelope": { + "unicode": "1f4e8", + "unicode_alternates": "", + "name": "incoming envelope", + "shortname": ":incoming_envelope:", + "category": "objects", + "emoji_order": "703", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "e-mail": { + "unicode": "1f4e7", + "unicode_alternates": "", + "name": "e-mail symbol", + "shortname": ":e-mail:", + "category": "objects", + "emoji_order": "704", + "aliases": [ + ":email:" + ], + "aliases_ascii": [], + "keywords": [ + "office" + ] + }, + "love_letter": { + "unicode": "1f48c", + "unicode_alternates": "", + "name": "love letter", + "shortname": ":love_letter:", + "category": "objects", + "emoji_order": "705", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "postbox": { + "unicode": "1f4ee", + "unicode_alternates": "", + "name": "postbox", + "shortname": ":postbox:", + "category": "objects", + "emoji_order": "706", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "mailbox_closed": { + "unicode": "1f4ea", + "unicode_alternates": "", + "name": "closed mailbox with lowered flag", + "shortname": ":mailbox_closed:", + "category": "objects", + "emoji_order": "707", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office" + ] + }, + "mailbox": { + "unicode": "1f4eb", + "unicode_alternates": "", + "name": "closed mailbox with raised flag", + "shortname": ":mailbox:", + "category": "objects", + "emoji_order": "708", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "mailbox_with_mail": { + "unicode": "1f4ec", + "unicode_alternates": "", + "name": "open mailbox with raised flag", + "shortname": ":mailbox_with_mail:", + "category": "objects", + "emoji_order": "709", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "mailbox_with_no_mail": { + "unicode": "1f4ed", + "unicode_alternates": "", + "name": "open mailbox with lowered flag", + "shortname": ":mailbox_with_no_mail:", + "category": "objects", + "emoji_order": "710", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "package": { + "unicode": "1f4e6", + "unicode_alternates": "", + "name": "package", + "shortname": ":package:", + "category": "objects", + "emoji_order": "711", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "gift", + "office" + ] + }, + "postal_horn": { + "unicode": "1f4ef", + "unicode_alternates": "", + "name": "postal horn", + "shortname": ":postal_horn:", + "category": "objects", + "emoji_order": "712", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "inbox_tray": { + "unicode": "1f4e5", + "unicode_alternates": "", + "name": "inbox tray", + "shortname": ":inbox_tray:", + "category": "objects", + "emoji_order": "713", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "work", + "office" + ] + }, + "outbox_tray": { + "unicode": "1f4e4", + "unicode_alternates": "", + "name": "outbox tray", + "shortname": ":outbox_tray:", + "category": "objects", + "emoji_order": "714", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "work", + "office" + ] + }, + "scroll": { + "unicode": "1f4dc", + "unicode_alternates": "", + "name": "scroll", + "shortname": ":scroll:", + "category": "objects", + "emoji_order": "715", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office" + ] + }, + "page_with_curl": { + "unicode": "1f4c3", + "unicode_alternates": "", + "name": "page with curl", + "shortname": ":page_with_curl:", + "category": "objects", + "emoji_order": "716", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "office", + "write" + ] + }, + "bookmark_tabs": { + "unicode": "1f4d1", + "unicode_alternates": "", + "name": "bookmark tabs", + "shortname": ":bookmark_tabs:", + "category": "objects", + "emoji_order": "717", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "office", + "write" + ] + }, + "bar_chart": { + "unicode": "1f4ca", + "unicode_alternates": "", + "name": "bar chart", + "shortname": ":bar_chart:", + "category": "objects", + "emoji_order": "718", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "work", + "office" + ] + }, + "chart_with_upwards_trend": { + "unicode": "1f4c8", + "unicode_alternates": "", + "name": "chart with upwards trend", + "shortname": ":chart_with_upwards_trend:", + "category": "objects", + "emoji_order": "719", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "work", + "office" + ] + }, + "chart_with_downwards_trend": { + "unicode": "1f4c9", + "unicode_alternates": "", + "name": "chart with downwards trend", + "shortname": ":chart_with_downwards_trend:", + "category": "objects", + "emoji_order": "720", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "work", + "office" + ] + }, + "page_facing_up": { + "unicode": "1f4c4", + "unicode_alternates": "", + "name": "page facing up", + "shortname": ":page_facing_up:", + "category": "objects", + "emoji_order": "721", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "work", + "office", + "write" + ] + }, + "date": { + "unicode": "1f4c5", + "unicode_alternates": "", + "name": "calendar", + "shortname": ":date:", + "category": "objects", + "emoji_order": "722", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office" + ] + }, + "calendar": { + "unicode": "1f4c6", + "unicode_alternates": "", + "name": "tear-off calendar", + "shortname": ":calendar:", + "category": "objects", + "emoji_order": "723", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office" + ] + }, + "calendar_spiral": { + "unicode": "1f5d3", + "unicode_alternates": "1f5d3-fe0f", + "name": "spiral calendar pad", + "shortname": ":calendar_spiral:", + "category": "objects", + "emoji_order": "724", + "aliases": [ + ":spiral_calendar_pad:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "office" + ] + }, + "card_index": { + "unicode": "1f4c7", + "unicode_alternates": "", + "name": "card index", + "shortname": ":card_index:", + "category": "objects", + "emoji_order": "725", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "work", + "office" + ] + }, + "card_box": { + "unicode": "1f5c3", + "unicode_alternates": "1f5c3-fe0f", + "name": "card file box", + "shortname": ":card_box:", + "category": "objects", + "emoji_order": "726", + "aliases": [ + ":card_file_box:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "work", + "office" + ] + }, + "ballot_box": { + "unicode": "1f5f3", + "unicode_alternates": "1f5f3-fe0f", + "name": "ballot box with ballot", + "shortname": ":ballot_box:", + "category": "objects", + "emoji_order": "727", + "aliases": [ + ":ballot_box_with_ballot:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "office" + ] + }, + "file_cabinet": { + "unicode": "1f5c4", + "unicode_alternates": "1f5c4-fe0f", + "name": "file cabinet", + "shortname": ":file_cabinet:", + "category": "objects", + "emoji_order": "728", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "work", + "office" + ] + }, + "clipboard": { + "unicode": "1f4cb", + "unicode_alternates": "", + "name": "clipboard", + "shortname": ":clipboard:", + "category": "objects", + "emoji_order": "729", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "work", + "office", + "write" + ] + }, + "notepad_spiral": { + "unicode": "1f5d2", + "unicode_alternates": "1f5d2-fe0f", + "name": "spiral note pad", + "shortname": ":notepad_spiral:", + "category": "objects", + "emoji_order": "730", + "aliases": [ + ":spiral_note_pad:" + ], + "aliases_ascii": [], + "keywords": [ + "work", + "office", + "write" + ] + }, + "file_folder": { + "unicode": "1f4c1", + "unicode_alternates": "", + "name": "file folder", + "shortname": ":file_folder:", + "category": "objects", + "emoji_order": "731", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "work", + "office" + ] + }, + "open_file_folder": { + "unicode": "1f4c2", + "unicode_alternates": "", + "name": "open file folder", + "shortname": ":open_file_folder:", + "category": "objects", + "emoji_order": "732", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "work", + "office" + ] + }, + "dividers": { + "unicode": "1f5c2", + "unicode_alternates": "1f5c2-fe0f", + "name": "card index dividers", + "shortname": ":dividers:", + "category": "objects", + "emoji_order": "733", + "aliases": [ + ":card_index_dividers:" + ], + "aliases_ascii": [], + "keywords": [ + "work", + "office" + ] + }, + "newspaper2": { + "unicode": "1f5de", + "unicode_alternates": "1f5de-fe0f", + "name": "rolled-up newspaper", + "shortname": ":newspaper2:", + "category": "objects", + "emoji_order": "734", + "aliases": [ + ":rolled_up_newspaper:" + ], + "aliases_ascii": [], + "keywords": [ + "office", + "write" + ] + }, + "newspaper": { + "unicode": "1f4f0", + "unicode_alternates": "", + "name": "newspaper", + "shortname": ":newspaper:", + "category": "objects", + "emoji_order": "735", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "office", + "write" + ] + }, + "notebook": { + "unicode": "1f4d3", + "unicode_alternates": "", + "name": "notebook", + "shortname": ":notebook:", + "category": "objects", + "emoji_order": "736", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office", + "write" + ] + }, + "closed_book": { + "unicode": "1f4d5", + "unicode_alternates": "", + "name": "closed book", + "shortname": ":closed_book:", + "category": "objects", + "emoji_order": "737", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office", + "write", + "book" + ] + }, + "green_book": { + "unicode": "1f4d7", + "unicode_alternates": "", + "name": "green book", + "shortname": ":green_book:", + "category": "objects", + "emoji_order": "738", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office", + "book" + ] + }, + "blue_book": { + "unicode": "1f4d8", + "unicode_alternates": "", + "name": "blue book", + "shortname": ":blue_book:", + "category": "objects", + "emoji_order": "739", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office", + "write", + "book" + ] + }, + "orange_book": { + "unicode": "1f4d9", + "unicode_alternates": "", + "name": "orange book", + "shortname": ":orange_book:", + "category": "objects", + "emoji_order": "740", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office", + "write", + "book" + ] + }, + "notebook_with_decorative_cover": { + "unicode": "1f4d4", + "unicode_alternates": "", + "name": "notebook with decorative cover", + "shortname": ":notebook_with_decorative_cover:", + "category": "objects", + "emoji_order": "741", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office", + "write" + ] + }, + "ledger": { + "unicode": "1f4d2", + "unicode_alternates": "", + "name": "ledger", + "shortname": ":ledger:", + "category": "objects", + "emoji_order": "742", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office", + "write" + ] + }, + "books": { + "unicode": "1f4da", + "unicode_alternates": "", + "name": "books", + "shortname": ":books:", + "category": "objects", + "emoji_order": "743", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office", + "write", + "book" + ] + }, + "book": { + "unicode": "1f4d6", + "unicode_alternates": "", + "name": "open book", + "shortname": ":book:", + "category": "objects", + "emoji_order": "744", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office", + "write", + "book" + ] + }, + "link": { + "unicode": "1f517", + "unicode_alternates": "", + "name": "link symbol", + "shortname": ":link:", + "category": "objects", + "emoji_order": "745", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "symbol", + "office" + ] + }, + "paperclip": { + "unicode": "1f4ce", + "unicode_alternates": "", + "name": "paperclip", + "shortname": ":paperclip:", + "category": "objects", + "emoji_order": "746", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "work", + "office" + ] + }, + "paperclips": { + "unicode": "1f587", + "unicode_alternates": "1f587-fe0f", + "name": "linked paperclips", + "shortname": ":paperclips:", + "category": "objects", + "emoji_order": "747", + "aliases": [ + ":linked_paperclips:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "work", + "office" + ] + }, + "scissors": { + "unicode": "2702", + "unicode_alternates": "2702-fe0f", + "name": "black scissors", + "shortname": ":scissors:", + "category": "objects", + "emoji_order": "748", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "tool", + "weapon", + "office" + ] + }, + "triangular_ruler": { + "unicode": "1f4d0", + "unicode_alternates": "", + "name": "triangular ruler", + "shortname": ":triangular_ruler:", + "category": "objects", + "emoji_order": "749", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "tool", + "office" + ] + }, + "straight_ruler": { + "unicode": "1f4cf", + "unicode_alternates": "", + "name": "straight ruler", + "shortname": ":straight_ruler:", + "category": "objects", + "emoji_order": "750", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "tool", + "office" + ] + }, + "pushpin": { + "unicode": "1f4cc", + "unicode_alternates": "", + "name": "pushpin", + "shortname": ":pushpin:", + "category": "objects", + "emoji_order": "751", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office" + ] + }, + "round_pushpin": { + "unicode": "1f4cd", + "unicode_alternates": "", + "name": "round pushpin", + "shortname": ":round_pushpin:", + "category": "objects", + "emoji_order": "752", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office" + ] + }, + "triangular_flag_on_post": { + "unicode": "1f6a9", + "unicode_alternates": "", + "name": "triangular flag on post", + "shortname": ":triangular_flag_on_post:", + "category": "objects", + "emoji_order": "753", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "flag_white": { + "unicode": "1f3f3", + "unicode_alternates": "1f3f3-fe0f", + "name": "waving white flag", + "shortname": ":flag_white:", + "category": "objects", + "emoji_order": "754", + "aliases": [ + ":waving_white_flag:" + ], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "flag_black": { + "unicode": "1f3f4", + "unicode_alternates": "", + "name": "waving black flag", + "shortname": ":flag_black:", + "category": "objects", + "emoji_order": "755", + "aliases": [ + ":waving_black_flag:" + ], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "closed_lock_with_key": { + "unicode": "1f510", + "unicode_alternates": "", + "name": "closed lock with key", + "shortname": ":closed_lock_with_key:", + "category": "objects", + "emoji_order": "756", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "lock" + ] + }, + "lock": { + "unicode": "1f512", + "unicode_alternates": "", + "name": "lock", + "shortname": ":lock:", + "category": "objects", + "emoji_order": "757", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "lock" + ] + }, + "unlock": { + "unicode": "1f513", + "unicode_alternates": "", + "name": "open lock", + "shortname": ":unlock:", + "category": "objects", + "emoji_order": "758", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "lock" + ] + }, + "lock_with_ink_pen": { + "unicode": "1f50f", + "unicode_alternates": "", + "name": "lock with ink pen", + "shortname": ":lock_with_ink_pen:", + "category": "objects", + "emoji_order": "759", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "lock" + ] + }, + "pen_ballpoint": { + "unicode": "1f58a", + "unicode_alternates": "1f58a-fe0f", + "name": "lower left ballpoint pen", + "shortname": ":pen_ballpoint:", + "category": "objects", + "emoji_order": "760", + "aliases": [ + ":lower_left_ballpoint_pen:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "office", + "write" + ] + }, + "pen_fountain": { + "unicode": "1f58b", + "unicode_alternates": "1f58b-fe0f", + "name": "lower left fountain pen", + "shortname": ":pen_fountain:", + "category": "objects", + "emoji_order": "761", + "aliases": [ + ":lower_left_fountain_pen:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "office", + "write" + ] + }, + "black_nib": { + "unicode": "2712", + "unicode_alternates": "2712-fe0f", + "name": "black nib", + "shortname": ":black_nib:", + "category": "objects", + "emoji_order": "762", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office", + "write" + ] + }, + "pencil": { + "unicode": "1f4dd", + "unicode_alternates": "", + "name": "memo", + "shortname": ":pencil:", + "category": "objects", + "emoji_order": "763", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "work", + "office", + "write" + ] + }, + "pencil2": { + "unicode": "270f", + "unicode_alternates": "270f-fe0f", + "name": "pencil", + "shortname": ":pencil2:", + "category": "objects", + "emoji_order": "764", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object", + "office", + "write" + ] + }, + "crayon": { + "unicode": "1f58d", + "unicode_alternates": "1f58d-fe0f", + "name": "lower left crayon", + "shortname": ":crayon:", + "category": "objects", + "emoji_order": "765", + "aliases": [ + ":lower_left_crayon:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "office", + "write" + ] + }, + "paintbrush": { + "unicode": "1f58c", + "unicode_alternates": "1f58c-fe0f", + "name": "lower left paintbrush", + "shortname": ":paintbrush:", + "category": "objects", + "emoji_order": "766", + "aliases": [ + ":lower_left_paintbrush:" + ], + "aliases_ascii": [], + "keywords": [ + "object", + "office", + "write" + ] + }, + "mag": { + "unicode": "1f50d", + "unicode_alternates": "", + "name": "left-pointing magnifying glass", + "shortname": ":mag:", + "category": "objects", + "emoji_order": "767", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "mag_right": { + "unicode": "1f50e", + "unicode_alternates": "", + "name": "right-pointing magnifying glass", + "shortname": ":mag_right:", + "category": "objects", + "emoji_order": "768", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "object" + ] + }, + "heart": { + "unicode": "2764", + "unicode_alternates": "2764-fe0f", + "name": "heavy black heart", + "shortname": ":heart:", + "category": "symbols", + "emoji_order": "769", + "aliases": [], + "aliases_ascii": [ + "<3" + ], + "keywords": [ + "love", + "symbol", + "parties", + "parties" + ] + }, + "yellow_heart": { + "unicode": "1f49b", + "unicode_alternates": "", + "name": "yellow heart", + "shortname": ":yellow_heart:", + "category": "symbols", + "emoji_order": "770", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "love", + "symbol" + ] + }, + "green_heart": { + "unicode": "1f49a", + "unicode_alternates": "", + "name": "green heart", + "shortname": ":green_heart:", + "category": "symbols", + "emoji_order": "771", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "love", + "symbol" + ] + }, + "blue_heart": { + "unicode": "1f499", + "unicode_alternates": "", + "name": "blue heart", + "shortname": ":blue_heart:", + "category": "symbols", + "emoji_order": "772", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "love", + "symbol" + ] + }, + "purple_heart": { + "unicode": "1f49c", + "unicode_alternates": "", + "name": "purple heart", + "shortname": ":purple_heart:", + "category": "symbols", + "emoji_order": "773", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "love", + "symbol" + ] + }, + "broken_heart": { + "unicode": "1f494", + "unicode_alternates": "", + "name": "broken heart", + "shortname": ":broken_heart:", + "category": "symbols", + "emoji_order": "774", + "aliases": [], + "aliases_ascii": [ + " +#include +#include +#include + +#include +#include +#include + +#include + +using namespace ::com::sun::star; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::uno; + +class SfxRequest; +class SfxStringItem; +class GDIMetaFile; +class DocumentToGraphicRenderer; +class SfxViewFrame; +struct RedactionTarget; + +namespace i18nutil +{ +struct SearchOptions2; +} + +struct PageMargins +{ + // Page margins in mm100th + sal_Int32 nTop; + sal_Int32 nBottom; + sal_Int32 nLeft; + sal_Int32 nRight; +}; + +/* + * Mostly a bunch of static methods to handle the redaction functionality at + * different points of the process. + **/ +class SfxRedactionHelper +{ +public: + /// Checks to see if the request has a parameter of IsRedactMode:bool=true + static bool isRedactMode(const SfxRequest& rReq); + /* + * Returns the value of the given string param as an OUString + * Returns empty OUString if no param + * */ + static OUString getStringParam(const SfxRequest& rReq, sal_uInt16 nParamId); + /* + * Creates metafiles from the pages of the given document, + * and pushes into the given vector. + * */ + static void getPageMetaFilesFromDoc(std::vector& aMetaFiles, + std::vector<::Size>& aPageSizes, sal_Int32 nPages, + DocumentToGraphicRenderer& aRenderer); + /* + * Creates one shape and one draw page for each gdimetafile, + * and inserts the shapes into the newly created draw pages. + * */ + static void + addPagesToDraw(const uno::Reference& xComponent, sal_Int32 nPages, + const std::vector& aMetaFiles, + const std::vector<::Size>& aPageSizes, const PageMargins& aPageMargins, + const std::vector>& r_aTableTargets, + bool bIsAutoRedact); + /* + * Makes the Redaction toolbar visible to the user. + * Meant to be called after converting a document to a Draw doc + * for redaction purposes. + * */ + static void showRedactionToolbar(const SfxViewFrame* pViewFrame); + + /* + * Used to get the page margins from the original/source Writer document. Then we apply these values to the + * pages inserted into Draw for redaction. + * */ + static PageMargins + getPageMarginsForWriter(const css::uno::Reference& xModel); + + /* + * Used to get the page margins from the original/source Calc document. Then we apply these values to the + * pages inserted into Draw for redaction. + * */ + static PageMargins getPageMarginsForCalc(const css::uno::Reference& xModel); + + /* + * Used to find the text portions to be redacted. Returns a list of rectangles to cover those + * areas to be redacted. Probably the most crucial part of the auto-redaction process. + * */ + static void searchInMetaFile(const RedactionTarget* pRedactionTarget, const GDIMetaFile& rMtf, + std::vector& aRedactionRectangles, + const uno::Reference& xComponent); + + /* + * Draws a redaction rectangle on the draw page referenced with its page number (0-based) + * */ + static void addRedactionRectToPage(const uno::Reference& xComponent, + const uno::Reference& xPage, + const std::vector& aNewRectangles); + + /* + * Search for the given term through the gdimetafile, which has the whole content of a draw page, + * and draw redaction rectangles to the appropriate positions with suitable sizes. + * */ + static void autoRedactPage(const RedactionTarget* pRedactionTarget, + const GDIMetaFile& rGDIMetaFile, + const uno::Reference& xPage, + const uno::Reference& xComponent); + + /// Fill the search options based on the given redaction target + static void fillSearchOptions(i18nutil::SearchOptions2& rSearchOpt, + const RedactionTarget* pTarget); + +private: + static constexpr OUStringLiteral m_aPredefinedTargets[6] = { + "\\b(?:\\d[ -]*?){13,16}\\b", //Credit card numbers + "\\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}\\b", //Email addresses + "\\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" + "\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" + "\\b", //IP addresses + "([12]\\d{3}[./-](0[1-9]|1[0-2])[./" + "-](0[1-9]|[12]\\d|3[01]))|((0[1-9]|[12]\\d|3[01])[./-](0[1-9]|1[0-2])[./" + "-][12]\\d{3})", //Dates (numerical) + "\\s*[a-zA-Z]{2}(?:\\s*\\d\\s*){6}[a-zA-Z]?\\s*", //National Insurance Number (UK) + "([1-9])(?!\\1{2}-\\1{2}-\\1{4})[1-9]{2}-[1-9]{2}-[1-9]{4}" //Social Security Number (US) + }; +}; + +#endif // INCLUDED_CUI_SOURCE_INC_SFXREDACTIONHELPER_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/sfx2/inc/arrdecl.hxx b/sfx2/inc/arrdecl.hxx new file mode 100644 index 000000000..b777fad7a --- /dev/null +++ b/sfx2/inc/arrdecl.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 . + */ +#ifndef INCLUDED_SFX2_INC_ARRDECL_HXX +#define INCLUDED_SFX2_INC_ARRDECL_HXX + +#include +#include + +class SfxFilter; +typedef ::std::vector> SfxFilterList_Impl; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/autoredactdialog.hxx b/sfx2/inc/autoredactdialog.hxx new file mode 100644 index 000000000..d43d88e77 --- /dev/null +++ b/sfx2/inc/autoredactdialog.hxx @@ -0,0 +1,177 @@ +/* -*- 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/. + */ + +#ifndef INCLUDED_SFX2_INC_AUTOREDACTDIALOG_HXX +#define INCLUDED_SFX2_INC_AUTOREDACTDIALOG_HXX + +#include +#include +#include +#include + +namespace weld +{ +class Button; +} +namespace weld +{ +class ComboBox; +} +namespace weld +{ +class Label; +} +namespace weld +{ +class Window; +} +namespace weld +{ +class TreeView; +} + +enum RedactionTargetType +{ + REDACTION_TARGET_TEXT, + REDACTION_TARGET_REGEX, + REDACTION_TARGET_PREDEFINED, + REDACTION_TARGET_UNKNOWN +}; + +/// Keeps information for a single redaction target +struct RedactionTarget +{ + OUString sName; + RedactionTargetType sType; + OUString sContent; + bool bCaseSensitive; + bool bWholeWords; + sal_uInt32 nID; +}; + +/// Used to display the targets list +class TargetsTable +{ + std::unique_ptr m_xControl; + int GetRowByTargetName(const OUString& sName); + +public: + TargetsTable(std::unique_ptr xControl); + void InsertTarget(RedactionTarget* pTarget); + void SelectByName(const OUString& sName); + RedactionTarget* GetTargetByName(const OUString& sName); + OUString GetNameProposal() const; + + void unselect_all() { m_xControl->unselect_all(); } + bool has_focus() const { return m_xControl->has_focus(); } + int n_children() const { return m_xControl->n_children(); } + int get_selected_index() const { return m_xControl->get_selected_index(); } + std::vector get_selected_rows() const { return m_xControl->get_selected_rows(); } + void clear() { m_xControl->clear(); } + void remove(int nRow) { m_xControl->remove(nRow); } + void select(int nRow) { m_xControl->select(nRow); } + OUString get_id(int nRow) const { return m_xControl->get_id(nRow); } + + // Sync data on the targets box with the data on the target + void setRowData(int nRowIndex, const RedactionTarget* pTarget); + + //void connect_changed(const Link& rLink) { m_xControl->connect_changed(rLink); } + //void connect_row_activated(const Link& rLink) { m_xControl->connect_row_activated(rLink); } +}; + +namespace sfx2 +{ +class FileDialogHelper; +} + +enum class StartFileDialogType +{ + Open, + SaveAs +}; + +class SfxAutoRedactDialog final : public SfxDialogController +{ + SfxObjectShellLock m_xDocShell; + std::vector> m_aTableTargets; + std::unique_ptr m_pFileDlg; + bool m_bIsValidState; + bool m_bTargetsCopied; + + std::unique_ptr m_xRedactionTargetsLabel; + std::unique_ptr m_xTargetsBox; + std::unique_ptr m_xLoadBtn; + std::unique_ptr m_xSaveBtn; + std::unique_ptr m_xAddBtn; + std::unique_ptr m_xEditBtn; + std::unique_ptr m_xDeleteBtn; + + DECL_LINK(Load, weld::Button&, void); + DECL_LINK(Save, weld::Button&, void); + DECL_LINK(AddHdl, weld::Button&, void); + DECL_LINK(EditHdl, weld::Button&, void); + DECL_LINK(DeleteHdl, weld::Button&, void); + + DECL_LINK(LoadHdl, sfx2::FileDialogHelper*, void); + DECL_LINK(SaveHdl, sfx2::FileDialogHelper*, void); + + void StartFileDialog(StartFileDialogType nType, const OUString& rTitle); + /// Carry out proper addition both to the targets box, and to the tabletargets vector. + void addTarget(RedactionTarget* pTarget); + /// Clear all targets both visually and from the targets vector + void clearTargets(); + +public: + SfxAutoRedactDialog(weld::Window* pParent); + virtual ~SfxAutoRedactDialog() override; + + /// Check if the dialog has any valid redaction targets. + bool hasTargets() const; + /// Check if the dialog is in a valid state. + bool isValidState() const { return m_bIsValidState; } + /** Copies targets vector + * Does a shallow copy. + * Returns true if successful. + */ + bool getTargets(std::vector>& r_aTargets); +}; + +class SfxAddTargetDialog final : public weld::GenericDialogController +{ +private: + std::unique_ptr m_xName; + std::unique_ptr m_xType; + std::unique_ptr m_xLabelContent; + std::unique_ptr m_xContent; + std::unique_ptr m_xLabelPredefContent; + std::unique_ptr m_xPredefContent; + std::unique_ptr m_xCaseSensitive; + std::unique_ptr m_xWholeWords; + + DECL_LINK(SelectTypeHdl, weld::ComboBox&, void); + +public: + SfxAddTargetDialog(weld::Window* pWindow, const OUString& rName); + SfxAddTargetDialog(weld::Window* pWindow, const OUString& sName, + const RedactionTargetType& eTargetType, const OUString& sContent, + bool bCaseSensitive, bool bWholeWords); + + OUString getName() const { return m_xName->get_text(); } + RedactionTargetType getType() const; + OUString getContent() const; + bool isCaseSensitive() const + { + return m_xCaseSensitive->get_state() == TriState::TRISTATE_TRUE; + } + bool isWholeWords() const { return m_xWholeWords->get_state() == TriState::TRISTATE_TRUE; } +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/sfx2/inc/bitmaps.hlst b/sfx2/inc/bitmaps.hlst new file mode 100644 index 000000000..7e97d1219 --- /dev/null +++ b/sfx2/inc/bitmaps.hlst @@ -0,0 +1,94 @@ +/* -*- 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/. + */ + +#ifndef INCLUDED_SFX2_INC_BITMAPS_HRC +#define INCLUDED_SFX2_INC_BITMAPS_HRC + +#define BMP_HELP_TOOLBOX_INDEX_ON "sfx2/res/indexon_small.png" +#define BMP_HELP_TOOLBOX_INDEX_OFF "sfx2/res/indexoff_small.png" +#define BMP_HELP_TOOLBOX_START "res/sc06303.png" +#define BMP_HELP_TOOLBOX_PREV "res/sc06301.png" +#define BMP_HELP_TOOLBOX_NEXT "res/sc06300.png" +#define BMP_HELP_TOOLBOX_PRINT "res/sc05504.png" +#define BMP_HELP_TOOLBOX_BOOKMARKS "sfx2/res/favourite.png" +#define BMP_HELP_TOOLBOX_SEARCHDIALOG "sfx2/res/sc05961.png" +#define BMP_HELP_TOOLBOX_COPY "sfx2/res/sc05711.png" +#define BMP_HELP_CONTENT_BOOK_OPEN "sfx2/res/hlpbookopen.png" +#define BMP_HELP_CONTENT_BOOK_CLOSED "sfx2/res/hlpbookclosed.png" +#define BMP_HELP_CONTENT_DOC "sfx2/res/hlpdoc.png" +#define BMP_HELP_TOOLBOX_L_INDEX_ON "sfx2/res/indexon_big.png" +#define BMP_HELP_TOOLBOX_L_INDEX_OFF "sfx2/res/indexoff_big.png" +#define BMP_HELP_TOOLBOX_L_START "res/lc06303.png" +#define BMP_HELP_TOOLBOX_L_PREV "res/lc06301.png" +#define BMP_HELP_TOOLBOX_L_NEXT "res/lc06300.png" +#define BMP_HELP_TOOLBOX_L_PRINT "res/lc05504.png" +#define BMP_HELP_TOOLBOX_L_BOOKMARKS "sfx2/res/favourite_big.png" +#define BMP_HELP_TOOLBOX_L_SEARCHDIALOG "res/lc05961.png" + +//start, sfx2/source/sidebar/Theme.cxx +#define CHEVRON "sfx2/res/chevron.png" +#define CLOSEDOC "sfx2/res/closedoc.png" +#define GRIP "sfx2/res/grip.png" +#define OPEN_MORE "sfx2/res/symphony/open_more.png" +#define MOREBUTTON "sfx2/res/symphony/morebutton.png" +#define SIDEBAR_3D_LARGE "sfx2/res/symphony/sidebar-3d-large.png" +#define SIDEBAR_3D_SMALL "sfx2/res/symphony/sidebar-3d-small.png" +#define SIDEBAR_ANIMATION_LARGE "sfx2/res/symphony/sidebar-animation-large.png" +#define SIDEBAR_ANIMATION_SMALL "sfx2/res/symphony/sidebar-animation-small.png" +#define SIDEBAR_COLORS_LARGE "sfx2/res/symphony/sidebar-colors-large.png" +#define SIDEBAR_COLORS_SMALL "sfx2/res/symphony/sidebar-colors-small.png" +#define SIDEBAR_EYEDROPPER_LARGE "sfx2/res/symphony/sidebar-eyedropper-large.png" +#define SIDEBAR_EYEDROPPER_SMALL "sfx2/res/symphony/sidebar-eyedropper-small.png" +#define SIDEBAR_GALLERY_LARGE "sfx2/res/symphony/sidebar-gallery-large.png" +#define SIDEBAR_GALLERY_SMALL "sfx2/res/symphony/sidebar-gallery-small.png" +#define SIDEBAR_IMGANIM_LARGE "sfx2/res/symphony/sidebar-imganim-large.png" +#define SIDEBAR_IMGANIM_SMALL "sfx2/res/symphony/sidebar-imganim-small.png" +#define SIDEBAR_NAVIGATOR_LARGE "sfx2/res/symphony/sidebar-navigator-large.png" +#define SIDEBAR_NAVIGATOR_SMALL "sfx2/res/symphony/sidebar-navigator-small.png" +#define SIDEBAR_PROPERTY_LARGE "sfx2/res/symphony/sidebar-property-large.png" +#define SIDEBAR_PROPERTY_SMALL "sfx2/res/symphony/sidebar-property-small.png" +#define SIDEBAR_STYLE_LARGE "sfx2/res/symphony/sidebar-style-large.png" +#define SIDEBAR_STYLE_SMALL "sfx2/res/symphony/sidebar-style-small.png" +#define SIDEBAR_TEMPLATE_LARGE "sfx2/res/symphony/sidebar-template-large.png" +#define SIDEBAR_TEMPLATE_SMALL "sfx2/res/symphony/sidebar-template-small.png" +#define SIDEBAR_TRANSITION_LARGE "sfx2/res/symphony/sidebar-transition-large.png" +#define SIDEBAR_TRANSITION_SMALL "sfx2/res/symphony/sidebar-transition-small.png" +#define SIDEBAR_FUNCTIONS_LARGE "sfx2/res/symphony/sidebar-functions-large.png" +#define SIDEBAR_FUNCTIONS_SMALL "sfx2/res/symphony/sidebar-functions-small.png" +//end, sfx2/source/sidebar/Theme.cxx + +#define SFX_THUMBNAIL_TEXT "res/ott_96_8.png" +#define SFX_THUMBNAIL_SHEET "res/ots_96_8.png" +#define SFX_THUMBNAIL_PRESENTATION "res/otp_96_8.png" +#define SFX_THUMBNAIL_DRAWING "res/otg_96_8.png" +#define SFX_FILE_THUMBNAIL_TEXT "res/odt_48_8.png" +#define SFX_FILE_THUMBNAIL_SHEET "res/ods_48_8.png" +#define SFX_FILE_THUMBNAIL_PRESENTATION "res/odp_48_8.png" +#define SFX_FILE_THUMBNAIL_DRAWING "res/odg_48_8.png" +#define SFX_FILE_THUMBNAIL_DATABASE "res/odb_48_8.png" +#define SFX_FILE_THUMBNAIL_MATH "res/odf_48_8.png" +#define SFX_FILE_THUMBNAIL_DEFAULT "res/mainapp_48_8.png" + +#define BMP_RECENTDOC_REMOVE "res/recentdoc_remove.png" +#define BMP_RECENTDOC_REMOVE_HIGHLIGHTED "res/recentdoc_remove_highlighted.png" +#define BMP_DEFAULT "res/templatestar.png" +#define BMP_ACTION_REFRESH "res/reload.png" + +#define BMP_128X128_CALC_DOC "sfx2/res/128x128_calc_doc-p.png" +#define BMP_128X128_DRAW_DOC "sfx2/res/128x128_draw_doc-p.png" +#define BMP_128X128_IMPRESS_DOC "sfx2/res/128x128_impress_doc-p.png" +#define BMP_128X128_MATH_DOC "sfx2/res/128x128_math_doc-p.png" +#define BMP_128X128_WRITER_DOC "sfx2/res/128x128_writer_doc-p.png" + +#define SFX_BMP_CLOSE_DOC "sfx2/res/closedoc.png" + + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/sfx2/inc/bitset.hxx b/sfx2/inc/bitset.hxx new file mode 100644 index 000000000..3573e9c23 --- /dev/null +++ b/sfx2/inc/bitset.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 . + */ +#ifndef INCLUDED_SFX2_INC_BITSET_HXX +#define INCLUDED_SFX2_INC_BITSET_HXX + +#include + +#include + +class IndexBitSet +{ +private: + sal_uInt16 nBlocks; + std::unique_ptr pBitmap; + + IndexBitSet& operator|=( sal_uInt16 nBit ); + IndexBitSet& operator-=( sal_uInt16 nBit ); + bool Contains( sal_uInt16 nBit ) const; + + IndexBitSet(IndexBitSet const &) = delete; + void operator =(IndexBitSet const &) = delete; + +public: + IndexBitSet(); + ~IndexBitSet(); + + sal_uInt16 GetFreeIndex(); + void ReleaseIndex(sal_uInt16 i){*this-=i;} +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/bluthsndapi.hxx b/sfx2/inc/bluthsndapi.hxx new file mode 100644 index 000000000..c95bccf89 --- /dev/null +++ b/sfx2/inc/bluthsndapi.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/. + */ + +#ifndef INCLUDED_SFX2_INC_BLUTHSNDAPI_HXX +#define INCLUDED_SFX2_INC_BLUTHSNDAPI_HXX + +#include +#include + + +// class SfxBluetoothModel_Impl ----------------------------------------------- + +class SfxBluetoothModel:public SfxMailModel +{ +public: + SendMailResult SaveAndSend( const css::uno::Reference< css::frame::XFrame >& xFrame ); + SendMailResult Send(); +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/charmapcontrol.hxx b/sfx2/inc/charmapcontrol.hxx new file mode 100644 index 000000000..0902f17fa --- /dev/null +++ b/sfx2/inc/charmapcontrol.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 +#include +#include +#include + +class CharmapPopup; + +namespace com::sun::star::frame { class XFrame; } + +class SfxCharmapCtrl final : public WeldToolbarPopup +{ +public: + explicit SfxCharmapCtrl(CharmapPopup* pControl, weld::Widget* pParent); + virtual ~SfxCharmapCtrl() override; + + virtual void GrabFocus() override; + +private: + rtl::Reference m_xControl; + + ScopedVclPtr m_xVirDev; + + std::deque m_aRecentCharList; + std::deque m_aRecentCharFontList; + std::deque m_aFavCharList; + std::deque m_aFavCharFontList; + + SvxCharView m_aRecentCharView[16]; + SvxCharView m_aFavCharView[16]; + std::unique_ptr m_xDlgBtn; + std::unique_ptr m_xRecentCharView[16]; + std::unique_ptr m_xFavCharView[16]; + + DECL_LINK(CharClickHdl, SvxCharView*, void); + DECL_LINK(OpenDlgHdl, weld::Button&, void); + + void getFavCharacterList(); + void updateFavCharControl(); + + void getRecentCharacterList(); //gets both recent char and recent char font list + void updateRecentCharControl(); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/checkin.hxx b/sfx2/inc/checkin.hxx new file mode 100644 index 000000000..78535f7aa --- /dev/null +++ b/sfx2/inc/checkin.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/. + */ + +#pragma once + +#include + +class SfxCheckinDialog final : public weld::GenericDialogController +{ +private: + std::unique_ptr m_xCommentED; + std::unique_ptr m_xMajorCB; + std::unique_ptr m_xOKBtn; + + DECL_LINK(OKHdl, weld::Button&, void); + +public: + SfxCheckinDialog(weld::Window* pParent); + virtual ~SfxCheckinDialog() override; + + OUString GetComment() const; + bool IsMajor() const; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/dinfdlg.hrc b/sfx2/inc/dinfdlg.hrc new file mode 100644 index 000000000..a99ead5b6 --- /dev/null +++ b/sfx2/inc/dinfdlg.hrc @@ -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 . + */ + +#ifndef INCLUDED_SFX2_INC_DINFDLG_HRC +#define INCLUDED_SFX2_INC_DINFDLG_HRC + +#define NC_(Context, String) reinterpret_cast(Context "\004" u8##String) + +const char* SFX_CB_PROPERTY_STRINGARRAY[] = +{ + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Checked by"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Client"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Date completed"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Department"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Destinations"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Disposition"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Division"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Document number"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Editor"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Email"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Forward to"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Group"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Info"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Language"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Mailstop"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Matter"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Office"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Owner"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Project"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Publisher"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Purpose"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Received from"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Recorded by"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Recorded date"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Reference"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Source"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Status"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Telephone number"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "Typist"), + NC_("SFX_CB_PROPERTY_STRINGARRAY", "URL") +}; + +#define CUSTOM_TYPE_UNKNOWN 0 +#define CUSTOM_TYPE_TEXT 1 +#define CUSTOM_TYPE_NUMBER 2 +#define CUSTOM_TYPE_DATE 3 +#define CUSTOM_TYPE_BOOLEAN 4 +#define CUSTOM_TYPE_DURATION 5 +#define CUSTOM_TYPE_DATETIME 6 + +const std::pair SFX_LB_PROPERTY_STRINGARRAY[] = +{ + { NC_("SFX_CB_PROPERTY_STRINGARRAY", "Text") , CUSTOM_TYPE_TEXT }, + { NC_("SFX_CB_PROPERTY_STRINGARRAY", "DateTime") , CUSTOM_TYPE_DATETIME }, + { NC_("SFX_CB_PROPERTY_STRINGARRAY", "Date") , CUSTOM_TYPE_DATE }, + { NC_("SFX_CB_PROPERTY_STRINGARRAY", "Duration") , CUSTOM_TYPE_DURATION }, + { NC_("SFX_CB_PROPERTY_STRINGARRAY", "Number") , CUSTOM_TYPE_NUMBER }, + { NC_("SFX_CB_PROPERTY_STRINGARRAY", "Yes or no") , CUSTOM_TYPE_BOOLEAN } +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/doctempl.hrc b/sfx2/inc/doctempl.hrc new file mode 100644 index 000000000..46773035e --- /dev/null +++ b/sfx2/inc/doctempl.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 . + */ + +#ifndef INCLUDED_SFX2_INC_DOCTEMPL_HRC +#define INCLUDED_SFX2_INC_DOCTEMPL_HRC + +#define NC_(Context, String) reinterpret_cast(Context "\004" u8##String) + +const char* TEMPLATE_LONG_NAMES_ARY[] = +{ + NC_("TEMPLATE_LONG_NAMES_ARY", "My Templates"), + NC_("TEMPLATE_LONG_NAMES_ARY", "Styles"), + NC_("TEMPLATE_LONG_NAMES_ARY", "Business Correspondence"), + NC_("TEMPLATE_LONG_NAMES_ARY", "Other Business Documents"), + NC_("TEMPLATE_LONG_NAMES_ARY", "Personal Correspondence and Documents"), + NC_("TEMPLATE_LONG_NAMES_ARY", "Forms and Contracts"), + NC_("TEMPLATE_LONG_NAMES_ARY", "Finances"), + NC_("TEMPLATE_LONG_NAMES_ARY", "Education"), + NC_("TEMPLATE_LONG_NAMES_ARY", "Presentation Backgrounds"), + NC_("TEMPLATE_LONG_NAMES_ARY", "Presentations"), + NC_("TEMPLATE_LONG_NAMES_ARY", "Miscellaneous"), + NC_("TEMPLATE_LONG_NAMES_ARY", "Labels") +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/emojicontrol.hxx b/sfx2/inc/emojicontrol.hxx new file mode 100644 index 000000000..33d0e021b --- /dev/null +++ b/sfx2/inc/emojicontrol.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/. + */ + +#ifndef INCLUDED_SFX2_INC_EMOJICONTROL_HXX +#define INCLUDED_SFX2_INC_EMOJICONTROL_HXX + +#include +#include +#include +#include + +#define TAB_FONT_SIZE 15 + +namespace com::sun::star::frame { class XFrame; } + +class EmojiPopup; +class EmojiView; +class ThumbnailViewItem; +enum class FILTER_CATEGORY; + +class SfxEmojiControl final : public svtools::ToolbarPopup +{ +public: + explicit SfxEmojiControl(EmojiPopup* pControl, vcl::Window* pParent); + + virtual ~SfxEmojiControl() override; + + virtual void dispose() override; + +private: + void ConvertLabelToUnicode(sal_uInt16 nPageId); + + /// Return filter according to the currently selected tab page. + FILTER_CATEGORY getCurrentFilter() const; + + DECL_LINK(ActivatePageHdl, TabControl*, void); + DECL_STATIC_LINK(SfxEmojiControl, InsertHdl, ThumbnailViewItem*, void); + + VclPtr mpTabControl; + VclPtr mpEmojiView; +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/emojiview.hxx b/sfx2/inc/emojiview.hxx new file mode 100644 index 000000000..4ee37ac6f --- /dev/null +++ b/sfx2/inc/emojiview.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/. + */ + +#pragma once + +#include + +//unicode item defines +#define ITEM_MAX_WIDTH 30 +#define ITEM_MAX_HEIGHT 30 +#define ITEM_PADDING 5 +#define ITEM_MAX_TEXT_LENGTH 10 + +enum class FILTER_CATEGORY +{ + PEOPLE, + NATURE, + FOOD, + ACTIVITY, + TRAVEL, + OBJECTS, + SYMBOLS, + FLAGS, + UNICODE9 +}; + +// Display unicode emojis depending on the category +class ViewFilter_Category final +{ +public: + + ViewFilter_Category (FILTER_CATEGORY rCategory) + : mCategory(rCategory) + {} + + bool operator () (const ThumbnailViewItem *pItem); + + static bool isFilteredCategory(FILTER_CATEGORY filter, const OUString &rCategory); + +private: + + FILTER_CATEGORY mCategory; +}; + + +class EmojiView final : public ThumbnailView +{ +public: + EmojiView ( vcl::Window* pParent); + + virtual ~EmojiView () override; + + // Fill view with emojis + void Populate (); + + void setInsertEmojiHdl (const Link &rLink); + + void AppendItem(const OUString &rTitle, const OUString &rCategory, const OUString &rName ); + +private: + virtual void MouseButtonDown( const MouseEvent& rMEvt ) override; + + virtual void KeyInput( const KeyEvent& rKEvt ) override; + + virtual void ApplySettings(vcl::RenderContext& rRenderContext) override; + + std::string msJSONData; + + Link maInsertEmojiHdl; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/emojiviewitem.hxx b/sfx2/inc/emojiviewitem.hxx new file mode 100644 index 000000000..bbdcf329f --- /dev/null +++ b/sfx2/inc/emojiviewitem.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 "thumbnailviewitem.hxx" + +class EmojiViewItem final : public ThumbnailViewItem +{ +public: + EmojiViewItem (ThumbnailViewBase &rView, sal_uInt16 nId); + + virtual ~EmojiViewItem () override; + + void setCategory (const OUString &rCategory) { msCategory = rCategory; } + + const OUString& getCategory () const { return msCategory; } + + virtual void Paint (drawinglayer::processor2d::BaseProcessor2D *pProcessor, + const ThumbnailItemAttributes *pAttrs) override; + + virtual void calculateItemsPosition (const long nThumbnailHeight, + const long nPadding, sal_uInt32 nMaxTextLength, + const ThumbnailItemAttributes *pAttrs) override; +private: + OUString msCategory; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/fwkhelper.hxx b/sfx2/inc/fwkhelper.hxx new file mode 100644 index 000000000..bd1aa5a8b --- /dev/null +++ b/sfx2/inc/fwkhelper.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 . + */ + +#ifndef INCLUDED_SFX2_INC_FWKHELPER_HXX +#define INCLUDED_SFX2_INC_FWKHELPER_HXX + +#include +#include +#include + +void RefreshToolbars( + css::uno::Reference< css::frame::XFrame > const & rFrame +); + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/guisaveas.hxx b/sfx2/inc/guisaveas.hxx new file mode 100644 index 000000000..9ccd33436 --- /dev/null +++ b/sfx2/inc/guisaveas.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 . + */ + +#ifndef INCLUDED_SFX2_INC_GUISAVEAS_HXX +#define INCLUDED_SFX2_INC_GUISAVEAS_HXX + +#include +#include +#include +#include +#include +#include + +#include + + +namespace com::sun::star::document { class XDocumentProperties; } + +namespace weld { class Window; } +class ModelData_Impl; + +class SfxStoringHelper +{ + friend class ModelData_Impl; + +private: + css::uno::Reference< css::container::XNameAccess > m_xFilterCFG; + css::uno::Reference< css::container::XContainerQuery > m_xFilterQuery; + css::uno::Reference< css::frame::XModuleManager2 > m_xModuleManager; + + css::uno::Reference< css::container::XNameAccess > const & GetFilterConfiguration(); + css::uno::Reference< css::container::XContainerQuery > const & GetFilterQuery(); + css::uno::Reference< css::frame::XModuleManager2 > const & GetModuleManager(); + +public: + SfxStoringHelper(); + + bool GUIStoreModel( + const css::uno::Reference< css::frame::XModel >& xModel, + const OUString& aSlotName, + css::uno::Sequence< css::beans::PropertyValue >& aArgsSequence, + bool bPreselectPassword, + SignatureState nDocumentSignatureState ); + + static bool CheckFilterOptionsAppearance( + const css::uno::Reference< css::container::XNameAccess >& xFilterCFG, + const OUString& aFilterName ); + + + static void SetDocInfoState( + const css::uno::Reference< css::frame::XModel >& xModel, + const css::uno::Reference< css::document::XDocumentProperties>& i_xOldDocInfo ); + + static bool WarnUnacceptableFormat( + const css::uno::Reference< css::frame::XModel >& xModel, + const OUString& aOldUIName, + const OUString& aDefExtension, + bool rDefaultIsAlien ); + + static css::uno::Reference GetModelXWindow(const css::uno::Reference& rModel); + static weld::Window* GetModelWindow( const css::uno::Reference< css::frame::XModel >& xModel ); + +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/inettbc.hxx b/sfx2/inc/inettbc.hxx new file mode 100644 index 000000000..9e0bbac85 --- /dev/null +++ b/sfx2/inc/inettbc.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 . + */ + +#ifndef INCLUDED_SFX2_INC_INETTBC_HXX +#define INCLUDED_SFX2_INC_INETTBC_HXX + +#include +#include + +namespace weld { class ComboBox; }; +class URLBoxItemWindow; +class SvtURLBox; + +class SfxURLToolBoxControl_Impl final : public SfxToolBoxControl +{ +private: + bool m_bModified; + + SvtURLBox* GetURLBox() const; + URLBoxItemWindow* GetURLBoxItemWindow() const; + void OpenURL( const OUString& rName ) const; + + DECL_LINK(OpenHdl, weld::ComboBox&, bool); + DECL_LINK(SelectHdl, weld::ComboBox&, void); + + struct ExecuteInfo + { + css::uno::Reference< css::frame::XDispatch > xDispatch; + css::util::URL aTargetURL; + css::uno::Sequence< css::beans::PropertyValue > aArgs; + }; + + DECL_STATIC_LINK( SfxURLToolBoxControl_Impl, ExecuteHdl_Impl, void*, void ); + +public: + + SFX_DECL_TOOLBOX_CONTROL(); + + SfxURLToolBoxControl_Impl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rBox ); + virtual ~SfxURLToolBoxControl_Impl() override; + + virtual VclPtr CreateItemWindow(vcl::Window* pParent) override; + virtual void StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState ) override; +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/notebookbar/NotebookbarTabControl.hxx b/sfx2/inc/notebookbar/NotebookbarTabControl.hxx new file mode 100644 index 000000000..c793480f5 --- /dev/null +++ b/sfx2/inc/notebookbar/NotebookbarTabControl.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/. + */ + +#pragma once + +#include +#include + +namespace com::sun::star::ui { class XUIConfigurationListener; } +namespace com::sun::star::uno { class XComponentContext; } + +class NotebookbarTabControl final : public NotebookbarTabControlBase +{ +friend class ChangedUIEventListener; + +public: + NotebookbarTabControl( Window* pParent ); + ~NotebookbarTabControl() override; + + virtual void KeyInput( const KeyEvent& rKEvt ) override; + virtual bool EventNotify( NotifyEvent& rNEvt ) override; + virtual void StateChanged(StateChangedType nStateChange) override; + virtual Size calculateRequisition() const override; + +private: + static void FillShortcutsToolBox(css::uno::Reference const & xContext, + const css::uno::Reference& xFrame, + const OUString& aModuleName, + ToolBox* pShortcuts + ); + void ArrowStops( sal_uInt16 nCode ); + + DECL_LINK(OpenNotebookbarPopupMenu, NotebookBar*, void); + + css::uno::Reference m_pListener; + css::uno::Reference m_xFrame; + bool m_bInitialized; + bool m_bInvalidate; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/pch/precompiled_sfx.cxx b/sfx2/inc/pch/precompiled_sfx.cxx new file mode 100644 index 000000000..b741a11c2 --- /dev/null +++ b/sfx2/inc/pch/precompiled_sfx.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_sfx.hxx" + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/pch/precompiled_sfx.hxx b/sfx2/inc/pch/precompiled_sfx.hxx new file mode 100644 index 000000000..d713ff85f --- /dev/null +++ b/sfx2/inc/pch/precompiled_sfx.hxx @@ -0,0 +1,481 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If 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 2020-05-21 16:43:16 using: + ./bin/update_pch sfx2 sfx --cutoff=3 --exclude:system --exclude:module --exclude:local + + If after updating build fails, use the following command to locate conflicting headers: + ./bin/update_pch_bisect ./sfx2/inc/pch/precompiled_sfx.hxx "make sfx2.build" --find-conflicts +*/ + +#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 +#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 +#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 +#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 +#include +#include +#include +#endif // PCH_LEVEL >= 4 + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/preventduplicateinteraction.hxx b/sfx2/inc/preventduplicateinteraction.hxx new file mode 100644 index 000000000..edd503d01 --- /dev/null +++ b/sfx2/inc/preventduplicateinteraction.hxx @@ -0,0 +1,338 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this 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_FRAMEWORK_PREVENTDUPLICATEINTERACTION_HXX +#define INCLUDED_FRAMEWORK_PREVENTDUPLICATEINTERACTION_HXX + +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +namespace com::sun::star::uno { + class XComponentContext; +} + +namespace sfx2 { + +inline void closedialogs(SystemWindow& rTopLevel, bool bCloseRoot) +{ + for (vcl::Window *pChild = rTopLevel.GetWindow(GetWindowType::FirstTopWindowChild); pChild; pChild = rTopLevel.GetWindow(GetWindowType::NextTopWindowSibling)) + closedialogs(dynamic_cast(*pChild), true); + if (bCloseRoot) + rTopLevel.Close(); +} + +// This is intended to be the parent for any warning dialogs launched +// during the load of a document so that those dialogs are modal to +// this window and don't block any existing windows. +// +// If there are dialog children open on exit then veto termination, +// close the topmost dialog and retry termination. +class WarningDialogsParent final : + public cppu::WeakComponentImplHelper +{ +private: + osl::Mutex m_aLock; + VclPtr m_xWin; + css::uno::Reference m_xInterface; + +private: + + DECL_STATIC_LINK(WarningDialogsParent, TerminateDesktop, void*, void); + + void closewarningdialogs() + { + if (!m_xWin) + return; + SolarMutexGuard aSolarGuard; + closedialogs(dynamic_cast(*m_xWin), false); + } + +public: + + using cppu::WeakComponentImplHelperBase::disposing; + virtual void SAL_CALL disposing(const css::lang::EventObject&) override + { + } + + // XTerminateListener + virtual void SAL_CALL queryTermination(const css::lang::EventObject&) override + { + closewarningdialogs(); + Application::PostUserEvent(LINK(this, WarningDialogsParent, TerminateDesktop)); + throw css::frame::TerminationVetoException(); + } + + virtual void SAL_CALL notifyTermination(const css::lang::EventObject&) override + { + } + +public: + WarningDialogsParent() + : cppu::WeakComponentImplHelper(m_aLock) + { + SolarMutexGuard aSolarGuard; + m_xWin = VclPtr::Create(nullptr, WB_STDWORK); + m_xWin->SetText("dialog parent for warning dialogs during load"); + m_xInterface = VCLUnoHelper::GetInterface(m_xWin); + } + + virtual ~WarningDialogsParent() override + { + closewarningdialogs(); + m_xWin.disposeAndClear(); + } + + const css::uno::Reference& GetDialogParent() const + { + return m_xInterface; + } +}; + +class WarningDialogsParentScope +{ +private: + css::uno::Reference m_xDesktop; + rtl::Reference m_xListener; + +public: + WarningDialogsParentScope(const css::uno::Reference& rContext) + : m_xDesktop(css::frame::Desktop::create(rContext), css::uno::UNO_QUERY_THROW) + , m_xListener(new WarningDialogsParent) + { + m_xDesktop->addTerminateListener(m_xListener.get()); + } + + const css::uno::Reference& GetDialogParent() const + { + return m_xListener->GetDialogParent(); + } + + ~WarningDialogsParentScope() + { + m_xDesktop->removeTerminateListener(m_xListener.get()); + } +}; + +/** + @short Prevent us from showing the same interaction more than once during + the same transaction. + + @descr Every interaction provided to this helper will be safed ... handled by the internal + used UUIInteractionHandler (!) and never be handled a second time! + + On the other side there exists some interactions, which allow a retry. + So this helper allow to set a list of interactions combined with a retry value. + */ +struct ThreadHelpBase2 +{ + public: + mutable ::osl::Mutex m_aLock; +}; + +class PreventDuplicateInteraction final : private ThreadHelpBase2 + , public ::cppu::WeakImplHelper +{ + + // structs, types etc. + public: + + struct InteractionInfo + { + public: + /// describe the interaction. + css::uno::Type m_aInteraction; + /// after max count was reached this interaction will be blocked. + sal_Int32 m_nMaxCount; + /// count how often this interaction was called. + sal_Int32 m_nCallCount; + /** hold the last intercepted request (matching the set interaction type) alive + so it can be used for further checks */ + css::uno::Reference< css::task::XInteractionRequest > m_xRequest; + + public: + + InteractionInfo(const css::uno::Type& aInteraction) + : m_aInteraction(aInteraction) + , m_nMaxCount (1 ) + , m_nCallCount (0 ) + {} + }; + + typedef ::std::vector< InteractionInfo > InteractionList; + + + // member + private: + + /// Used to create needed uno services at runtime. + css::uno::Reference< css::uno::XComponentContext > m_xContext; + + /** The outside interaction handler, which is used to handle every incoming interaction, + if it's not blocked. */ + css::uno::Reference< css::task::XInteractionHandler > m_xHandler; + + std::unique_ptr m_xWarningDialogsParent; + + /** This list describe which and how incoming interactions must be handled. + Further it contains all collected information after this interaction + object was used.*/ + InteractionList m_lInteractionRules; + + + // uno interface + public: + + virtual void SAL_CALL initialize(const css::uno::Sequence& rArguments) override; + + /** + @interface XInteractionHandler + @short called from outside to handle a problem + @descr We filter the incoming interactions. some of them + will be forwarded to the generic UI interaction handler. + So we must not implement it twice. Some other ones + will be aborted only. + + @threadsafe yes + */ + virtual void SAL_CALL handle(const css::uno::Reference< css::task::XInteractionRequest >& xRequest) override; + + + /** + @interface XInteractionHandler2 + @short called from outside to handle a problem + @descr We filter the incoming interactions. some of them + will be forwarded to the generic UI interaction handler. + So we must not implement it twice. Some other ones + will be aborted only. + + @threadsafe yes + */ + virtual sal_Bool SAL_CALL handleInteractionRequest( const css::uno::Reference< css::task::XInteractionRequest >& xRequest ) override; + + + /** + @interface XInterface + @short called to query another interface of the component + @descr Will allow to query for XInteractionHandler2 if and only if m_xHandler supports this interface, too. + + @threadsafe yes + */ + virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type& aType ) override; + + // c++ interface + public: + + + /** + @short ctor to guarantee right initialized instances of this class + @descr It uses the given uno service manager to create the global + generic UI interaction handler for later internal using. + + @param xSMGR + uno service manager for creating services internally + + @threadsafe not necessary + */ + PreventDuplicateInteraction(const css::uno::Reference< css::uno::XComponentContext >& rxContext); + + + /** + @short dtor to free used memory. + */ + virtual ~PreventDuplicateInteraction() override; + + + /** + @short set the outside interaction handler, which must be used internally + if the interaction will not be blocked by the set list of rules. + + @note This overwrites the settings of e.g. useDefaultUUIHandler()! + + @param xHandler + the new interaction handler + */ + void setHandler(const css::uno::Reference< css::task::XInteractionHandler >& xHandler); + + + /** + @short instead of setting an outside interaction handler, this method + make sure the default UUI interaction handler of the office is used. + + @note This overwrites the settings of e.g. setHandler()! + */ + void useDefaultUUIHandler(); + + + /** + @short add a new interaction to the list of interactions, which + must be handled by this helper. + + @descr This method must be called immediately after a new instance of this helper was + created. Without such list of InteractionRules, this instances does nothing! + On the other side there is no possibility to remove rules. + So the same instance can't be used within different transactions. + It's a OneWay-object .-) + + @param aInteractionInfo + describe the type of interaction, hos often it can be called etcpp. + + @threadsafe yes + */ + void addInteractionRule(const PreventDuplicateInteraction::InteractionInfo& aInteractionInfo); + + + /** + @short return the info struct for the specified interaction. + + @param aInteraction + specify the interaction. + + @param pReturn + provides information about: + - the count how often this interaction was handled during the + lifetime of this helper. + - the interaction itself, so it can be analyzed further + + @return [boolean] + true if the queried interaction could be found. + false otherwise. + + @threadsafe yes + */ + bool getInteractionInfo(const css::uno::Type& aInteraction, + PreventDuplicateInteraction::InteractionInfo* pReturn ) const; +}; + +} // namespace sfx2 + +#endif // INCLUDED_FRAMEWORK_PREVENTDUPLICATEINTERACTION_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/recentdocsview.hxx b/sfx2/inc/recentdocsview.hxx new file mode 100644 index 000000000..95b9386cd --- /dev/null +++ b/sfx2/inc/recentdocsview.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/. + */ + +#pragma once + +#include +#include + +#include + +#include +#include + +namespace com::sun::star::frame { class XDispatch; } + +namespace sfx2 +{ + +struct LoadRecentFile +{ + css::util::URL aTargetURL; + css::uno::Sequence< css::beans::PropertyValue > aArgSeq; + css::uno::Reference< css::frame::XDispatch > xDispatch; + VclPtr< ThumbnailView > pView; +}; + +enum class ApplicationType +{ + TYPE_NONE = 0, + TYPE_WRITER = 1 << 0, + TYPE_CALC = 1 << 1, + TYPE_IMPRESS = 1 << 2, + TYPE_DRAW = 1 << 3, + TYPE_DATABASE = 1 << 4, + TYPE_MATH = 1 << 5, + TYPE_OTHER = 1 << 6 +}; + +} // namespace sfx2 + +namespace o3tl { + +template<> struct typed_flags : is_typed_flags {}; + +} // namespace o3tl + +namespace sfx2 +{ + +class RecentDocsView final : public ThumbnailView +{ +public: + RecentDocsView( vcl::Window* pParent ); + + void insertItem(const OUString &rURL, const OUString &rTitle, const BitmapEx &rThumbnail, sal_uInt16 nId); + + static bool typeMatchesExtension(ApplicationType type, const OUString &rExt); + static BitmapEx getDefaultThumbnail(const OUString &rURL); + + ApplicationType mnFileTypes; + + virtual void Clear() override; + + /// Update the information in the view. + virtual void Reload() override; + + DECL_STATIC_LINK( RecentDocsView, ExecuteHdl_Impl, void*, void ); + +private: + virtual void MouseButtonDown( const MouseEvent& rMEvt ) override; + + virtual void MouseButtonUp( const MouseEvent& rMEvt ) override; + + virtual void OnItemDblClicked(ThumbnailViewItem *pItem) override; + + virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override; + + virtual void LoseFocus() override; + + bool isAcceptedFile(const OUString &rURL) const; + + long mnItemMaxSize; + size_t mnLastMouseDownItem; + + /// Image that appears when there is no recent document. + BitmapEx maWelcomeImage; + OUString maWelcomeLine1; + OUString maWelcomeLine2; +}; + +} // namespace sfx2 + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/saveastemplatedlg.hxx b/sfx2/inc/saveastemplatedlg.hxx new file mode 100644 index 000000000..a4df61853 --- /dev/null +++ b/sfx2/inc/saveastemplatedlg.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/. + */ + +#ifndef INCLUDED_SFX2_INC_SAVEASTEMPLATEDLG_HXX +#define INCLUDED_SFX2_INC_SAVEASTEMPLATEDLG_HXX + +#include +#include +#include + +#include + +// class SfxSaveAsTemplateDialog ------------------------------------------------------------------- +class SfxSaveAsTemplateDialog final : public weld::GenericDialogController +{ +private: + std::unique_ptr m_xLBCategory; + std::unique_ptr m_xCBXDefault; + std::unique_ptr m_xTemplateNameEdit; + std::unique_ptr m_xOKButton; + + OUString msSelectedCategory; + OUString msTemplateName; + sal_uInt16 mnRegionPos; + + std::vector msCategories; + + SfxDocumentTemplates maDocTemplates; + + css::uno::Reference m_xModel; + +public: + DECL_LINK(OkClickHdl, weld::Button&, void); + DECL_LINK(TemplateNameEditHdl, weld::Entry&, void); + DECL_LINK(SelectCategoryHdl, weld::TreeView&, void); + + void initialize(); + void SetCategoryLBEntries(const std::vector& names); + + /*Check whether template name is unique or not in a region*/ + bool IsTemplateNameUnique(); + + bool SaveTemplate(); + +public: + SfxSaveAsTemplateDialog(weld::Window* pParent, + const css::uno::Reference& rModel); +}; + +#endif // INCLUDED_SFX2_INC_SAVEASTEMPLATEDLG_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sfxbasecontroller_internal.hxx b/sfx2/inc/sfxbasecontroller_internal.hxx new file mode 100644 index 000000000..0de26d5e9 --- /dev/null +++ b/sfx2/inc/sfxbasecontroller_internal.hxx @@ -0,0 +1,19 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.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 INCLUDED_SFX2_INC_SFXBASECONTROLLER_INTERNAL_HXX +#define INCLUDED_SFX2_INC_SFXBASECONTROLLER_INTERNAL_HXX + +#include + +extern sal_uInt32 Get10ThSec(); + +#endif // INCLUDED_SFX2_INC_SFXBASECONTROLLER_INTERNAL_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/Accessible.hxx b/sfx2/inc/sidebar/Accessible.hxx new file mode 100644 index 000000000..3f3d351ed --- /dev/null +++ b/sfx2/inc/sidebar/Accessible.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 + +namespace com::sun::star::accessibility { class XAccessibleContext; } + +typedef cppu::WeakComponentImplHelper < + css::accessibility::XAccessible + > AccessibleInterfaceBase; + +namespace sfx2::sidebar { + + +/** Simple implementation of the XAccessible interface. + Its getAccessibleContext() method returns a context object given + to its constructor. +*/ +class Accessible final + : private ::cppu::BaseMutex, + public AccessibleInterfaceBase +{ +public: + explicit Accessible ( + const css::uno::Reference& rxContext); + virtual ~Accessible() override; + Accessible(const Accessible&) = delete; + Accessible& operator=( const Accessible& ) = delete; + + virtual void SAL_CALL disposing() override; + // XAccessible + virtual css::uno::Reference SAL_CALL getAccessibleContext() override; + +private: + css::uno::Reference mxContext; +}; + +} // end of namespace sfx2::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/AccessibleTitleBar.hxx b/sfx2/inc/sidebar/AccessibleTitleBar.hxx new file mode 100644 index 000000000..f2105dabb --- /dev/null +++ b/sfx2/inc/sidebar/AccessibleTitleBar.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 com::sun::star::accessibility { class XAccessible; } + +namespace sfx2::sidebar { + +class TitleBar; + +class AccessibleTitleBar final + : public VCLXAccessibleComponent +{ +public: + static css::uno::Reference Create (TitleBar& rTitleBar); + +private: + virtual void FillAccessibleStateSet (utl::AccessibleStateSetHelper& rStateSet) override; + + explicit AccessibleTitleBar (VCLXWindow* pWindow); + virtual ~AccessibleTitleBar() override; +}; + +} // end of namespace sfx2::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/ContextChangeBroadcaster.hxx b/sfx2/inc/sidebar/ContextChangeBroadcaster.hxx new file mode 100644 index 000000000..49770da76 --- /dev/null +++ b/sfx2/inc/sidebar/ContextChangeBroadcaster.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 . + */ +#ifndef INCLUDED_SFX2_INC_SIDEBAR_CONTEXTCHANGEBROADCASTER_HXX +#define INCLUDED_SFX2_INC_SIDEBAR_CONTEXTCHANGEBROADCASTER_HXX + +#include + + +namespace sfx2::sidebar { + + +/** This class is a helper for broadcasting context changes that are + tied to shells being activated or deactivated. +*/ +class ContextChangeBroadcaster +{ +public: + ContextChangeBroadcaster(); + ~ContextChangeBroadcaster(); + + void Initialize (const OUString& rsContextName); + + void Activate (const css::uno::Reference& rxFrame); + void Deactivate (const css::uno::Reference& rxFrame); + + /** Enable or disable the broadcaster. + @param bIsEnabled + The new value of the "enabled" state. + @return + The old value of the "enabled" state is returned. + */ + bool SetBroadcasterEnabled (const bool bIsEnabled); + +private: + OUString msContextName; + bool mbIsBroadcasterEnabled; + + void BroadcastContextChange ( + const css::uno::Reference& rxFrame, + const OUString& rsModuleName, + const OUString& rsContextName); + static OUString GetModuleName ( + const css::uno::Reference& rxFrame); +}; + + +} // end of namespace ::sd::sidebar + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/ContextList.hxx b/sfx2/inc/sidebar/ContextList.hxx new file mode 100644 index 000000000..b3ecafa53 --- /dev/null +++ b/sfx2/inc/sidebar/ContextList.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 + +#include + +namespace sfx2::sidebar { + +/** Per context data for deck and panel descriptors. +*/ +class ContextList +{ +public: + ContextList(); + + class Entry + { + public: + Context maContext; + bool mbIsInitiallyVisible; + OUString msMenuCommand; + }; + + /** Return when the given context matches any of the stored contexts. + */ + const Entry* GetMatch ( + const Context& rContext) const; + Entry* GetMatch ( + const Context& rContext); + + void AddContextDescription ( + const Context& rContext, + const bool bIsInitiallyVisible, + const OUString& rsMenuCommand); + + void ToggleVisibilityForContext( const Context& rContext,const bool bIsInitiallyVisible ); + const ::std::vector& GetEntries() const {return maEntries;}; + +private: + ::std::vector maEntries; + + ::std::vector::const_iterator FindBestMatch (const Context& rContext) const; +}; + +} // end of namespace sfx2::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/ControlFactory.hxx b/sfx2/inc/sidebar/ControlFactory.hxx new file mode 100644 index 000000000..15ae45ef4 --- /dev/null +++ b/sfx2/inc/sidebar/ControlFactory.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 . + */ +#ifndef INCLUDED_SFX2_SIDEBAR_CONTROLFACTORY_HXX +#define INCLUDED_SFX2_SIDEBAR_CONTROLFACTORY_HXX + +#include +#include + +class CheckBox; +class RadioButton; +namespace vcl { class Window; } + +namespace sfx2::sidebar { + +/** Factory for controls used in sidebar panels. + The reason to use this factory instead of creating the controls + directly is that this way the sidebar has a little more control + over look and feel of its controls. +*/ +class ControlFactory +{ +public: + /** Create the menu button for the task bar. + */ + static VclPtr CreateMenuButton (vcl::Window* pParentWindow); + + static VclPtr CreateTabItem (vcl::Window* pParentWindow); +}; + + +} // end of namespace sfx2::sidebar + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/ControllerFactory.hxx b/sfx2/inc/sidebar/ControllerFactory.hxx new file mode 100644 index 000000000..dbf609775 --- /dev/null +++ b/sfx2/inc/sidebar/ControllerFactory.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 + +namespace com::sun::star::awt { class XWindow; } +namespace com::sun::star::frame { class XController; } +namespace com::sun::star::frame { class XFrame; } +namespace com::sun::star::frame { class XToolbarController; } + +class ToolBox; + +namespace weld { + class Builder; + class Toolbar; +} + +namespace sfx2::sidebar { + +/** Convenience class for the easy creation of toolbox controllers. +*/ +class ControllerFactory +{ +public: + static css::uno::Reference CreateToolBoxController( + ToolBox* pToolBox, + const sal_uInt16 nItemId, + const OUString& rsCommandName, + const css::uno::Reference& rxFrame, + const css::uno::Reference& rxController, + const css::uno::Reference& rxParentWindow, + const sal_Int32 nItemWidth, bool bSideBar); + + static css::uno::Reference CreateToolBoxController( + weld::Toolbar& rToolbar, + weld::Builder& rBuilder, + const OUString& rsCommandName, + const css::uno::Reference& rxFrame, + bool bSideBar); + +private: + static css::uno::Reference CreateToolBarController( + const css::uno::Reference& rToolbar, + const OUString& rsCommandName, + const css::uno::Reference& rxFrame, + const css::uno::Reference& rxController, + const sal_Int32 nWidth, bool bSideBar); +}; + + +} // end of namespace sfx2::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/DeckDescriptor.hxx b/sfx2/inc/sidebar/DeckDescriptor.hxx new file mode 100644 index 000000000..f1195cd0b --- /dev/null +++ b/sfx2/inc/sidebar/DeckDescriptor.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 + +#include + +namespace sfx2::sidebar { + +class DeckDescriptor +{ +public: + OUString msTitle; + OUString msId; + OUString msIconURL; + OUString msHighContrastIconURL; + OUString msTitleBarIconURL; + OUString msHighContrastTitleBarIconURL; + OUString msHelpText; + ContextList maContextList; + bool mbIsEnabled; + sal_Int32 mnOrderIndex; + bool mbExperimental; + + OUString msNodeName; // some impress deck nodes names are different from their Id + + VclPtr mpDeck; + + DeckDescriptor(); + DeckDescriptor (const DeckDescriptor& rOther); + ~DeckDescriptor(); +}; + +} // end of namespace sfx2::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/DeckLayouter.hxx b/sfx2/inc/sidebar/DeckLayouter.hxx new file mode 100644 index 000000000..b84496cd6 --- /dev/null +++ b/sfx2/inc/sidebar/DeckLayouter.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 + +class ScrollBar; +namespace vcl { class Window; } +namespace tools { class Rectangle; } + +namespace sfx2::sidebar { + +/** Helper for layouting the direct and indirect children of a + deck like title bars, panels, and scroll bars. +*/ +namespace DeckLayouter +{ + void LayoutDeck ( + const tools::Rectangle& rContentArea, + sal_Int32& rMinimalWidth, + sal_Int32& rMinimalHeight, + SharedPanelContainer& rPanels, + vcl::Window& pDeckTitleBar, + vcl::Window& pScrollClipWindow, + vcl::Window& pScrollContainer, + vcl::Window& pFiller, + ScrollBar& pVerticalScrollBar); +} + +} // end of namespace sfx2::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/DeckTitleBar.hxx b/sfx2/inc/sidebar/DeckTitleBar.hxx new file mode 100644 index 000000000..86a71c76a --- /dev/null +++ b/sfx2/inc/sidebar/DeckTitleBar.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 sfx2::sidebar { + +class DeckTitleBar final : public TitleBar +{ +public: + DeckTitleBar(const OUString& rsTitle, + vcl::Window* pParentWindow, + const std::function& rCloserAction); + + void SetCloserVisible(const bool bIsCloserVisible); + static tools::Rectangle GetDragArea(); + + virtual void DataChanged(const DataChangedEvent& rEvent) override; + virtual void MouseMove(const MouseEvent& rMouseEvent) override; + +private: + virtual tools::Rectangle GetTitleArea(const tools::Rectangle& rTitleBarBox) override; + virtual void PaintDecoration(vcl::RenderContext& rRenderContext) override; + virtual sidebar::Paint GetBackgroundPaint() override; + virtual void HandleToolBoxItemClick(const sal_uInt16 nItemIndex) override; + virtual css::uno::Reference CreateAccessible() override; + + static const sal_uInt16 mnCloserItemIndex = 1; + const std::function maCloserAction; + bool mbIsCloserVisible; +}; + +} // end of namespace sfx2::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/DrawHelper.hxx b/sfx2/inc/sidebar/DrawHelper.hxx new file mode 100644 index 000000000..a657ac041 --- /dev/null +++ b/sfx2/inc/sidebar/DrawHelper.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 + +class Color; +class SvBorder; + +namespace sfx2::sidebar { + +class Paint; + +/** Some convenience functions for painting backgrounds and borders. +*/ +class DrawHelper +{ +public: + static void DrawBorder(vcl::RenderContext& rRenderContext, const tools::Rectangle& rBox, const SvBorder& rBorderSize, + const Paint& rHorizontalPaint, const Paint& rVerticalPaint); + static void DrawHorizontalLine(vcl::RenderContext& rRenderContext, const sal_Int32 nLeft, const sal_Int32 nRight, + const sal_Int32 nY, const sal_Int32 nHeight, const Paint& rPaint); + static void DrawVerticalLine(vcl::RenderContext& rRenderContext, const sal_Int32 nTop, const sal_Int32 nBottom, + const sal_Int32 nX, const sal_Int32 nWidth, const Paint& rPaint); + static void DrawRoundedRectangle(vcl::RenderContext& rRenderContext, const tools::Rectangle& rBox, const sal_Int32 nCornerRadius, + const Color& rBorderColor, const Paint& rFillPaint); +}; + +} // end of namespace sfx2::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/MenuButton.hxx b/sfx2/inc/sidebar/MenuButton.hxx new file mode 100644 index 000000000..a244a3439 --- /dev/null +++ b/sfx2/inc/sidebar/MenuButton.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 + +namespace sfx2::sidebar { + +class MenuButton final + : public CheckBox +{ +public: + MenuButton (vcl::Window* pParentWindow); + + virtual void Paint (vcl::RenderContext& /*rRenderContext*/, const tools::Rectangle& rUpdateArea) override; + virtual void MouseMove (const MouseEvent& rEvent) override; + virtual void MouseButtonDown (const MouseEvent& rMouseEvent) override; + virtual void MouseButtonUp (const MouseEvent& rMouseEvent) override; + +protected: + using CheckBox::FillLayoutData; + +private: + bool mbIsLeftButtonDown; +}; + +} // end of namespace sfx2::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/Paint.hxx b/sfx2/inc/sidebar/Paint.hxx new file mode 100644 index 000000000..ea2af1d5e --- /dev/null +++ b/sfx2/inc/sidebar/Paint.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 + +#include + +namespace sfx2::sidebar { + +/** Abstraction of different ways to fill outlines. + Can be + - none (empty: outline is not filled) + - singular color + - gradient +*/ +class Paint +{ +public: + enum Type + { + NoPaint, + ColorPaint, + GradientPaint + }; + + // Create a Paint object for an Any that may contain a color, a + // awt::Gradient, or nothing. + static Paint Create (const css::uno::Any& rValue); + + // Create paint with type NoPaint. + explicit Paint(); + + // Create a Paint object for the given color. + explicit Paint (const Color& rColor); + + // Create a Paint object for the given gradient. + explicit Paint (const Gradient& rGradient); + + Type GetType() const { return meType;} + const Color& GetColor() const; + const Gradient& GetGradient() const; + + Wallpaper GetWallpaper() const; + +private: + Type meType; + ::boost::variant< + Color, + Gradient + > maValue; +}; + +} // end of namespace sfx2::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/PanelDescriptor.hxx b/sfx2/inc/sidebar/PanelDescriptor.hxx new file mode 100644 index 000000000..be85911ac --- /dev/null +++ b/sfx2/inc/sidebar/PanelDescriptor.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 sfx2::sidebar { + +class PanelDescriptor +{ +public: + OUString msTitle; + bool mbIsTitleBarOptional; + OUString msId; + OUString msDeckId; + OUString msTitleBarIconURL; + OUString msHighContrastTitleBarIconURL; + ContextList maContextList; + OUString msImplementationURL; + sal_Int32 mnOrderIndex; + bool mbShowForReadOnlyDocuments; + bool mbWantsCanvas; + bool mbExperimental; + + OUString msNodeName; // some impress panel nodes names are different from their Id + + PanelDescriptor(); + PanelDescriptor (const PanelDescriptor& rPanelDescriptor); + ~PanelDescriptor(); +}; + +} // end of namespace sfx2::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/PanelTitleBar.hxx b/sfx2/inc/sidebar/PanelTitleBar.hxx new file mode 100644 index 000000000..b060124b9 --- /dev/null +++ b/sfx2/inc/sidebar/PanelTitleBar.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 com::sun::star::frame { class XController; } +namespace com::sun::star::frame { class XFrame; } + +namespace sfx2::sidebar { + +class Panel; + +class PanelTitleBar final + : public TitleBar +{ +public: + PanelTitleBar(const OUString& rsTitle, vcl::Window* pParentWindow, Panel* pPanel); + virtual ~PanelTitleBar() override; + virtual void dispose() override; + + void SetMoreOptionsCommand(const OUString& rsCommandName, + const css::uno::Reference& rxFrame, + const css::uno::Reference& rxController); + + virtual void DataChanged(const DataChangedEvent& rEvent) override; + virtual void MouseButtonDown(const MouseEvent& rMouseEvent) override; + virtual void MouseButtonUp(const MouseEvent& rMouseEvent) override; + +private: + virtual tools::Rectangle GetTitleArea(const tools::Rectangle& rTitleBarBox) override; + virtual void PaintDecoration(vcl::RenderContext& rRenderContext) override; + virtual sidebar::Paint GetBackgroundPaint() override; + virtual void HandleToolBoxItemClick (const sal_uInt16 nItemIndex) override; + virtual css::uno::Reference CreateAccessible() override; + + bool mbIsLeftButtonDown; + VclPtr mpPanel; + static const sal_uInt16 mnMenuItemIndex = 1; + css::uno::Reference mxFrame; + OUString msMoreOptionsCommand; +}; + +} // end of namespace sfx2::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/TabItem.hxx b/sfx2/inc/sidebar/TabItem.hxx new file mode 100644 index 000000000..44e5cf6b5 --- /dev/null +++ b/sfx2/inc/sidebar/TabItem.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 + +namespace vcl { class Window; } + +namespace sfx2::sidebar { + +/** A single button in the tab bar. +*/ +class TabItem final + : public RadioButton +{ +public: + TabItem (vcl::Window* pParentWindow); + + virtual void Paint (vcl::RenderContext& rRenderContext, const tools::Rectangle& rUpdateArea) override; + virtual void MouseMove (const MouseEvent& rEvent) override; + virtual void MouseButtonDown (const MouseEvent& rMouseEvent) override; + virtual void MouseButtonUp (const MouseEvent& rMouseEvent) override; + +private: + bool mbIsLeftButtonDown; +}; + +} // end of namespace sfx2::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/TitleBar.hxx b/sfx2/inc/sidebar/TitleBar.hxx new file mode 100644 index 000000000..69c182825 --- /dev/null +++ b/sfx2/inc/sidebar/TitleBar.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 + +namespace sfx2::sidebar { + +class TitleBar : public vcl::Window +{ +public: + TitleBar (const OUString& rsTitle, + vcl::Window* pParentWindow, + const sidebar::Paint& rInitialBackgroundPaint); + virtual ~TitleBar() override; + virtual void dispose() override; + + void SetTitle (const OUString& rsTitle); + const OUString& GetTitle() const {return msTitle; } + + void SetIcon (const Image& rIcon); + + virtual void ApplySettings(vcl::RenderContext& rRenderContext) override; + virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rUpdateArea) override; + virtual void DataChanged (const DataChangedEvent& rEvent) override; + virtual void setPosSizePixel (long nX, long nY, long nWidth, long nHeight, PosSizeFlags nFlags = PosSizeFlags::All) override; + + ToolBox& GetToolBox() + { + return *maToolBox; + } + const ToolBox& GetToolBox() const + { + return *maToolBox; + } + +protected: + VclPtr maToolBox; + OUString msTitle; + + virtual tools::Rectangle GetTitleArea (const tools::Rectangle& rTitleBarBox) = 0; + virtual void PaintDecoration (vcl::RenderContext& rRenderContext) = 0; + void PaintFocus(vcl::RenderContext& rRenderContext, const tools::Rectangle& rFocusBox); + virtual sidebar::Paint GetBackgroundPaint() = 0; + virtual void HandleToolBoxItemClick (const sal_uInt16 nItemIndex); + virtual css::uno::Reference CreateAccessible() override; + +private: + Image maIcon; + sidebar::Paint maBackgroundPaint; + + void PaintTitle(vcl::RenderContext& rRenderContext, const tools::Rectangle& rTitleBox); + DECL_LINK(SelectionHandler, ToolBox*, void); +}; + +} // end of namespace sfx2::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/Tools.hxx b/sfx2/inc/sidebar/Tools.hxx new file mode 100644 index 000000000..97611a7a6 --- /dev/null +++ b/sfx2/inc/sidebar/Tools.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 + +#include +#include + +namespace com::sun::star::frame { class XController; } +namespace com::sun::star::frame { class XDispatch; } +namespace com::sun::star::frame { class XFrame; } + + +namespace sfx2::sidebar { + +class Tools +{ +public: + static Image GetImage ( + const OUString& rsImageURL, + const OUString& rsHighContrastImageURL, + const css::uno::Reference& rxFrame); + + static Image GetImage ( + const OUString& rsURL, + const css::uno::Reference& rxFrame); + + static css::awt::Gradient VclToAwtGradient (const Gradient& rGradient); + static Gradient AwtToVclGradient (const css::awt::Gradient& rGradient); + + static css::util::URL GetURL (const OUString& rsCommand); + static css::uno::Reference GetDispatch ( + const css::uno::Reference& rxFrame, + const css::util::URL& rURL); + + static OUString GetModuleName ( + const css::uno::Reference& rxFrame); +}; + + +} // end of namespace sfx2::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/UnoDeck.hxx b/sfx2/inc/sidebar/UnoDeck.hxx new file mode 100644 index 000000000..88497c03a --- /dev/null +++ b/sfx2/inc/sidebar/UnoDeck.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 + +namespace com::sun::star::frame { class XFrame; } +namespace com::sun::star::ui { class XPanels; } +namespace sfx2::sidebar { class SidebarController; } + +/** get the decks +*/ +class SfxUnoDeck final : public cppu::WeakImplHelper +{ + +public: + + SfxUnoDeck(const css::uno::Reference& , const OUString&); + + virtual OUString SAL_CALL getId() override; + + virtual OUString SAL_CALL getTitle() override; + virtual void SAL_CALL setTitle( const OUString& newTitle ) override; + + virtual sal_Bool SAL_CALL isActive() override; + virtual void SAL_CALL activate( const sal_Bool bActivate ) override; + + virtual css::uno::Reference SAL_CALL getPanels() override; + + virtual sal_Int32 SAL_CALL getOrderIndex() override; + virtual void SAL_CALL setOrderIndex( const sal_Int32 newOrderIndex ) override; + virtual void SAL_CALL moveFirst() override; + virtual void SAL_CALL moveLast() override; + virtual void SAL_CALL moveUp() override; + virtual void SAL_CALL moveDown() override; + +private: + + const css::uno::Reference xFrame; + sfx2::sidebar::SidebarController* getSidebarController(); + + const OUString mDeckId; + + sal_Int32 GetMaxOrderIndex(sfx2::sidebar::ResourceManager::DeckContextDescriptorContainer aDecks); + sal_Int32 GetMinOrderIndex(sfx2::sidebar::ResourceManager::DeckContextDescriptorContainer aDecks); + +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/UnoDecks.hxx b/sfx2/inc/sidebar/UnoDecks.hxx new file mode 100644 index 000000000..95ce0be62 --- /dev/null +++ b/sfx2/inc/sidebar/UnoDecks.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/. + * + */ + +#pragma once + +#include + +#include + +namespace com::sun::star::frame { class XFrame; } +namespace sfx2::sidebar { class SidebarController; } + +/** get the decks +*/ +class SfxUnoDecks final : public cppu::WeakImplHelper +{ + +public: + + SfxUnoDecks(const css::uno::Reference&); + +// 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; + +private: + + const css::uno::Reference xFrame; + sfx2::sidebar::SidebarController* getSidebarController(); + +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/UnoPanel.hxx b/sfx2/inc/sidebar/UnoPanel.hxx new file mode 100644 index 000000000..50d9aba2c --- /dev/null +++ b/sfx2/inc/sidebar/UnoPanel.hxx @@ -0,0 +1,69 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.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::awt { class XWindow; } +namespace com::sun::star::frame { class XFrame; } +namespace sfx2::sidebar { class SidebarController; } + + +/** get the Panel +*/ +class SfxUnoPanel final : public cppu::WeakImplHelper +{ + +public: + + SfxUnoPanel(const css::uno::Reference& , const OUString&, const OUString&); + + virtual OUString SAL_CALL getId() override; + + virtual OUString SAL_CALL getTitle() override; + virtual void SAL_CALL setTitle( const OUString& newTitle ) override; + + virtual sal_Bool SAL_CALL isExpanded() override; + virtual void SAL_CALL expand( const sal_Bool bCollapseOther ) override; + virtual void SAL_CALL collapse( ) override; + + virtual sal_Int32 SAL_CALL getOrderIndex() override; + virtual void SAL_CALL setOrderIndex( const sal_Int32 newOrderIndex ) override; + virtual void SAL_CALL moveFirst() override; + virtual void SAL_CALL moveLast() override; + virtual void SAL_CALL moveUp() override; + virtual void SAL_CALL moveDown() override; + + virtual css::uno::Reference SAL_CALL getDialog() override; + +private: + + const css::uno::Reference xFrame; + sfx2::sidebar::SidebarController* getSidebarController(); + + const OUString mPanelId; + const OUString mDeckId; + + VclPtr mpDeck; + VclPtr mpPanel; + + sal_Int32 GetMaxOrderIndex(sfx2::sidebar::ResourceManager::PanelContextDescriptorContainer aPanels); + sal_Int32 GetMinOrderIndex(sfx2::sidebar::ResourceManager::PanelContextDescriptorContainer aPanels); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/UnoPanels.hxx b/sfx2/inc/sidebar/UnoPanels.hxx new file mode 100644 index 000000000..487043dee --- /dev/null +++ b/sfx2/inc/sidebar/UnoPanels.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/. + */ +#pragma once + + +#include + +#include + +namespace com::sun::star::frame { class XFrame; } +namespace sfx2::sidebar { class SidebarController; } + +/** get the decks +*/ +class SfxUnoPanels final : public cppu::WeakImplHelper +{ + +public: + + SfxUnoPanels(const css::uno::Reference& , const OUString&); + +// XPanels + virtual OUString SAL_CALL getDeckId() 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; + +private: + + const css::uno::Reference xFrame; + sfx2::sidebar::SidebarController* getSidebarController(); + const OUString& mDeckId; + +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sidebar/UnoSidebar.hxx b/sfx2/inc/sidebar/UnoSidebar.hxx new file mode 100644 index 000000000..20ffa22b1 --- /dev/null +++ b/sfx2/inc/sidebar/UnoSidebar.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/. + * + */ + +#ifndef INCLUDED_SFX2_SIDEBAR_SIDEBAR_HXX +#define INCLUDED_SFX2_SIDEBAR_SIDEBAR_HXX + +#include + +#include + +namespace com::sun::star::frame { class XFrame; } +namespace com::sun::star::ui { class XDecks; } +namespace com::sun::star::ui { class XSidebar; } +namespace sfx2::sidebar { class SidebarController; } + +/** get the sidebar for a given frame +*/ +class SfxUnoSidebar final : public cppu::WeakImplHelper +{ + +private: + + const css::uno::Reference xFrame; + sfx2::sidebar::SidebarController* getSidebarController(); + +public: + + SfxUnoSidebar(const css::uno::Reference&); + + virtual void SAL_CALL showDecks (const sal_Bool bVisible) override; + + + virtual void SAL_CALL setVisible (const sal_Bool bVisible) override; + + virtual sal_Bool SAL_CALL isVisible() override; + + virtual css::uno::Reference SAL_CALL getFrame() override; + + virtual css::uno::Reference SAL_CALL getDecks() override; + + virtual css::uno::Reference SAL_CALL getSidebar() override; + +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/sorgitm.hxx b/sfx2/inc/sorgitm.hxx new file mode 100644 index 000000000..d67d89062 --- /dev/null +++ b/sfx2/inc/sorgitm.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 . + */ +#ifndef INCLUDED_SFX2_INC_SORGITM_HXX +#define INCLUDED_SFX2_INC_SORGITM_HXX + +#include + +// class SfxScriptOrganizerItem --------------------------------------------- + +class SfxScriptOrganizerItem final : public SfxStringItem +{ +private: + OUString aLanguage; + +public: + static SfxPoolItem* CreateDefault(); + SfxScriptOrganizerItem(); + + virtual SfxScriptOrganizerItem* Clone( SfxItemPool* pPool = nullptr ) const override; + virtual bool operator==( const SfxPoolItem& ) const override; + virtual bool QueryValue( css::uno::Any& rVal, sal_uInt8 nMemberId = 0 ) const override; + virtual bool PutValue( const css::uno::Any& rVal, sal_uInt8 nMemberId ) override; + const OUString& getLanguage() const { return aLanguage; }; +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/srchdlg.hxx b/sfx2/inc/srchdlg.hxx new file mode 100644 index 000000000..3d8317477 --- /dev/null +++ b/sfx2/inc/srchdlg.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_SFX2_INC_SRCHDLG_HXX +#define INCLUDED_SFX2_INC_SRCHDLG_HXX + +#include + +namespace sfx2 { + + +// SearchDialog + + +class SearchDialog final : public weld::GenericDialogController +{ +private: + Link m_aFindHdl; + Link m_aCloseHdl; + + OUString m_sConfigName; + + std::unique_ptr m_xSearchEdit; + std::unique_ptr m_xWholeWordsBox; + std::unique_ptr m_xMatchCaseBox; + std::unique_ptr m_xWrapAroundBox; + std::unique_ptr m_xBackwardsBox; + std::unique_ptr m_xFindBtn; + + void LoadConfig(); + void SaveConfig(); + + DECL_LINK(FindHdl, weld::Button&, void); + +public: + SearchDialog(weld::Window* pWindow, const OUString& rConfigName); + static void runAsync(const std::shared_ptr& rController); + virtual ~SearchDialog() override; + + void SetFindHdl( const Link& rLink ) { m_aFindHdl = rLink; } + void SetCloseHdl( const Link& rLink ) { m_aCloseHdl = rLink; } + + OUString GetSearchText() const { return m_xSearchEdit->get_active_text(); } + void SetSearchText( const OUString& _rText ) { m_xSearchEdit->set_entry_text( _rText ); } + bool IsOnlyWholeWords() const { return m_xWholeWordsBox->get_active(); } + bool IsMarchCase() const { return m_xMatchCaseBox->get_active(); } + bool IsWrapAround() const { return m_xWrapAroundBox->get_active(); } + bool IsSearchBackwards() const { return m_xBackwardsBox->get_active(); } + + void SetFocusOnEdit(); +}; + +} // namespace sfx2 + + +#endif // INCLUDED_SFX2_INC_SRCHDLG_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/strings.hxx b/sfx2/inc/strings.hxx new file mode 100644 index 000000000..386f3fdc3 --- /dev/null +++ b/sfx2/inc/strings.hxx @@ -0,0 +1,58 @@ +/* -*- 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/. + */ + +#ifndef INCLUDED_SFX2_INC_STRINGS_HXX +#define INCLUDED_SFX2_INC_STRINGS_HXX + +#define STR_HTML_GENERATOR "%PRODUCTNAME %PRODUCTVERSION%PRODUCTEXTENSION (%1)" + +// Do not translate STR_TEMPLATE_NAME*_DEF names!! +// STR_TEMPLATE_NAME*_DEF strings must EXACTLY fit dc:title tag in meta.xml of each template file +#define STR_TEMPLATE_NAME1_DEF "Alizarin" +#define STR_TEMPLATE_NAME2_DEF "Beehive" +#define STR_TEMPLATE_NAME3_DEF "Blue Curve" +#define STR_TEMPLATE_NAME4_DEF "Blueprint Plans" +#define STR_TEMPLATE_NAME5_DEF "Bright Blue" +#define STR_TEMPLATE_NAME6_DEF "Classy Red" +#define STR_TEMPLATE_NAME7_DEF "DNA" +#define STR_TEMPLATE_NAME8_DEF "Focus" +#define STR_TEMPLATE_NAME9_DEF "Forestbird" +#define STR_TEMPLATE_NAME10_DEF "Impress" +#define STR_TEMPLATE_NAME11_DEF "Inspiration" +#define STR_TEMPLATE_NAME12_DEF "Lights" +#define STR_TEMPLATE_NAME13_DEF "Lush Green" +#define STR_TEMPLATE_NAME14_DEF "Metropolis" +#define STR_TEMPLATE_NAME15_DEF "Midnightblue" +#define STR_TEMPLATE_NAME16_DEF "Nature Illustration" +#define STR_TEMPLATE_NAME17_DEF "Pencil" +#define STR_TEMPLATE_NAME18_DEF "Piano" +#define STR_TEMPLATE_NAME19_DEF "Portfolio" +#define STR_TEMPLATE_NAME20_DEF "Progress" +#define STR_TEMPLATE_NAME21_DEF "Sunset" +#define STR_TEMPLATE_NAME22_DEF "Vintage" +#define STR_TEMPLATE_NAME23_DEF "Vivid" +#define STR_TEMPLATE_NAME24_DEF "CV" +#define STR_TEMPLATE_NAME25_DEF "Resume" +#define STR_TEMPLATE_NAME26_DEF "Default" +#define STR_TEMPLATE_NAME27_DEF "Modern" +#define STR_TEMPLATE_NAME28_DEF "Modern business letter sans-serif" +#define STR_TEMPLATE_NAME29_DEF "Modern business letter serif" +#define STR_TEMPLATE_NAME30_DEF "Businesscard with logo" +#define STR_TEMPLATE_NAME31_DEF "Simple" +#define STR_TEMPLATE_NAME32_DEF "BPMN" + +#define CMIS_TYPE_STRING "String" +#define CMIS_TYPE_INTEGER "Integer" +#define CMIS_TYPE_DECIMAL "Decimal" +#define CMIS_TYPE_DATETIME "Datetime" +#define CMIS_TYPE_BOOL "Bool" + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/sfx2/inc/templatecontaineritem.hxx b/sfx2/inc/templatecontaineritem.hxx new file mode 100644 index 000000000..e11e2bd21 --- /dev/null +++ b/sfx2/inc/templatecontaineritem.hxx @@ -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/. + */ + +#pragma once + +#include + +class TemplateContainerItem final +{ +public: + sal_uInt16 mnId; + sal_uInt16 mnRegionId; + OUString maTitle; + std::vector maTemplates; + + TemplateContainerItem (sal_uInt16 nId); + + ~TemplateContainerItem (); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/templatedefaultview.hxx b/sfx2/inc/templatedefaultview.hxx new file mode 100644 index 000000000..9020a779b --- /dev/null +++ b/sfx2/inc/templatedefaultview.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/. + */ + +#pragma once + +#include + +class TemplateDefaultView final : public TemplateLocalView +{ +public: + TemplateDefaultView(Window *pParent); + + virtual void reload() override; + + virtual void showAllTemplates () override; + + virtual void KeyInput( const KeyEvent& rKEvt ) override; + + virtual void MouseButtonDown( const MouseEvent& rMEvt ) override; + + void createContextMenu(); + +private: + long mnItemMaxSize; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/templateviewitem.hxx b/sfx2/inc/templateviewitem.hxx new file mode 100644 index 000000000..536808f47 --- /dev/null +++ b/sfx2/inc/templateviewitem.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/. + */ + +#pragma once + +#include "thumbnailviewitem.hxx" + +class TemplateViewItem : public ThumbnailViewItem +{ +public: + + TemplateViewItem (ThumbnailViewBase &rView, sal_uInt16 nId); + + virtual ~TemplateViewItem () override; + + void setPath (const OUString &rPath) { maPath = rPath; } + + const OUString& getPath () const { return maPath; } + + void showDefaultIcon(bool bVal) { mbIsDefaultTemplate = bVal; } + + bool IsDefaultTemplate() const { return mbIsDefaultTemplate; } + + tools::Rectangle getDefaultIconArea() const; + + virtual void Paint (drawinglayer::processor2d::BaseProcessor2D *pProcessor, + const ThumbnailItemAttributes *pAttrs) override; + + sal_uInt16 mnRegionId; + sal_uInt16 mnDocId; + +private: + + OUString maPath; + BitmapEx maDefaultBitmap; + bool mbIsDefaultTemplate; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/thumbnailviewitem.hxx b/sfx2/inc/thumbnailviewitem.hxx new file mode 100644 index 000000000..dea5e65c1 --- /dev/null +++ b/sfx2/inc/thumbnailviewitem.hxx @@ -0,0 +1,137 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in 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::accessibility { class XAccessible; } +namespace drawinglayer::primitive2d { class Primitive2DContainer; } + +#define THUMBNAILVIEW_ITEM_NONEITEM 0xFFFE + +const int THUMBNAILVIEW_ITEM_CORNER = 5; + +class ThumbnailViewBase; +class MouseEvent; + +namespace basegfx { + class B2DPolygon; +} + +namespace drawinglayer { + namespace processor2d { + class BaseProcessor2D; + } + + namespace primitive2d { + class PolygonHairlinePrimitive2D; + } +} + +struct ThumbnailItemAttributes +{ + sal_uInt32 nMaxTextLength; + basegfx::BColor aFillColor; + basegfx::BColor aTextColor; + basegfx::BColor aHighlightColor; + basegfx::BColor aHighlightTextColor; + basegfx::BColor aSelectHighlightColor; + basegfx::BColor aSelectHighlightTextColor; + double fHighlightTransparence; + basegfx::B2DVector aFontSize; + drawinglayer::attribute::FontAttribute aFontAttr; +}; + +class ThumbnailViewItem +{ +public: + + ThumbnailViewBase &mrParent; + sal_uInt16 mnId; + bool mbVisible; + bool mbSelected; + bool mbHover; + BitmapEx maPreview1; + OUString maTitle; + OUString maHelpText; + css::uno::Reference< css::accessibility::XAccessible > mxAcc; + + ThumbnailViewItem (ThumbnailViewBase &rView, sal_uInt16 nId); + + virtual ~ThumbnailViewItem (); + + bool isVisible () const { return mbVisible; } + + void show (bool bVisible); + + bool isSelected () const { return mbSelected; } + + void setSelection (bool state); + + bool isHighlighted () const { return mbHover; } + + void setHighlight (bool state); + + /** Updates own highlight status based on the aPoint position. + + Returns rectangle that needs to be invalidated. + */ + virtual tools::Rectangle updateHighlight(bool bVisible, const Point& rPoint); + + /// Text to be used for the tooltip. + + void setHelpText (const OUString &sText) { maHelpText = sText; } + + virtual OUString getHelpText() const { return maHelpText; }; + OUString const & getTitle() const { return maTitle; }; + + void setTitle (const OUString& rTitle); + + css::uno::Reference< css::accessibility::XAccessible > const & + GetAccessible( bool bIsTransientChildrenDisabled ); + + void setDrawArea (const tools::Rectangle &area); + + const tools::Rectangle& getDrawArea () const { return maDrawArea; } + + virtual void calculateItemsPosition (const long nThumbnailHeight, + const long nPadding, sal_uInt32 nMaxTextLength, + const ThumbnailItemAttributes *pAttrs); + + virtual void Paint (drawinglayer::processor2d::BaseProcessor2D *pProcessor, + const ThumbnailItemAttributes *pAttrs); + void addTextPrimitives (const OUString& rText, const ThumbnailItemAttributes *pAttrs, Point aPos, drawinglayer::primitive2d::Primitive2DContainer& rSeq); + + static drawinglayer::primitive2d::PolygonHairlinePrimitive2D* + createBorderLine (const basegfx::B2DPolygon &rPolygon); + + virtual void MouseButtonUp(const MouseEvent&) {} + +protected: + + Point maTextPos; + Point maPrev1Pos; + tools::Rectangle maDrawArea; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/inc/unoctitm.hxx b/sfx2/inc/unoctitm.hxx new file mode 100644 index 000000000..c18015032 --- /dev/null +++ b/sfx2/inc/unoctitm.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 + +#include +#include + +namespace com::sun::star::frame { class XFrame; } +namespace com::sun::star::frame { class XNotifyingDispatch; } +namespace com::sun::star::frame { class XStatusListener; } +namespace com::sun::star::frame { struct FeatureStateEvent; } + +class SfxBindings; +class SfxDispatcher; +class SfxSlot; + +typedef cppu::OMultiTypeInterfaceContainerHelperVar + SfxStatusDispatcher_Impl_ListenerContainer; + +class SfxStatusDispatcher : public cppu::WeakImplHelper +{ + ::osl::Mutex aMutex; + SfxStatusDispatcher_Impl_ListenerContainer aListeners; + +public: + + SfxStatusDispatcher(); + + // XDispatch + virtual void SAL_CALL dispatchWithNotification( const css::util::URL& aURL, + const css::uno::Sequence< css::beans::PropertyValue >& aArgs, + const css::uno::Reference< css::frame::XDispatchResultListener >& rListener ) override; + 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; + + // Something else + void ReleaseAll(); + SfxStatusDispatcher_Impl_ListenerContainer& GetListeners() + { return aListeners; } +}; + +class SfxSlotServer; +class SfxDispatchController_Impl; +class SfxOfficeDispatch final : public cppu::ImplInheritanceHelper +{ +friend class SfxDispatchController_Impl; + std::unique_ptr pImpl; +public: + SfxOfficeDispatch( SfxBindings& rBind, + SfxDispatcher* pDispat, + const SfxSlot* pSlot, + const css::util::URL& rURL ); + SfxOfficeDispatch( SfxDispatcher* pDispat, + const SfxSlot* pSlot, + const css::util::URL& rURL ); + virtual ~SfxOfficeDispatch() override; + + virtual void SAL_CALL dispatchWithNotification( const css::util::URL& aURL, + const css::uno::Sequence< css::beans::PropertyValue >& aArgs, + const css::uno::Reference< css::frame::XDispatchResultListener >& rListener ) override; + 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; + + // XUnoTunnel + virtual sal_Int64 SAL_CALL getSomething( const css::uno::Sequence< sal_Int8 >& aIdentifier ) override ; + static const css::uno::Sequence< sal_Int8 >& impl_getStaticIdentifier(); + + static bool IsMasterUnoCommand( const css::util::URL& aURL ); + static OUString GetMasterUnoCommand( const css::util::URL& aURL ); + + void SetFrame(const css::uno::Reference< css::frame::XFrame >& xFrame); + + void SetMasterUnoCommand( bool bSet ); + + SfxDispatcher* GetDispatcher_Impl(); +}; + +class SfxDispatchController_Impl : public SfxControllerItem +{ + css::util::URL aDispatchURL; + SfxDispatcher* pDispatcher; + SfxBindings* pBindings; + const SfxPoolItem* pLastState; + SfxOfficeDispatch* pDispatch; + bool bMasterSlave; + bool bVisible; + css::uno::WeakReference< css::frame::XFrame > xFrame; + + static void addParametersToArgs( const css::util::URL& aURL, + css::uno::Sequence< css::beans::PropertyValue >& rArgs ); + static MapUnit GetCoreMetric( SfxItemPool const & rPool, sal_uInt16 nSlot ); + + void sendStatusChanged(const OUString& rURL, const css::frame::FeatureStateEvent& rEvent); + +public: + SfxDispatchController_Impl( SfxOfficeDispatch* pDisp, + SfxBindings* pBind, + SfxDispatcher* pDispat, + const SfxSlot* pSlot, + const css::util::URL& rURL ); + virtual ~SfxDispatchController_Impl() override; + + static OUString getSlaveCommand( const css::util::URL& rURL ); + + void StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState, SfxSlotServer const * pServ ); + virtual void StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState ) override; + void setMasterSlaveCommand( bool bSet ); + /// @throws css::uno::RuntimeException + void dispatch( const css::util::URL& aURL, + const css::uno::Sequence< css::beans::PropertyValue >& aArgs, + const css::uno::Reference< css::frame::XDispatchResultListener >& rListener ); + /// @throws css::uno::RuntimeException + void addStatusListener(const css::uno::Reference< css::frame::XStatusListener > & xControl, const css::util::URL& aURL); + void UnBindController(); + SfxDispatcher* GetDispatcher(); + void SetFrame(const css::uno::Reference< css::frame::XFrame >& xFrame); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/qa/complex/sfx2/DocumentEvents.java b/sfx2/qa/complex/sfx2/DocumentEvents.java new file mode 100644 index 000000000..32c7ba5ae --- /dev/null +++ b/sfx2/qa/complex/sfx2/DocumentEvents.java @@ -0,0 +1,221 @@ +package complex.sfx2; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.openoffice.test.OfficeConnection; +import org.openoffice.test.tools.OfficeDocument; + +import com.sun.star.document.DocumentEvent; +import com.sun.star.document.XDocumentEventBroadcaster; +import com.sun.star.document.XDocumentEventListener; +import com.sun.star.lang.EventObject; +import com.sun.star.lang.XEventListener; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.util.CloseVetoException; +import com.sun.star.util.XCloseListener; +import com.sun.star.util.XCloseable; + +public class DocumentEvents +{ + private static final OfficeConnection m_connection = new OfficeConnection(); + + @BeforeClass + public static void setUpConnection() throws Exception + { + m_connection.setUp(); + } + + + @AfterClass + public static void tearDownConnection() throws InterruptedException, com.sun.star.uno.Exception + { + m_connection.tearDown(); + } + + @Before + public void beforeTest() throws Exception + { + final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface( + XMultiServiceFactory.class, m_connection.getComponentContext().getServiceManager() ); + m_document = OfficeDocument.blankTextDocument( xMSF1 ); + } + + @After + public void afterTest() + { + if ( m_document != null ) + { + assertTrue( "closing the test document failed", m_document.close() ); + m_document = null; + } + } + + /** + * sets up the environment for a test which checks the behavior upon closing a doc + */ + private void impl_setupDocCloseTest() + { + m_observedCloseEvents.clear(); + + final XDocumentEventBroadcaster docEventBroadcaster = UnoRuntime.queryInterface( + XDocumentEventBroadcaster.class, m_document.getDocument() ); + docEventBroadcaster.addDocumentEventListener( new DocumentEventListener() ); + + final XCloseable docCloseable = UnoRuntime.queryInterface( XCloseable.class, + m_document.getDocument() ); + docCloseable.addCloseListener( new CloseListener() ); + + m_document.getDocument().addEventListener( new DocDisposeListener() ); + } + + /** + * sets up the environment for a test which checks the behavior upon closing a doc + */ + private void impl_tearDownDocCloseTest( final String i_docCloseMethod ) + { + synchronized( m_document ) + { + try + { + m_document.wait(10000); + } + catch (InterruptedException ex) + { + // don't continue the test if somebody interrupted us ... + return; + } + } + + m_document = null; + synchronized( m_observedCloseEvents ) + { + assertArrayEquals( + "wrong order of events when closing a doc " + i_docCloseMethod, + new CloseEventType[] { CloseEventType.OnUnload, CloseEventType.NotifyClosing, CloseEventType.Disposing }, + m_observedCloseEvents.toArray( new CloseEventType[0] ) + ); + } + } + + @Test + public void testCloseWinEvents() throws Exception + { + impl_setupDocCloseTest(); + m_document.getCurrentView().dispatch( ".uno:CloseWin" ); + impl_tearDownDocCloseTest( "via .uno:CloseWin" ); + } + + //@Test + public void testCloseDocEvents() throws Exception + { + impl_setupDocCloseTest(); + m_document.getCurrentView().dispatch( ".uno:CloseDoc" ); + impl_tearDownDocCloseTest( "via .uno:CloseDoc" ); + } + + //@Test + public void testCloseByAPI() + { + impl_setupDocCloseTest(); + // closing the doc by API is synchronous, so do this in a separate thread, else we will get a deadlock + // when the document tries to call back our listener (well, I admit I didn't understand *why* we get this + // deadlock ... :-\ ) + (new DocCloser()).start(); + impl_tearDownDocCloseTest( "by API" ); + } + + private class DocumentEventListener implements XDocumentEventListener + { + + public void documentEventOccured( DocumentEvent i_documentEvent ) + { + if ( i_documentEvent.EventName.equals( "OnUnload" ) ) + { + synchronized( m_observedCloseEvents ) + { + m_observedCloseEvents.add( CloseEventType.OnUnload ); + } + } + } + + public void disposing(EventObject eo) + { + // not interested in + } + } + + private class CloseListener implements XCloseListener + { + + public void queryClosing(EventObject eo, boolean bln) throws CloseVetoException + { + // not interested in + } + + public void notifyClosing(EventObject eo) + { + synchronized( m_observedCloseEvents ) + { + m_observedCloseEvents.add( CloseEventType.NotifyClosing ); + } + } + + public void disposing(EventObject eo) + { + // not interested in + } + } + + private class DocDisposeListener implements XEventListener + { + public void disposing(EventObject eo) + { + synchronized( m_observedCloseEvents ) + { + m_observedCloseEvents.add( CloseEventType.Disposing ); + } + synchronized ( m_document ) + { + m_document.notifyAll(); + } + } + } + + private class DocCloser extends Thread + { + @Override + public void run() + { + try + { + final XCloseable docCloseable = UnoRuntime.queryInterface(XCloseable.class, m_document.getDocument()); + docCloseable.close(true); + } + catch (CloseVetoException ex) + { + Logger.getLogger(DocumentEvents.class.getName()).log(Level.SEVERE, null, ex); + } + } + } + + private enum CloseEventType + { + OnUnload, + NotifyClosing, + Disposing + } + + private OfficeDocument m_document = null; + final private ArrayList< CloseEventType > m_observedCloseEvents = new ArrayList(); +} diff --git a/sfx2/qa/complex/sfx2/DocumentMetadataAccess.java b/sfx2/qa/complex/sfx2/DocumentMetadataAccess.java new file mode 100644 index 000000000..5697bba07 --- /dev/null +++ b/sfx2/qa/complex/sfx2/DocumentMetadataAccess.java @@ -0,0 +1,1228 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package complex.sfx2; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import helper.StreamSimulator; + +import lib.TestParameters; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.openoffice.test.OfficeConnection; + +import com.sun.star.beans.Pair; +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.StringPair; +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.XEnumeration; +import com.sun.star.container.XEnumerationAccess; +import com.sun.star.frame.XStorable; +import com.sun.star.io.XInputStream; +import com.sun.star.lang.IllegalArgumentException; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XServiceInfo; +import com.sun.star.rdf.BlankNode; +import com.sun.star.rdf.FileFormat; +import com.sun.star.rdf.Literal; +import com.sun.star.rdf.Statement; +import com.sun.star.rdf.URI; +import com.sun.star.rdf.URIs; +import com.sun.star.rdf.XBlankNode; +import com.sun.star.rdf.XDocumentMetadataAccess; +import com.sun.star.rdf.XDocumentRepository; +import com.sun.star.rdf.XLiteral; +import com.sun.star.rdf.XMetadatable; +import com.sun.star.rdf.XNamedGraph; +import com.sun.star.rdf.XNode; +import com.sun.star.rdf.XQuerySelectResult; +import com.sun.star.rdf.XRepository; +import com.sun.star.rdf.XRepositorySupplier; +import com.sun.star.rdf.XURI; +import com.sun.star.text.XText; +import com.sun.star.text.XTextDocument; +import com.sun.star.text.XTextRange; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XComponentContext; +import com.sun.star.util.XCloseable; +import complex.sfx2.tools.TestDocument; + +/** + * Test case for interface com.sun.star.rdf.XDocumentMetadataAccess + * Currently, this service is implemented in + * sfx2/source/doc/DocumentMetadataAccess.cxx + * + * Actually, this is not a service, so we need to create a document and + * go from there... + * + */ +public class DocumentMetadataAccess +{ + XMultiServiceFactory xMSF; + XComponentContext xContext; + String tempDir; + + String nsRDF = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; + String nsRDFS = "http://www.w3.org/2000/01/rdf-schema#"; + String nsPkg="http://docs.oasis-open.org/opendocument/meta/package/common#"; + String nsODF ="http://docs.oasis-open.org/opendocument/meta/package/odf#"; + + XURI foo; + XURI bar; + XURI baz; + + static XURI rdf_type; + static XURI rdfs_label; + static XURI pkg_Document; + static XURI pkg_hasPart; + static XURI pkg_MetadataFile; + static XURI odf_ContentFile; + static XURI odf_StylesFile; + static XURI odf_Element; + static XBlankNode blank1; + static XBlankNode blank2; + static XBlankNode blank3; + static XBlankNode blank4; + static String manifestPath = "manifest.rdf"; + static String contentPath = "content.xml"; + static String stylesPath = "styles.xml"; + static String fooPath = "foo.rdf"; + static String fooBarPath = "meta/foo/bar.rdf"; + + XRepository xRep; + XRepositorySupplier xRS; + XDocumentMetadataAccess xDMA; + + /** + * The test parameters + */ + private static TestParameters param = null; + + @Before public void before() throws Exception + { + xMSF = getMSF(); + param = new TestParameters(); + param.put("ServiceFactory", xMSF); // important for param.getMSF() + + assertNotNull("could not create MultiServiceFactory.", xMSF); + XPropertySet xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, xMSF); + Object defaultCtx = xPropertySet.getPropertyValue("DefaultContext"); + xContext = UnoRuntime.queryInterface(XComponentContext.class, defaultCtx); + assertNotNull("could not get component context.", xContext); + + tempDir = util.utils.getOfficeTemp/*Dir*/(xMSF); + System.out.println("tempdir: " + tempDir); + + foo = URI.create(xContext, "uri:foo"); + assertNotNull("foo", foo); + bar = URI.create(xContext, "uri:bar"); + assertNotNull("bar", bar); + baz = URI.create(xContext, "uri:baz"); + assertNotNull("baz", baz); + + blank1 = BlankNode.create(xContext, "_:1"); + assertNotNull("blank1", blank1); + blank2 = BlankNode.create(xContext, "_:2"); + assertNotNull("blank2", blank2); + blank3 = BlankNode.create(xContext, "_:3"); + assertNotNull("blank3", blank3); + blank4 = BlankNode.create(xContext, "_:4"); + assertNotNull("blank4", blank4); + rdf_type = URI.createKnown(xContext, URIs.RDF_TYPE); + assertNotNull("rdf_type", rdf_type); + rdfs_label = URI.createKnown(xContext, URIs.RDFS_LABEL); + assertNotNull("rdfs_label", rdfs_label); + pkg_Document = URI.createKnown(xContext, URIs.PKG_DOCUMENT); + assertNotNull("pkg_Document", pkg_Document); + pkg_hasPart = URI.createKnown(xContext, URIs.PKG_HASPART); + assertNotNull("pkg_hasPart", pkg_hasPart); + pkg_MetadataFile = URI.createKnown(xContext, URIs.PKG_METADATAFILE); + assertNotNull("pkg_MetadataFile", pkg_MetadataFile); + odf_ContentFile = URI.createKnown(xContext, URIs.ODF_CONTENTFILE); + assertNotNull("odf_ContentFile", odf_ContentFile); + odf_StylesFile = URI.createKnown(xContext, URIs.ODF_STYLESFILE); + assertNotNull("odf_StylesFile", odf_StylesFile); + odf_Element = URI.createKnown(xContext, URIs.ODF_ELEMENT); + assertNotNull("odf_Element", odf_Element); + } + + @After public void after() + { + xRep = null; + xRS = null; + xDMA = null; + } + + @Test public void check() throws Exception + { + XComponent xComp = null; + XComponent xComp2 = null; + try { + XEnumeration xStmtsEnum; + XNamedGraph xManifest; + + System.out.println("Creating document with Repository..."); + + // we cannot create a XDMA directly, we must create + // a document and get it from there :( + // create document + PropertyValue[] loadProps = new PropertyValue[1]; + loadProps[0] = new PropertyValue(); + loadProps[0].Name = "Hidden"; + loadProps[0].Value = true; + xComp = util.DesktopTools.openNewDoc(xMSF, "swriter", loadProps); + XTextDocument xText = UnoRuntime.queryInterface(XTextDocument.class, xComp); + + XRepositorySupplier xRepoSupplier = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp); + assertNotNull("xRS null", xRepoSupplier); + XDocumentMetadataAccess xDocMDAccess = UnoRuntime.queryInterface(XDocumentMetadataAccess.class, xRepoSupplier); + assertNotNull("xDMA null", xDocMDAccess); + xRep = xRepoSupplier.getRDFRepository(); + assertNotNull("xRep null", xRep); + + System.out.println("...done"); + + System.out.println("Checking that new repository is initialized..."); + + XURI xBaseURI = xDocMDAccess; + String baseURI = xBaseURI.getStringValue(); + assertNotNull("new: baseURI", xBaseURI ); + assertTrue("new: baseURI", !xBaseURI.getStringValue().equals("")); + + assertTrue("new: # graphs", 1 == xRep.getGraphNames().length); + XURI manifest = URI.createNS(xContext, xBaseURI.getStringValue(), + manifestPath); + xManifest = xRep.getGraph(manifest); + assertTrue("new: manifest graph", null != xManifest); + + Statement[] manifestStmts = getManifestStmts(xBaseURI); + xStmtsEnum = xRep.getStatements(null, null, null); + assertTrue("new: manifest graph", eq(xStmtsEnum, manifestStmts)); + + System.out.println("...done"); + + System.out.println("Checking some invalid args..."); + + String content = "behold, for I am the content."; + new TestRange(content); + + try { + xDocMDAccess.getElementByURI(null); + fail("getElementByURI: null allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.getMetadataGraphsWithType(null); + fail("getMetadataGraphsWithType: null URI allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.addMetadataFile("", new XURI[0]); + fail("addMetadataFile: empty filename allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.addMetadataFile("/foo", new XURI[0]); + fail("addMetadataFile: absolute filename allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.addMetadataFile("fo\"o", new XURI[0]); + fail("addMetadataFile: invalid filename allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.addMetadataFile("../foo", new XURI[0]); + fail("addMetadataFile: filename with .. allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.addMetadataFile("foo/../../bar", new XURI[0]); + fail("addMetadataFile: filename with nest .. allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.addMetadataFile("foo/././bar", new XURI[0]); + fail("addMetadataFile: filename with nest . allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.addMetadataFile("content.xml", new XURI[0]); + fail("addMetadataFile: content.xml allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.addMetadataFile("styles.xml", new XURI[0]); + fail("addMetadataFile: styles.xml allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.addMetadataFile("meta.xml", new XURI[0]); + fail("addMetadataFile: meta.xml allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.addMetadataFile("settings.xml", new XURI[0]); + fail("addMetadataFile: settings.xml allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, null, "foo", + foo, new XURI[0]); + fail("importMetadataFile: null stream allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + + final String sEmptyRDF = TestDocument.getUrl("empty.rdf"); + try { + XInputStream xFooIn = new StreamSimulator(sEmptyRDF, true, param); + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, xFooIn, "", + foo, new XURI[0]); + fail("importMetadataFile: empty filename allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + XInputStream xFooIn = + new StreamSimulator(sEmptyRDF, true, param); + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, xFooIn, "meta.xml", + foo, new XURI[0]); + fail("importMetadataFile: meta.xml filename allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + XInputStream xFooIn = + new StreamSimulator(sEmptyRDF, true, param); + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, + xFooIn, "foo", null, new XURI[0]); + fail("importMetadataFile: null base URI allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + XInputStream xFooIn = + new StreamSimulator(sEmptyRDF, true, param); + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, + xFooIn, "foo", rdf_type, new XURI[0]); + fail("importMetadataFile: non-absolute base URI allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.removeMetadataFile(null); + fail("removeMetadataFile: null URI allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.addContentOrStylesFile(""); + fail("addContentOrStylesFile: empty filename allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.addContentOrStylesFile("/content.xml"); + fail("addContentOrStylesFile: absolute filename allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.addContentOrStylesFile("foo.rdf"); + fail("addContentOrStylesFile: invalid filename allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.removeContentOrStylesFile(""); + fail("removeContentOrStylesFile: empty filename allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.loadMetadataFromStorage(null, foo, null); + fail("loadMetadataFromStorage: null storage allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.storeMetadataToStorage(null/*, base*/); + fail("storeMetadataToStorage: null storage allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.loadMetadataFromMedium(new PropertyValue[0]); + fail("loadMetadataFromMedium: empty medium allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + try { + xDocMDAccess.storeMetadataToMedium(new PropertyValue[0]); + fail("storeMetadataToMedium: empty medium allowed"); + } catch (IllegalArgumentException e) { + // ignore + } + + System.out.println("...done"); + + System.out.println("Checking file addition/removal..."); + + xDocMDAccess.removeContentOrStylesFile(contentPath); + xStmtsEnum = xManifest.getStatements(null, null, null); + assertTrue("removeContentOrStylesFile (content)", + eq(xStmtsEnum, new Statement[] { + manifestStmts[0], manifestStmts[2], manifestStmts[4] + })); + + xDocMDAccess.addContentOrStylesFile(contentPath); + xStmtsEnum = xManifest.getStatements(null, null, null); + assertTrue("addContentOrStylesFile (content)", + eq(xStmtsEnum, manifestStmts)); + + xDocMDAccess.removeContentOrStylesFile(stylesPath); + xStmtsEnum = xManifest.getStatements(null, null, null); + assertTrue("removeContentOrStylesFile (styles)", + eq(xStmtsEnum, new Statement[] { + manifestStmts[0], manifestStmts[1], manifestStmts[3] + })); + + xDocMDAccess.addContentOrStylesFile(stylesPath); + xStmtsEnum = xManifest.getStatements(null, null, null); + assertTrue("addContentOrStylesFile (styles)", + eq(xStmtsEnum, manifestStmts)); + + XURI xFoo = URI.createNS(xContext, xBaseURI.getStringValue(), + fooPath); + Statement xM_BaseHaspartFoo = + new Statement(xBaseURI, pkg_hasPart, xFoo, manifest); + Statement xM_FooTypeMetadata = + new Statement(xFoo, rdf_type, pkg_MetadataFile, manifest); + Statement xM_FooTypeBar = + new Statement(xFoo, rdf_type, bar, manifest); + xDocMDAccess.addMetadataFile(fooPath, new XURI[] { bar }); + xStmtsEnum = xManifest.getStatements(null, null, null); + assertTrue("addMetadataFile", + eq(xStmtsEnum, merge(manifestStmts, new Statement[] { + xM_BaseHaspartFoo, xM_FooTypeMetadata, xM_FooTypeBar + }))); + + XURI[] graphsBar = xDocMDAccess.getMetadataGraphsWithType(bar); + assertTrue("getMetadataGraphsWithType", + graphsBar.length == 1 && eq(graphsBar[0], xFoo)); + + + xDocMDAccess.removeMetadataFile(xFoo); + xStmtsEnum = xManifest.getStatements(null, null, null); + assertTrue("removeMetadataFile", + eq(xStmtsEnum, manifestStmts)); + + System.out.println("...done"); + + System.out.println("Checking mapping..."); + + XEnumerationAccess xTextEnum = UnoRuntime.queryInterface(XEnumerationAccess.class, xText.getText()); + Object o = xTextEnum.createEnumeration().nextElement(); + XMetadatable xMeta1 = UnoRuntime.queryInterface(XMetadatable.class, o); + + XMetadatable xMeta; + xMeta = xDocMDAccess.getElementByURI(xMeta1); + assertTrue("getElementByURI: null", null != xMeta); + String XmlId = xMeta.getMetadataReference().Second; + String XmlId1 = xMeta1.getMetadataReference().Second; + assertTrue("getElementByURI: no xml id", !XmlId.equals("")); + assertTrue("getElementByURI: different xml id", XmlId.equals(XmlId1)); + + System.out.println("...done"); + + System.out.println("Checking storing and loading..."); + + XURI xFoobar = URI.createNS(xContext, xBaseURI.getStringValue(), + fooBarPath); + Statement[] metadataStmts = getMetadataFileStmts(xBaseURI, + fooBarPath); + xDocMDAccess.addMetadataFile(fooBarPath, new XURI[0]); + xStmtsEnum = xRep.getStatements(null, null, null); + assertTrue("addMetadataFile", + eq(xStmtsEnum, merge(manifestStmts, metadataStmts ))); + + Statement xFoobar_FooBarFoo = + new Statement(foo, bar, foo, xFoobar); + xRep.getGraph(xFoobar).addStatement(foo, bar, foo); + xStmtsEnum = xRep.getStatements(null, null, null); + assertTrue("addStatement", + eq(xStmtsEnum, merge(manifestStmts, merge(metadataStmts, + new Statement[] { xFoobar_FooBarFoo })))); + + PropertyValue noMDNoContentFile = new PropertyValue(); + noMDNoContentFile.Name = "URL"; + noMDNoContentFile.Value = TestDocument.getUrl("CUSTOM.odt"); + PropertyValue noMDFile = new PropertyValue(); + noMDFile.Name = "URL"; + noMDFile.Value = TestDocument.getUrl("TEST.odt"); + PropertyValue file = new PropertyValue(); + file.Name = "URL"; + file.Value = tempDir + "TESTDMA.odt"; + PropertyValue mimetype = new PropertyValue(); + mimetype.Name = "MediaType"; + mimetype.Value = "application/vnd.oasis.opendocument.text"; + PropertyValue[] argsEmptyNoContent = { mimetype, noMDNoContentFile}; + PropertyValue[] argsEmpty = { mimetype, noMDFile }; + PropertyValue[] args = { mimetype, file }; + + xStmtsEnum = xRep.getStatements(null, null, null); + XURI[] graphs = xRep.getGraphNames(); + + xDocMDAccess.storeMetadataToMedium(args); + + // this should re-init + xDocMDAccess.loadMetadataFromMedium(argsEmptyNoContent); + xRep = xRepoSupplier.getRDFRepository(); + assertTrue("xRep null", null != xRep); + assertTrue("baseURI still tdoc?", + !baseURI.equals(xDocMDAccess.getStringValue())); + Statement[] manifestStmts2 = getManifestStmts(xDocMDAccess); + xStmtsEnum = xRep.getStatements(null, null, null); + // there is no content or styles file in here, so we have just + // the package stmt + assertTrue("loadMetadataFromMedium (no metadata, no content)", + eq(xStmtsEnum, new Statement[] { manifestStmts2[0] })); + + // this should re-init + xDocMDAccess.loadMetadataFromMedium(argsEmpty); + xRep = xRepoSupplier.getRDFRepository(); + assertTrue("xRep null", null != xRep); + assertTrue("baseURI still tdoc?", + !baseURI.equals(xDocMDAccess.getStringValue())); + Statement[] manifestStmts3 = getManifestStmts(xDocMDAccess); + + xStmtsEnum = xRep.getStatements(null, null, null); + assertTrue("loadMetadataFromMedium (no metadata)", + eq(xStmtsEnum, manifestStmts3)); + + xDocMDAccess.loadMetadataFromMedium(args); + xRep = xRepoSupplier.getRDFRepository(); + assertTrue("xRep null", null != xRep); + Statement[] manifestStmts4 = getManifestStmts(xDocMDAccess); + Statement[] metadataStmts4 = getMetadataFileStmts(xDocMDAccess, + fooBarPath); + + xStmtsEnum = xRep.getStatements(null, null, null); + assertTrue("some graph(s) not reloaded", + graphs.length == xRep.getGraphNames().length); + + XURI xFoobar4 = URI.createNS(xContext, xDocMDAccess.getStringValue(), + fooBarPath); + Statement xFoobar_FooBarFoo4 = + new Statement(foo, bar, foo, xFoobar4); + assertTrue("loadMetadataFromMedium (re-load)", + eq(xStmtsEnum, merge(manifestStmts4, merge(metadataStmts4, + new Statement[] { xFoobar_FooBarFoo4 })))); + + System.out.println("...done"); + + System.out.println("Checking storing and loading via model..."); + + String f = tempDir + "TESTPARA.odt"; + + XStorable xStor = UnoRuntime.queryInterface(XStorable.class, xRepoSupplier); + + xStor.storeToURL(f, new PropertyValue[0]); + + xComp2 = util.DesktopTools.loadDoc(xMSF, f, loadProps); + + XDocumentMetadataAccess xDMA2 = UnoRuntime.queryInterface(XDocumentMetadataAccess.class, xComp2); + assertTrue("xDMA2 null", null != xDMA2); + + XRepositorySupplier xRS2 = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp2); + assertTrue("xRS2 null", null != xRS2); + + XRepository xRep2 = xRS2.getRDFRepository(); + assertTrue("xRep2 null", null != xRep2); + + Statement[] manifestStmts5 = getManifestStmts(xDMA2); + Statement[] metadataStmts5 = getMetadataFileStmts(xDMA2, + fooBarPath); + XURI xFoobar5 = URI.createNS(xContext, xDMA2.getStringValue(), + fooBarPath); + Statement xFoobar_FooBarFoo5 = + new Statement(foo, bar, foo, xFoobar5); + xStmtsEnum = xRep.getStatements(null, null, null); + XEnumeration xStmtsEnum2 = xRep2.getStatements(null, null, null); + assertTrue("load: repository differs", + eq(xStmtsEnum2, merge(manifestStmts5, merge(metadataStmts5, + new Statement[] { xFoobar_FooBarFoo5 })))); + + System.out.println("...done"); + + } finally { + close(xComp); + close(xComp2); + } + } + + @Test public void checkRDFa() throws Exception + { + XComponent xComp = null; + try { + final String file = TestDocument.getUrl("TESTRDFA.odt"); + xComp = loadRDFa(file); + if (xComp != null) + { + final String sNewFile = tempDir + "TESTRDFA.odt"; + storeRDFa(xComp, sNewFile); + close(xComp); + + xComp = loadRDFa(sNewFile); + } + } finally { + close(xComp); + } + } + + @Test + public void checkTdf123293() throws Exception + { + XComponent xComp = null; + try { + xComp = util.DesktopTools.loadDocUsingStream(xMSF, TestDocument.getPath("TESTRDFA.odt")); + + // Metadata was discarded when loading from stream, make sure it's there now + XRepositorySupplier xRepoSupplier = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp); + assertNotNull("No metadata loaded", xRepoSupplier); + } finally { + close(xComp); + } + } + + private void storeRDFa(XComponent xComp, String file) throws com.sun.star.io.IOException + { + System.out.println("Storing test document..."); + + XStorable xStor = UnoRuntime.queryInterface(XStorable.class, xComp); + + xStor.storeToURL(file, new PropertyValue[0]); + + System.out.println("...done"); + } + + private XComponent loadRDFa(String file) throws Exception + { + XComponent xComp = null; + + System.out.println("Loading test document..."); + + PropertyValue[] loadProps = new PropertyValue[1]; + loadProps[0] = new PropertyValue(); + loadProps[0].Name = "Hidden"; + loadProps[0].Value = true; + + + + xComp = util.DesktopTools.loadDoc(xMSF, file, loadProps); + + XRepositorySupplier xRepoSupplier = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp); + assertTrue("xRS null", null != xRepoSupplier); + + XDocumentRepository xDocRepository = UnoRuntime.queryInterface(XDocumentRepository.class, xRepoSupplier.getRDFRepository()); + assertTrue("xRep null", null != xDocRepository); + + XTextDocument xTextDoc = UnoRuntime.queryInterface(XTextDocument.class, xComp); + + XText xText = xTextDoc.getText(); + + XEnumerationAccess xEA = UnoRuntime.queryInterface(XEnumerationAccess.class, xText); + XEnumeration xEnum = xEA.createEnumeration(); + + System.out.println("...done"); + + System.out.println("Checking RDFa in loaded test document..."); + + XMetadatable xPara; + Pair result; + + Statement x_FooBarLit1 = new Statement(foo, bar, mkLit("1"), null); + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 1", + !result.Second && + eq(result.First, new Statement[] { + x_FooBarLit1 + })); + + Statement x_FooBarLit2 = new Statement(foo, bar, mkLit("2"), null); + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 2", + !result.Second && + eq(result.First, new Statement[] { + x_FooBarLit2 + })); + + Statement x_BlankBarLit3 = + new Statement(blank1, bar, mkLit("3"), null); + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 3", + !result.Second && + eq(result.First, new Statement[] { + x_BlankBarLit3 + })); + XBlankNode b3 = UnoRuntime.queryInterface(XBlankNode.class, result.First[0].Subject); + + Statement x_BlankBarLit4 = + new Statement(blank2, bar, mkLit("4"), null); + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 4", + !result.Second && + eq(result.First, new Statement[] { + x_BlankBarLit4 + })); + XBlankNode b4 = UnoRuntime.queryInterface(XBlankNode.class, result.First[0].Subject); + + Statement x_BlankBarLit5 = + new Statement(blank1, bar, mkLit("5"), null); + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 5", + !result.Second && + eq(result.First, new Statement[] { + x_BlankBarLit5 + })); + XBlankNode b5 = UnoRuntime.queryInterface(XBlankNode.class, result.First[0].Subject); + + assertTrue("RDFa: 3 != 4", + !b3.getStringValue().equals(b4.getStringValue())); + assertTrue("RDFa: 3 == 5", + b3.getStringValue().equals(b5.getStringValue())); + + Statement x_FooBarLit6 = new Statement(foo, bar, mkLit("6"), null); + Statement x_FooBazLit6 = new Statement(foo, baz, mkLit("6"), null); + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 6", + !result.Second && + eq(result.First, new Statement[] { + x_FooBarLit6, x_FooBazLit6 + })); + + Statement x_FooBarLit7 = new Statement(foo, bar, mkLit("7"), null); + Statement x_FooBazLit7 = new Statement(foo, baz, mkLit("7"), null); + Statement x_FooFooLit7 = new Statement(foo, foo, mkLit("7"), null); + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 7", + !result.Second && + eq(result.First, new Statement[] { + x_FooBarLit7, x_FooBazLit7, x_FooFooLit7 + })); + + XNode lit = mkLit("a fooish bar"); + XNode lit_type= mkLit("a fooish bar", bar); + Statement x_FooBarLit = new Statement(foo, bar, lit, null); + Statement x_FooBarLittype = new Statement(foo, bar, lit_type, null); + + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 8", + result.Second && + eq(result.First, new Statement[] { + x_FooBarLit + })); + + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 9", + result.Second && + eq(result.First, new Statement[] { + x_FooBarLit + })); + + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 10", + result.Second && + eq(result.First, new Statement[] { + x_FooBarLittype + })); + + Statement x_FooBarLit11 + = new Statement(foo, bar, mkLit("11", bar), null); + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 11", + !result.Second && + eq(result.First, new Statement[] { + x_FooBarLit11 + })); + + XURI xFile = URI.createNS(xContext, file, "/" + contentPath); + Statement x_FileBarLit12 = + new Statement(xFile, bar, mkLit("12"), null); + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 12", + !result.Second && + eq(result.First, new Statement[] { + x_FileBarLit12 + })); + + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 13", + result.Second && + eq(result.First, new Statement[] { + x_FooBarLit + })); + + new Statement(foo, rdfs_label, mkLit("14"), null); + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 14", + result.Second && + eq(result.First, new Statement[] { + /* x_FooLabelLit14 */ x_FooBarLit + })); + + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 15", eq(result.First, new Statement[] { } )); + + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 16", eq(result.First, new Statement[] { } )); + + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 17", eq(result.First, new Statement[] { } )); + + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 18", eq(result.First, new Statement[] { } )); + + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 19", eq(result.First, new Statement[] { } )); + + xPara = UnoRuntime.queryInterface( + XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 20", eq(result.First, new Statement[] { } )); + + xPara = UnoRuntime.queryInterface( + XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 21", eq(result.First, new Statement[] { } )); + + System.out.println("...done"); + + return xComp; + } + + +// utilities ------------------------------------------------------------- + + static void close(XComponent i_comp) + { + try { + XCloseable xClos = UnoRuntime.queryInterface(XCloseable.class, i_comp); + if (xClos != null) + { + xClos.close(true); + } + } catch (Exception e) { + } + } + + XLiteral mkLit(String i_content) + { + return Literal.create(xContext, i_content); + } + + XLiteral mkLit(String i_content, XURI i_uri) + { + return Literal.createWithType(xContext, i_content, i_uri); + } + + static Statement[] merge(Statement[] i_A1, Statement[] i_A2) + { + // bah, java sucks... + Statement[] ret = new Statement[i_A1.length + i_A2.length]; + for (int i = 0; i < i_A1.length; ++i) { + ret[i] = i_A1[i]; + } + for (int i = 0; i < i_A2.length; ++i) { + ret[i+i_A1.length] = i_A2[i]; + } + return ret; + } + + public static String toS(XNode n) { + if (null == n) + { + return "< null >"; + } + return n.getStringValue(); + } + + static boolean isBlank(XNode i_node) + { + XBlankNode blank = UnoRuntime.queryInterface(XBlankNode.class, i_node); + return blank != null; + } + + + static Statement[] toSeq(XEnumeration i_Enum) throws Exception + { + java.util.Collection c = new java.util.ArrayList(); + while (i_Enum.hasMoreElements()) { + Statement s = (Statement) i_Enum.nextElement(); + c.add(s); + } + // java sucks + Object[] arr = c.toArray(); + Statement[] ret = new Statement[arr.length]; + for (int i = 0; i < arr.length; ++i) { + ret[i] = (Statement) arr[i]; + } + return ret; + } + + static XNode[][] toSeqs(XEnumeration i_Enum) throws Exception + { + java.util.Collection c = new java.util.ArrayList(); + while (i_Enum.hasMoreElements()) { + XNode[] s = (XNode[]) i_Enum.nextElement(); + c.add(s); + } + Object[] arr = c.toArray(); + XNode[][] ret = new XNode[arr.length][]; + for (int i = 0; i < arr.length; ++i) { + ret[i] = (XNode[]) arr[i]; + } + return ret; + } + + private static class BindingComp implements java.util.Comparator + { + public int compare(XNode[] left, XNode[] right) + { + if (left.length != right.length) + { + throw new RuntimeException(); + } + for (int i = 0; i < left.length; ++i) { + int eq = (left[i].getStringValue().compareTo( + right[i].getStringValue())); + if (eq != 0) + { + return eq; + } + } + return 0; + } + } + + private static class StmtComp implements java.util.Comparator + { + public int compare(Statement left, Statement right) + { + int eq; + if ((eq = cmp(left.Graph, right.Graph )) != 0) return eq; + if ((eq = cmp(left.Subject, right.Subject )) != 0) return eq; + if ((eq = cmp(left.Predicate, right.Predicate)) != 0) return eq; + if ((eq = cmp(left.Object, right.Object )) != 0) return eq; + return 0; + } + + private int cmp(XNode i_Left, XNode i_Right) + { + if (isBlank(i_Left)) { + return isBlank(i_Right) ? 0 : 1; + } else { + if (isBlank(i_Right)) { + return -1; + } else { + return toS(i_Left).compareTo(toS(i_Right)); + } + } + } + } + + static boolean eq(Statement i_Left, Statement i_Right) + { + XURI lG = i_Left.Graph; + XURI rG = i_Right.Graph; + if (!eq(lG, rG)) { + System.out.println("Graphs differ: " + toS(lG) + " != " + toS(rG)); + return false; + } + if (!eq(i_Left.Subject, i_Right.Subject)) { + System.out.println("Subjects differ: " + + i_Left.Subject.getStringValue() + " != " + + i_Right.Subject.getStringValue()); + return false; + } + if (!eq(i_Left.Predicate, i_Right.Predicate)) { + System.out.println("Predicates differ: " + + i_Left.Predicate.getStringValue() + " != " + + i_Right.Predicate.getStringValue()); + return false; + } + if (!eq(i_Left.Object, i_Right.Object)) { + System.out.println("Objects differ: " + + i_Left.Object.getStringValue() + " != " + + i_Right.Object.getStringValue()); + return false; + } + return true; + } + + static boolean eq(Statement[] i_Result, Statement[] i_Expected) + { + if (i_Result.length != i_Expected.length) { + System.out.println("eq: different lengths: " + i_Result.length + " " + + i_Expected.length); + return false; + } + Statement[] expected = i_Expected.clone(); + java.util.Arrays.sort(i_Result, new StmtComp()); + java.util.Arrays.sort(expected, new StmtComp()); + for (int i = 0; i < expected.length; ++i) + { + // This is better for debug! + final Statement a = i_Result[i]; + final Statement b = expected[i]; + final boolean cond = eq(a, b); + if (!cond) return false; + } + return true; + } + + static boolean eq(XEnumeration i_Enum, Statement[] i_Expected) + throws Exception + { + Statement[] current = toSeq(i_Enum); + return eq(current, i_Expected); + } + + static boolean eq(XNode i_Left, XNode i_Right) + { + if (i_Left == null) { + return (i_Right == null); + } else { + return (i_Right != null) && + (i_Left.getStringValue().equals(i_Right.getStringValue()) + // FIXME: hack: blank nodes considered equal + || (isBlank(i_Left) && isBlank(i_Right))); + } + } + + static boolean eq(XQuerySelectResult i_Result, + String[] i_Vars, XNode[][] i_Bindings) throws Exception + { + String[] vars = i_Result.getBindingNames(); + XEnumeration iter = i_Result; + XNode[][] bindings = toSeqs(iter); + if (vars.length != i_Vars.length) { + System.out.println("var lengths differ"); + return false; + } + if (bindings.length != i_Bindings.length) { + System.out.println("binding lengths differ: " + i_Bindings.length + + " vs " + bindings.length ); + return false; + } + java.util.Arrays.sort(bindings, new BindingComp()); + java.util.Arrays.sort(i_Bindings, new BindingComp()); + for (int i = 0; i < i_Bindings.length; ++i) { + if (i_Bindings[i].length != i_Vars.length) { + System.out.println("TEST ERROR!"); + throw new Exception(); + } + if (bindings[i].length != i_Vars.length) { + System.out.println("binding length and var length differ"); + return false; + } + for (int j = 0; j < i_Vars.length; ++j) { + if (!eq(bindings[i][j], i_Bindings[i][j])) { + System.out.println("bindings differ: " + + toS(bindings[i][j]) + " != " + toS(i_Bindings[i][j])); + return false; + } + } + } + for (int i = 0; i < i_Vars.length; ++i) { + if (!vars[i].equals(i_Vars[i])) { + System.out.println("variable names differ: " + + vars[i] + " != " + i_Vars[i]); + return false; + } + } + return true; + } + + static boolean eq(StringPair i_Left, StringPair i_Right) + { + return ((i_Left.First).equals(i_Right.First)) && + ((i_Left.Second).equals(i_Right.Second)); + } + + static String mkNamespace(String i_prefix, String i_namespace) + { + return "PREFIX " + i_prefix + ": <" + i_namespace + ">\n"; + } + + static String mkNss() + { + String namespaces = mkNamespace("rdf", + "http://www.w3.org/1999/02/22-rdf-syntax-ns#"); + namespaces += mkNamespace("pkg", + "http://docs.oasis-open.org/opendocument/meta/package/common#"); + namespaces += mkNamespace("odf", + "http://docs.oasis-open.org/opendocument/meta/package/odf#"); + return namespaces; + } + + Statement[] getManifestStmts(XURI xBaseURI) throws Exception + { + XURI xManifest = URI.createNS(xContext, xBaseURI.getStringValue(), + manifestPath); + XURI xContent = URI.createNS(xContext, xBaseURI.getStringValue(), + contentPath); + XURI xStyles = URI.createNS(xContext, xBaseURI.getStringValue(), + stylesPath); + Statement xM_BaseTypeDoc = + new Statement(xBaseURI, rdf_type, pkg_Document, xManifest); + Statement xM_BaseHaspartContent = + new Statement(xBaseURI, pkg_hasPart, xContent, xManifest); + Statement xM_BaseHaspartStyles = + new Statement(xBaseURI, pkg_hasPart, xStyles, xManifest); + Statement xM_ContentTypeContent = + new Statement(xContent, rdf_type, odf_ContentFile, xManifest); + Statement xM_StylesTypeStyles = + new Statement(xStyles, rdf_type, odf_StylesFile, xManifest); + return new Statement[] { + xM_BaseTypeDoc, xM_BaseHaspartContent, xM_BaseHaspartStyles, + xM_ContentTypeContent, xM_StylesTypeStyles + }; + } + + Statement[] getMetadataFileStmts(XURI xBaseURI, String Path) + throws Exception + { + XURI xManifest = URI.createNS(xContext, xBaseURI.getStringValue(), + manifestPath); + XURI xGraph = URI.createNS(xContext, xBaseURI.getStringValue(), Path); + Statement xM_BaseHaspartGraph = + new Statement(xBaseURI, pkg_hasPart, xGraph, xManifest); + Statement xM_GraphTypeMetadata = + new Statement(xGraph, rdf_type, pkg_MetadataFile, xManifest); + return new Statement[] { xM_BaseHaspartGraph, xM_GraphTypeMetadata }; + } + + class TestRange implements XTextRange, XMetadatable, XServiceInfo + { + String m_Stream; + String m_XmlId; + String m_Text; + TestRange(String i_Str) { m_Text = i_Str; } + + public String getStringValue() { return ""; } + public String getNamespace() { return ""; } + public String getLocalName() { return ""; } + + public StringPair getMetadataReference() + { + return new StringPair(m_Stream, m_XmlId); + } + public void setMetadataReference(StringPair i_Ref) + throws IllegalArgumentException + { + m_Stream = i_Ref.First; + m_XmlId = i_Ref.Second; + } + public void ensureMetadataReference() + { + m_Stream = "content.xml"; + m_XmlId = "42"; + } + + public String getImplementationName() { return null; } + public String[] getSupportedServiceNames() { return null; } + public boolean supportsService(String i_Svc) + { + return i_Svc.equals("com.sun.star.text.Paragraph"); + } + + public XText getText() { return null; } + public XTextRange getStart() { return null; } + public XTextRange getEnd() { return null; } + public String getString() { return m_Text; } + public void setString(String i_Str) { m_Text = i_Str; } + } + + + + private XMultiServiceFactory getMSF() + { + return UnoRuntime.queryInterface(XMultiServiceFactory.class, connection.getComponentContext().getServiceManager()); + } + + // setup and close connections + @BeforeClass public static void setUpConnection() throws Exception { + System.out.println( "------------------------------------------------------------" ); + System.out.println( "starting class: " + DocumentMetadataAccess.class.getName() ); + System.out.println( "------------------------------------------------------------" ); + connection.setUp(); + } + + @AfterClass public static void tearDownConnection() + throws InterruptedException, com.sun.star.uno.Exception + { + System.out.println( "------------------------------------------------------------" ); + System.out.println( "finishing class: " + DocumentMetadataAccess.class.getName() ); + System.out.println( "------------------------------------------------------------" ); + connection.tearDown(); + } + + private static final OfficeConnection connection = new OfficeConnection(); + +} + diff --git a/sfx2/qa/complex/sfx2/DocumentProperties.java b/sfx2/qa/complex/sfx2/DocumentProperties.java new file mode 100644 index 000000000..c5f84b1b7 --- /dev/null +++ b/sfx2/qa/complex/sfx2/DocumentProperties.java @@ -0,0 +1,516 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package complex.sfx2; + + +import complex.sfx2.tools.TestDocument; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XComponentContext; +import com.sun.star.lang.XInitialization; + +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.Locale; +import com.sun.star.lang.EventObject; +import com.sun.star.util.Date; +import com.sun.star.util.DateTime; +import com.sun.star.util.Time; +import com.sun.star.util.Duration; +import com.sun.star.util.XModifyListener; +import com.sun.star.util.XModifyBroadcaster; +import com.sun.star.beans.XPropertyContainer; +import com.sun.star.beans.XPropertySet; +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.NamedValue; +import com.sun.star.beans.PropertyAttribute; +import com.sun.star.beans.UnknownPropertyException; +import com.sun.star.beans.IllegalTypeException; + +import com.sun.star.document.XDocumentProperties; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.openoffice.test.OfficeConnection; +import static org.junit.Assert.*; + +/** + * Test case for the service com.sun.star.document.DocumentProperties. + * Currently, this service is implemented in + * sfx2/source/doc/SfxDocumentMetaData.cxx. + * + */ +public class DocumentProperties +{ + @After public void cleanup() { + // nothing to do + } + + // for testing modifications + private class Listener implements XModifyListener { + private boolean m_Called; + + Listener() { + m_Called = false; + } + + private boolean reset() { + boolean oldCalled = m_Called; + m_Called = false; + return oldCalled; + } + + public void modified(EventObject e) { + m_Called = true; + } + + public void disposing(EventObject e) { + } + } + + @Test public void check() throws Exception + { + XMultiServiceFactory xMSF = getMSF(); + assertNotNull("could not create MultiServiceFactory.", xMSF); + XPropertySet xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, xMSF); + Object defaultCtx = xPropertySet.getPropertyValue("DefaultContext"); + XComponentContext xContext = UnoRuntime.queryInterface(XComponentContext.class, defaultCtx); + assertNotNull("could not get component context.", xContext); + + // TODO: Path to temp + String temp = util.utils.getOfficeTemp/*Dir*/(xMSF); + System.out.println("tempdir: " + temp); + + PropertyValue[] noArgs = { }; + PropertyValue mimetype = new PropertyValue(); + mimetype.Name = "MediaType"; + mimetype.Value = "application/vnd.oasis.opendocument.text"; + PropertyValue[] mimeArgs = { mimetype }; + PropertyValue cfile = new PropertyValue(); + cfile.Name = "URL"; + cfile.Value = temp + "EMPTY.odt"; + PropertyValue[] mimeEmptyArgs = { mimetype, cfile }; + + System.out.println("Creating service DocumentProperties..."); + + Object oDP = + xMSF.createInstance("com.sun.star.document.DocumentProperties"); + XDocumentProperties xDP = UnoRuntime.queryInterface(XDocumentProperties.class, oDP); + + System.out.println("...done"); + + + System.out.println("Checking initialize ..."); + + XDocumentProperties xDP2 = UnoRuntime.queryInterface(XDocumentProperties.class, xMSF.createInstance("com.sun.star.document.DocumentProperties")); + XInitialization xInit = UnoRuntime.queryInterface(XInitialization.class, xDP2); + xInit.initialize(new Object[] { }); + + System.out.println("...done"); + + System.out.println("Checking storing default-initialized meta data ..."); + + xDP2.storeToMedium("", mimeEmptyArgs); + + System.out.println("...done"); + + System.out.println("Checking loading default-initialized meta data ..."); + + xDP2.loadFromMedium("", mimeEmptyArgs); + assertEquals("Author", "", xDP2.getAuthor()); + + System.out.println("...done"); + + System.out.println("Checking loading from test document..."); + + String file = TestDocument.getUrl("TEST.odt"); + xDP.loadFromMedium(file, noArgs); +/* XInputStream xStream = + new StreamSimulator("./testdocuments/TEST.odt", true, param); + Object oSF = + xMSF.createInstance("com.sun.star.embed.StorageFactory"); + XSingleServiceFactory xSF = (XSingleServiceFactory) + UnoRuntime.queryInterface(XSingleServiceFactory.class, oSF); + Object oStor = xSF.createInstanceWithArguments( + new Object[] { xStream }); + XStorage xStor = (XStorage) UnoRuntime.queryInterface( + XStorage.class, oStor); + xDP.loadFromStorage(xStor);*/ + + System.out.println("...done"); + + System.out.println("Checking meta-data import..."); + + assertEquals("Author", "Karl-Heinz Mustermann", xDP.getAuthor()); + assertEquals( + "Generator", + "StarOffice/8$Solaris_x86 OpenOffice.org_project/680m232$Build-9227", + xDP.getGenerator()); + assertEquals("CreationDate", 2007, xDP.getCreationDate().Year); + assertEquals("Title", "Urgent Memo", xDP.getTitle()); + assertEquals("Subject", "Wichtige Mitteilung", xDP.getSubject()); + assertEquals( + "Description", + "Modern internal company memorandum in full-blocked style", + xDP.getDescription()); + assertEquals( + "ModifiedBy", "Karl-Heinz Mustermann", xDP.getModifiedBy()); + assertEquals( + "ModificationDate", 10, xDP.getModificationDate().Month); + assertEquals( + "PrintedBy", "Karl-Heinz Mustermann", xDP.getPrintedBy()); + assertEquals("PrintDate", 29, xDP.getPrintDate().Day); + assertEquals("TemplateName", "Modern Memo", xDP.getTemplateName()); + assertTrue("TemplateURL", + xDP.getTemplateURL().endsWith("memmodern.ott")); + assertEquals("TemplateDate", 17, xDP.getTemplateDate().Hours); + assertTrue( + "AutoloadURL", xDP.getAutoloadURL().endsWith("/TEST.odt")); + assertEquals("AutoloadSecs", 0, xDP.getAutoloadSecs()); + assertEquals("DefaultTarget", "_blank", xDP.getDefaultTarget()); + assertEquals("EditingCycles", 3, xDP.getEditingCycles()); + assertEquals("EditingDuration", 320, xDP.getEditingDuration()); + + String[] kws = xDP.getKeywords(); + assertTrue("Keywords", fromArray(kws).containsAll( + fromArray(new Object[] { "Asien", "Memo", "Reis" }))); + + NamedValue[] ds = xDP.getDocumentStatistics(); + assertTrue("DocumentStatistics:WordCount", containsNV(ds, + new NamedValue("WordCount", Integer.valueOf(23)))); + assertTrue("DocumentStatistics:PageCount", containsNV(ds, + new NamedValue("PageCount", Integer.valueOf(1)))); + + XPropertyContainer udpc = xDP.getUserDefinedProperties(); + XPropertySet udps = UnoRuntime.queryInterface( XPropertySet.class, udpc ); + assertEquals( + "UserDefined 1", "Dies ist ein wichtiger Hinweis", + udps.getPropertyValue("Hinweis")); + assertEquals( + "UserDefined 2", "Kann Spuren von N\u00FCssen enthalten", + udps.getPropertyValue("Warnung")); + + System.out.println("...done"); + + System.out.println("Checking meta-data updates..."); + + String str; + DateTime dt = new DateTime(); + Locale l = new Locale(); + int i; + + str = "me"; + xDP.setAuthor(str); + assertEquals("setAuthor", str, xDP.getAuthor()); + str = "the computa"; + xDP.setGenerator(str); + assertEquals("setGenerator", str, xDP.getGenerator()); + dt.Year = 2038; + dt.Month = 1; + dt.Day = 1; + xDP.setCreationDate(dt); + assertEquals( + "setCreationDate", dt.Year, xDP.getCreationDate().Year); + str = "El t'itulo"; + xDP.setTitle(str); + assertEquals("setTitle", str, xDP.getTitle()); + str = "Ein verkommenes Subjekt"; + xDP.setSubject(str); + assertEquals("setSubject", str, xDP.getSubject()); + str = "Este descripci'on no es importante"; + xDP.setDescription(str); + assertEquals("setDescription", str, xDP.getDescription()); + l.Language = "en"; + l.Country = "GB"; + xDP.setLanguage(l); + Locale l2 = xDP.getLanguage(); + assertEquals("setLanguage Lang", l.Language, l2.Language); + assertEquals("setLanguage Cty", l.Country, l2.Country); + str = "myself"; + xDP.setModifiedBy(str); + assertEquals("setModifiedBy", str, xDP.getModifiedBy()); + dt.Year = 2042; + xDP.setModificationDate(dt); + assertEquals( + "setModificationDate", dt.Year, xDP.getModificationDate().Year); + str = "i did not do it"; + xDP.setPrintedBy(str); + assertEquals("setPrintedBy", str, xDP.getPrintedBy()); + dt.Year = 2024; + xDP.setPrintDate(dt); + assertEquals("setPrintDate", dt.Year, xDP.getPrintDate().Year); + str = "blah"; + xDP.setTemplateName(str); + assertEquals("setTemplateName", str, xDP.getTemplateName()); + str = "gopher://some-hole-in-the-ground/"; + xDP.setTemplateURL(str); + assertEquals("setTemplateURL", str, xDP.getTemplateURL()); + dt.Year = 2043; + xDP.setTemplateDate(dt); + assertEquals( + "setTemplateDate", dt.Year, xDP.getTemplateDate().Year); + str = "http://nowhere/"; + xDP.setAutoloadURL(str); + assertEquals("setAutoloadURL", str, xDP.getAutoloadURL()); + i = 3661; // this might not work (due to conversion via double...) + xDP.setAutoloadSecs(i); + assertEquals("setAutoloadSecs", i, xDP.getAutoloadSecs()); + str = "_blank"; + xDP.setDefaultTarget(str); + assertEquals("setDefaultTarget", str, xDP.getDefaultTarget()); + i = 42; + xDP.setEditingCycles((short) i); + assertEquals("setEditingCycles", i, xDP.getEditingCycles()); + i = 84; + xDP.setEditingDuration(i); + assertEquals("setEditingDuration", i, xDP.getEditingDuration()); + str = ""; + + String[] kws2 = new String[] { + "keywordly", "keywordlike", "keywordalicious" }; + xDP.setKeywords(kws2); + kws = xDP.getKeywords(); + assertTrue("setKeywords", fromArray(kws).containsAll(fromArray(kws2))); + + NamedValue[] ds2 = new NamedValue[] { + new NamedValue("SyllableCount", Integer.valueOf(9)), + new NamedValue("FrameCount", Integer.valueOf(2)), + new NamedValue("SentenceCount", Integer.valueOf(7)) }; + xDP.setDocumentStatistics(ds2); + ds = xDP.getDocumentStatistics(); + assertTrue("setDocumentStatistics:SyllableCount", containsNV(ds, + new NamedValue("SyllableCount", Integer.valueOf(9)))); + assertTrue("setDocumentStatistics:FrameCount", containsNV(ds, + new NamedValue("FrameCount", Integer.valueOf(2)))); + assertTrue("setDocumentStatistics:SentenceCount", containsNV(ds, + new NamedValue("SentenceCount", Integer.valueOf(7)))); + + System.out.println("...done"); + + System.out.println("Checking user-defined meta-data updates..."); + + // actually, this tests the PropertyBag service + // but maybe the DocumentProperties service will be implemented + // differently some day... + boolean b = true; + double d = 3.1415; + // note that Time is only supported for backward compatibility! + Time t = new Time(); + t.Hours = 1; + t.Minutes = 16; + Date date = new Date(); + date.Year = 2071; + date.Month = 2; + date.Day = 3; + dt.Year = 2065; + Duration dur = new Duration(); + dur.Negative = true; + dur.Years = 1001; + dur.Months = 999; + dur.Days = 888; + dur.Hours = 777; + dur.Minutes = 666; + dur.Seconds = 555; + dur.NanoSeconds = 444444444; + + udpc.addProperty("Frobnicate", PropertyAttribute.REMOVABLE, b); + udpc.addProperty("FrobDuration", PropertyAttribute.REMOVABLE, dur); + udpc.addProperty("FrobDuration2", PropertyAttribute.REMOVABLE, t); + udpc.addProperty("FrobEndDate", PropertyAttribute.REMOVABLE, date); + udpc.addProperty("FrobStartTime", PropertyAttribute.REMOVABLE, dt); + udpc.addProperty("Pi", PropertyAttribute.REMOVABLE, new Double(d)); + udpc.addProperty("Foo", PropertyAttribute.REMOVABLE, "bar"); + udpc.addProperty("Removed", PropertyAttribute.REMOVABLE, "bar"); + // #i94175#: empty property name is valid ODF 1.1 + udpc.addProperty("", PropertyAttribute.REMOVABLE, "eeeeek"); + try { + udpc.removeProperty("Info 1"); + udpc.removeProperty("Removed"); + } catch (UnknownPropertyException e) { + fail("removeProperty failed"); + } + + try { + udpc.addProperty("Forbidden", PropertyAttribute.REMOVABLE, + new String[] { "foo", "bar" }); + fail("inserting value of non-supported type did not fail"); + } catch (IllegalTypeException e) { + // ignore + } + + assertEquals( + "UserDefined bool", b, udps.getPropertyValue("Frobnicate")); + assertTrue("UserDefined duration", eqDuration(dur, (Duration) + udps.getPropertyValue("FrobDuration"))); + assertTrue("UserDefined time", eqTime(t, (Time) + udps.getPropertyValue("FrobDuration2"))); + assertTrue("UserDefined date", eqDate(date, (Date) + udps.getPropertyValue("FrobEndDate"))); + assertTrue("UserDefined datetime", eqDateTime(dt, (DateTime) + udps.getPropertyValue("FrobStartTime"))); + assertEquals("UserDefined float", d, udps.getPropertyValue("Pi")); + assertEquals( + "UserDefined string", "bar", udps.getPropertyValue("Foo")); + assertEquals( + "UserDefined empty name", "eeeeek", udps.getPropertyValue("")); + + try { + udps.getPropertyValue("Removed"); + fail("UserDefined remove didn't"); + } catch (UnknownPropertyException e) { + // ok + } + + System.out.println("...done"); + + System.out.println("Checking storing meta-data to file..."); + + xDP.storeToMedium(temp + "TEST.odt", mimeArgs); + + System.out.println("...done"); + + System.out.println("Checking loading meta-data from stored file..."); + + xDP.loadFromMedium(temp + "TEST.odt", noArgs); + + System.out.println("...done"); + + System.out.println("Checking user-defined meta-data from stored file..."); + + udpc = xDP.getUserDefinedProperties(); + udps = UnoRuntime.queryInterface( XPropertySet.class, udpc ); + + assertEquals( + "UserDefined bool", b, udps.getPropertyValue("Frobnicate")); + assertTrue("UserDefined duration", eqDuration(dur, (Duration) + udps.getPropertyValue("FrobDuration"))); + // this is now a Duration! + Duration t_dur = new Duration(false, (short)0, (short)0, (short)0, + t.Hours, t.Minutes, t.Seconds, + t.NanoSeconds); + assertTrue("UserDefined time", eqDuration(t_dur, (Duration) + udps.getPropertyValue("FrobDuration2"))); + assertTrue("UserDefined date", eqDate(date, (Date) + udps.getPropertyValue("FrobEndDate"))); + assertTrue("UserDefined datetime", eqDateTime(dt, (DateTime) + udps.getPropertyValue("FrobStartTime"))); + assertEquals("UserDefined float", d, udps.getPropertyValue("Pi")); + assertEquals( + "UserDefined string", "bar", udps.getPropertyValue("Foo")); + + try { + udps.getPropertyValue("Removed"); + fail("UserDefined remove didn't"); + } catch (UnknownPropertyException e) { + // ok + } + + System.out.println("...done"); + + System.out.println("Checking notification listener interface..."); + + Listener listener = new Listener(); + XModifyBroadcaster xMB = UnoRuntime.queryInterface( XModifyBroadcaster.class, xDP ); + xMB.addModifyListener(listener); + xDP.setAuthor("not me"); + assertTrue("Listener Author", listener.reset()); + udpc.addProperty("Listener", PropertyAttribute.REMOVABLE, "foo"); + assertTrue("Listener UserDefined Add", listener.reset()); + udps.setPropertyValue("Listener", "bar"); + assertTrue("Listener UserDefined Set", listener.reset()); + udpc.removeProperty("Listener"); + assertTrue("Listener UserDefined Remove", listener.reset()); + xMB.removeModifyListener(listener); + udpc.addProperty("Listener2", PropertyAttribute.REMOVABLE, "foo"); + assertTrue("Removed Listener UserDefined Add", !listener.reset()); + + System.out.println("...done"); + } + + // grrr... + boolean eqDateTime(DateTime a, DateTime b) { + return a.Year == b.Year && a.Month == b.Month && a.Day == b.Day + && a.Hours == b.Hours && a.Minutes == b.Minutes + && a.Seconds == b.Seconds + && a.NanoSeconds == b.NanoSeconds; + } + + boolean eqDate(Date a, Date b) { + return a.Year == b.Year && a.Month == b.Month && a.Day == b.Day; + } + + boolean eqTime(Time a, Time b) { + return a.Hours == b.Hours && a.Minutes == b.Minutes + && a.Seconds == b.Seconds + && a.NanoSeconds == b.NanoSeconds; + } + + boolean eqDuration(Duration a, Duration b) { + return a.Years == b.Years && a.Months == b.Months && a.Days == b.Days + && a.Hours == b.Hours && a.Minutes == b.Minutes + && a.Seconds == b.Seconds + && a.NanoSeconds == b.NanoSeconds + && a.Negative == b.Negative; + } + + java.util.Collection fromArray(Object[] os) { + java.util.Collection ret = new java.util.HashSet(); + for (int i = 0; i < os.length; ++i) { + ret.add(os[i]); + } + return ret; + } + + // bah, structs do not have proper equals(), and uno.Type is not comparable + public static boolean containsNV (NamedValue[] nvs, NamedValue nv) { + for (int i = 0; i < nvs.length; ++i) { + if (nvs[i].Name.equals(nv.Name) && nvs[i].Value.equals(nv.Value)) { + return true; + } + } + return false; + } + + private XMultiServiceFactory getMSF() + { + final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface( XMultiServiceFactory.class, connection.getComponentContext().getServiceManager() ); + return xMSF1; + } + + // setup and close connections + @BeforeClass public static void setUpConnection() throws Exception { + System.out.println( "------------------------------------------------------------" ); + System.out.println( "starting class: " + DocumentProperties.class.getName() ); + System.out.println( "------------------------------------------------------------" ); + connection.setUp(); + } + + @AfterClass public static void tearDownConnection() + throws InterruptedException, com.sun.star.uno.Exception + { + System.out.println( "------------------------------------------------------------" ); + System.out.println( "finishing class: " + DocumentProperties.class.getName() ); + System.out.println( "------------------------------------------------------------" ); + connection.tearDown(); + } + + private static final OfficeConnection connection = new OfficeConnection(); + +} + diff --git a/sfx2/qa/complex/sfx2/GlobalEventBroadcaster.java b/sfx2/qa/complex/sfx2/GlobalEventBroadcaster.java new file mode 100644 index 000000000..7c42cdf1f --- /dev/null +++ b/sfx2/qa/complex/sfx2/GlobalEventBroadcaster.java @@ -0,0 +1,249 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package complex.sfx2; + +import com.sun.star.awt.XWindow; +import com.sun.star.document.XEventBroadcaster; +import com.sun.star.document.XEventListener; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.sheet.XSpreadsheetDocument; +import com.sun.star.text.XTextDocument; +import com.sun.star.uno.UnoRuntime; +import complex.sfx2.tools.WriterHelper; + +import java.util.ArrayList; + +import util.UITools; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.openoffice.test.OfficeConnection; +import static org.junit.Assert.*; + + +/** + * This testcase checks the GlobalEventBroadcaster + * it will add an XEventListener and verify the Events + * raised when opening/changing and closing Office Documents + */ +public class GlobalEventBroadcaster { + XMultiServiceFactory m_xMSF = null; + XEventBroadcaster m_xEventBroadcaster = null; + ArrayList notifyEvents = new ArrayList(); + // XTextDocument xTextDoc; + XSpreadsheetDocument xSheetDoc; + XEventListener m_xEventListener = new EventListenerImpl(); + + @Before public void initialize() { + m_xMSF = getMSF(); + System.out.println("check whether there is a valid MultiServiceFactory"); + + assertNotNull("## Couldn't get MultiServiceFactory make sure your Office is started", m_xMSF); + + System.out.println("... done"); + + System.out.println( + "Create an instance of com.sun.star.frame.GlobalEventBroadcaster"); + + Object GlobalEventBroadcaster = null; + + try { + GlobalEventBroadcaster = m_xMSF.createInstance( + "com.sun.star.frame.GlobalEventBroadcaster"); + } catch (com.sun.star.uno.Exception e) { + fail("## Exception while creating instance"); + } + + System.out.println("... done"); + + System.out.println("check whether the created instance is valid"); + + assertNotNull("couldn't create service", GlobalEventBroadcaster); + + System.out.println("... done"); + + System.out.println( + "try to query the XEventBroadcaster from the gained Object"); + m_xEventBroadcaster = UnoRuntime.queryInterface(XEventBroadcaster.class, GlobalEventBroadcaster); + + if (util.utils.isVoid(m_xEventBroadcaster)) { + fail("couldn't get XEventBroadcaster"); + } + + System.out.println("... done"); + + System.out.println("adding Listener"); + m_xEventBroadcaster.addEventListener(m_xEventListener); + System.out.println("... done"); + } + + @Test public void checkWriter() throws Exception { + System.out.println("-- Checking Writer --"); + + WriterHelper wHelper = new WriterHelper(m_xMSF); + String[] expected; + System.out.println("opening an empty writer doc"); + notifyEvents.clear(); + { + XTextDocument xTextDoc = wHelper.openEmptyDoc(); + util.utils.waitForEventIdle(m_xMSF); + expected = new String[] { "OnUnfocus", "OnCreate", "OnViewCreated", "OnFocus" }; + + assertTrue("Wrong events fired when opening empty doc", + proveExpectation(expected)); + System.out.println("... done"); + + System.out.println("changing the writer doc"); + notifyEvents.clear(); + xTextDoc.getText().setString("GlobalEventBroadcaster"); + util.utils.waitForEventIdle(m_xMSF); + expected = new String[] { "OnModifyChanged" }; + + assertTrue("Wrong events fired when changing doc", + proveExpectation(expected)); + System.out.println("... done"); + + System.out.println("closing the empty writer doc"); + notifyEvents.clear(); + wHelper.closeDoc(xTextDoc); + util.utils.waitForEventIdle(m_xMSF); + } + expected = new String[] { "OnUnfocus", "OnFocus", "OnViewClosed", "OnUnload" }; + + assertTrue("Wrong events fired when closing empty doc", + proveExpectation(expected)); + System.out.println("... done"); + + System.out.println("opening a writer doc via Window-New Window"); + notifyEvents.clear(); + { + XTextDocument xTextDoc = wHelper.openFromDialog(".uno:NewWindow", "", false); + + util.utils.waitForEventIdle(m_xMSF); + expected = new String[] { "OnUnfocus", "OnCreate", "OnViewCreated", "OnFocus", "OnUnfocus", "OnViewCreated", "OnFocus", }; + + assertTrue("Wrong events fired when opening a writer doc via Window-New Window", + proveExpectation(expected)); + System.out.println("... done"); + + System.out.println("closing the created writer doc"); + notifyEvents.clear(); + + wHelper.closeDoc(xTextDoc); + util.utils.waitForEventIdle(m_xMSF); + } + expected = new String[] { "OnViewClosed", "OnUnfocus", "OnFocus", "OnViewClosed", "OnUnload" }; + + assertTrue("Wrong events fired when closing Window-New Window", + proveExpectation(expected)); + + System.out.println("... done"); + // TODO: It seems not possible to close the document without interactive question + // there the follow test will not be execute + if (false) { + System.out.println("Opening document with label wizard"); + XTextDocument xTextDoc = wHelper.openFromDialog("private:factory/swriter?slot=21051", "", false); + util.utils.waitForEventIdle(m_xMSF); + XWindow xWindow = UnoRuntime.queryInterface(XWindow.class, wHelper.getToolkit().getActiveTopWindow()); + UITools ut = new UITools(xWindow); + notifyEvents.clear(); + System.out.println("pressing button 'New Document'"); + try{ + ut.clickButton ("New Document"); + } catch (Exception e) { + System.out.println("Couldn't press Button"); + } + System.out.println("... done"); + util.utils.waitForEventIdle(m_xMSF); + expected = new String[] { "OnViewClosed", "OnCreate", "OnFocus", "OnModifyChanged" }; + + assertTrue("Wrong events fired when starting labels wizard", + proveExpectation(expected)); + + System.out.println("Try to close document..."); + wHelper.closeDoc(xTextDoc); + util.utils.waitForEventIdle(m_xMSF); + wHelper.closeFromDialog(); + util.utils.waitForEventIdle(m_xMSF); + xTextDoc = null; + } + + System.out.println("-- Done Writer --"); + } + + @After public void cleanup() { + System.out.println("removing Listener"); + m_xEventBroadcaster.removeEventListener(m_xEventListener); + System.out.println("... done"); + } + + private boolean proveExpectation(String[] expected) { + boolean locRes = true; + boolean failure = false; + + System.out.println("Fired Events:"); + for (int k=0;k0; ) + undoManager.addUndoAction( new CountingUndoAction( --i, lock, actionsUndone ) ); + + // some concurrent threads which undo the actions + Thread[] threads = new Thread[threadCount]; + for ( int i=0; i + m_activeUndoContexts = new Stack(); + private String m_mostRecentlyAddedAction = null; + private String m_mostRecentlyUndone = null; + private final Object m_allContextsClosedCondition = new Object(); + } + + + private void impl_checkUndo() throws Exception + { + System.out.println( "testing: " + m_currentTestCase.getDocumentDescription() ); + m_currentDocument = m_currentTestCase.getDocument(); + m_currentTestCase.initializeDocument(); + m_currentTestCase.verifyInitialDocumentState(); + + final XUndoManager undoManager = getUndoManager(); + undoManager.clear(); + assertFalse( "clearing the Undo manager should result in the impossibility to undo anything", undoManager.isUndoPossible() ); + assertFalse( "clearing the Undo manager should result in the impossibility to redo anything", undoManager.isRedoPossible() ); + + m_undoListener = new UndoListener(); + undoManager.addUndoManagerListener( m_undoListener ); + + impl_testSingleModification( undoManager ); + impl_testMultipleModifications( undoManager ); + impl_testCustomUndoActions( undoManager ); + impl_testLocking( undoManager ); + impl_testNestedContexts( undoManager ); + impl_testErrorHandling( undoManager ); + impl_testContextHandling( undoManager ); + impl_testStackHandling( undoManager ); + impl_testClearance( undoManager ); + impl_testHiddenContexts( undoManager ); + + // close the document, ensure the Undo manager listener gets notified + m_currentTestCase.closeDocument(); + m_currentTestCase = null; + m_currentDocument = null; + assertTrue( "document is closed, but the UndoManagerListener has not been notified of the disposal", m_undoListener.isDisposed() ); + } + + + private void impl_testSingleModification( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + m_currentTestCase.doSingleModification(); + m_currentTestCase.verifySingleModificationDocumentState(); + + // undo the modification, ensure the listener got the proper notifications + assertEquals( "We did not yet do an undo!", 0, m_undoListener.getUndoActionCount() ); + i_undoManager.undo(); + assertEquals( "A simple undo does not result in the proper Undo count.", + 1, m_undoListener.getUndoActionCount() ); + + // verify the document is in its initial state, again + m_currentTestCase.verifyInitialDocumentState(); + + // redo the modification, ensure the listener got the proper notifications + assertEquals( "not yet made a redo!", 0, m_undoListener.getRedoActionCount() ); + i_undoManager.redo(); + assertEquals( "made a redo, but got no notification of it!", 1, m_undoListener.getRedoActionCount() ); + // ensure the document is in the proper state, again + m_currentTestCase.verifySingleModificationDocumentState(); + + // now do an Undo via the UI (aka the dispatch API), and see if this works, and notifies the listener as + // expected + m_currentTestCase.getDocument().getCurrentView().dispatch( ".uno:Undo" ); + m_currentTestCase.verifyInitialDocumentState(); + assertEquals( "UI-Undo does not notify the listener", 2, m_undoListener.getUndoActionCount() ); + } + + + private void impl_testMultipleModifications( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + m_undoListener.reset(); + assertEquals( "unexpected initial undo context depth", 0, m_undoListener.getCurrentUndoContextDepth() ); + i_undoManager.enterUndoContext( "Batch Changes" ); + assertEquals( "unexpected undo context depth after entering a context", + 1, m_undoListener.getCurrentUndoContextDepth() ); + assertEquals( "entering an Undo context has not been notified properly", + "Batch Changes", m_undoListener.getCurrentUndoContextTitle() ); + + final int modifications = m_currentTestCase.doMultipleModifications(); + assertEquals( "unexpected number of undo actions while doing batch changes to the document", + modifications, m_undoListener.getUndoActionsAdded() ); + assertEquals( "seems the document operations touched the undo context depth", + 1, m_undoListener.getCurrentUndoContextDepth() ); + + i_undoManager.leaveUndoContext(); + assertEquals( "unexpected undo context depth after leaving the last context", + 0, m_undoListener.getCurrentUndoContextDepth() ); + assertEquals( "no Undo done, yet - still the listener has been notified of an Undo action", + 0, m_undoListener.getUndoActionCount() ); + + i_undoManager.undo(); + assertEquals( "Just did an undo - the listener should have been notified", 1, m_undoListener.getUndoActionCount() ); + m_currentTestCase.verifyInitialDocumentState(); + } + + + private void impl_testCustomUndoActions( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.clear(); + m_undoListener.reset(); + assertFalse( "undo stack not empty after clearing the undo manager", i_undoManager.isUndoPossible() ); + assertFalse( "redo stack not empty after clearing the undo manager", i_undoManager.isRedoPossible() ); + assertArrayEquals( ">0 descriptions for an empty undo stack?", + new String[0], i_undoManager.getAllUndoActionTitles() ); + assertArrayEquals( ">0 descriptions for an empty redo stack?", + new String[0], i_undoManager.getAllRedoActionTitles() ); + + // add two actions, one directly, one within a context + final CustomUndoAction action1 = new CustomUndoAction( "UndoAction1" ); + i_undoManager.addUndoAction( action1 ); + assertEquals( "Adding an undo action not observed by the listener", 1, m_undoListener.getUndoActionsAdded() ); + assertEquals( "Adding an undo action did not notify the proper title", + action1.getTitle(), m_undoListener.getMostRecentlyAddedActionTitle() ); + final String contextTitle = "Undo Context"; + i_undoManager.enterUndoContext( contextTitle ); + final CustomUndoAction action2 = new CustomUndoAction( "UndoAction2" ); + i_undoManager.addUndoAction( action2 ); + assertEquals( "Adding an undo action not observed by the listener", + 2, m_undoListener.getUndoActionsAdded() ); + assertEquals( "Adding an undo action did not notify the proper title", + action2.getTitle(), m_undoListener.getMostRecentlyAddedActionTitle() ); + i_undoManager.leaveUndoContext(); + + // see if the manager has proper descriptions + assertArrayEquals( "unexpected Redo descriptions after adding two actions", + new String[0], i_undoManager.getAllRedoActionTitles() ); + assertArrayEquals( "unexpected Undo descriptions after adding two actions", + new String[]{contextTitle, action1.getTitle()}, i_undoManager.getAllUndoActionTitles() ); + + // undo one action + i_undoManager.undo(); + assertEquals( "improper action title notified during programmatic Undo", + contextTitle, m_undoListener.getMostRecentlyUndoneTitle() ); + assertTrue( "nested custom undo action has not been undone as expected", action2.undoCalled() ); + assertFalse( "nested custom undo action has not been undone as expected", action1.undoCalled() ); + assertArrayEquals( "unexpected Redo descriptions after undoing a nested custom action", + new String[]{contextTitle}, i_undoManager.getAllRedoActionTitles() ); + assertArrayEquals( "unexpected Undo descriptions after undoing a nested custom action", + new String[]{action1.getTitle()}, i_undoManager.getAllUndoActionTitles() ); + + // undo the second action, via UI dispatches + m_currentTestCase.getDocument().getCurrentView().dispatch( ".uno:Undo" ); + assertEquals( "improper action title notified during UI Undo", action1.getTitle(), m_undoListener.getMostRecentlyUndoneTitle() ); + assertTrue( "nested custom undo action has not been undone as expected", action1.undoCalled() ); + assertArrayEquals( "unexpected Redo descriptions after undoing the second custom action", + new String[]{action1.getTitle(), contextTitle}, i_undoManager.getAllRedoActionTitles() ); + assertArrayEquals( "unexpected Undo descriptions after undoing the second custom action", + new String[0], i_undoManager.getAllUndoActionTitles() ); + + // check the actions are disposed when the stacks are cleared + i_undoManager.clear(); + assertTrue( action1.disposed() && action2.disposed() ); + } + + + private void impl_testLocking( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + + // implicit Undo actions, triggered by changes to the document + assertFalse( "unexpected initial locking state", i_undoManager.isLocked() ); + i_undoManager.lock(); + assertTrue( "just locked the manager, why does it lie?", i_undoManager.isLocked() ); + m_currentTestCase.doSingleModification(); + assertEquals( "when the Undo manager is locked, no implicit additions should happen", + 0, m_undoListener.getUndoActionsAdded() ); + assertTrue( "Undo manager gets unlocked as a side effect of performing a simple operation", i_undoManager.isLocked() ); + i_undoManager.unlock(); + assertEquals( "unlock is not expected to add collected actions - they should be discarded", + 0, m_undoListener.getUndoActionsAdded() ); + assertFalse( "just unlocked the manager, why does it lie?", i_undoManager.isLocked() ); + + // explicit Undo actions + i_undoManager.lock(); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.unlock(); + assertEquals( "explicit Undo actions are expected to be ignored when the manager is locked", + 0, m_undoListener.getUndoActionsAdded() ); + + // Undo contexts while being locked + i_undoManager.lock(); + i_undoManager.enterUndoContext( "Dummy Context" ); + i_undoManager.enterHiddenUndoContext(); + assertEquals( "entering Undo contexts should be ignored when the manager is locked", 0, m_undoListener.getCurrentUndoContextDepth() ); + i_undoManager.leaveUndoContext(); + i_undoManager.leaveUndoContext(); + i_undoManager.unlock(); + + // |unlock| error handling + assertFalse( "internal error: manager should not be locked at this point in time", i_undoManager.isLocked() ); + boolean caughtExpected = false; + try { i_undoManager.unlock(); } catch ( final NotLockedException e ) { caughtExpected = true; } + assertTrue( "unlocking the manager when it is not locked should throw", caughtExpected ); + } + + + private void impl_testContextHandling( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + + // part I: non-empty contexts + i_undoManager.reset(); + m_undoListener.reset(); + + // put one action on the undo and one on the redo stack, as precondition for the following tests + final XUndoAction undoAction1 = new CustomUndoAction( "Undo Action 1" ); + i_undoManager.addUndoAction( undoAction1 ); + final XUndoAction undoAction2 = new CustomUndoAction( "Undo Action 2" ); + i_undoManager.addUndoAction( undoAction2 ); + i_undoManager.undo(); + assertTrue( "precondition for context handling tests not met (1)", i_undoManager.isUndoPossible() ); + assertTrue( "precondition for context handling tests not met (2)", i_undoManager.isRedoPossible() ); + assertArrayEquals( new String[] { undoAction1.getTitle() }, i_undoManager.getAllUndoActionTitles() ); + assertArrayEquals( new String[] { undoAction2.getTitle() }, i_undoManager.getAllRedoActionTitles() ); + + final String[] expectedRedoActionComments = new String[] { undoAction2.getTitle() }; + assertArrayEquals( expectedRedoActionComments, i_undoManager.getAllRedoActionTitles() ); + + // enter a context + i_undoManager.enterUndoContext( "Undo Context" ); + // this should not (yet) touch the redo stack + assertArrayEquals( expectedRedoActionComments, i_undoManager.getAllRedoActionTitles() ); + assertEquals( "unexpected undo context depth after entering a context", 1, m_undoListener.getCurrentUndoContextDepth() ); + // add a single action + XUndoAction undoAction3 = new CustomUndoAction( "Undo Action 3" ); + i_undoManager.addUndoAction( undoAction3 ); + // still, the redo stack should be untouched - added at a lower level does not affect it at all + assertArrayEquals( expectedRedoActionComments, i_undoManager.getAllRedoActionTitles() ); + + // while the context is open, its title should already contribute to the stack, ... + assertEquals( "Undo Context", i_undoManager.getCurrentUndoActionTitle() ); + // ... getAllUndo/RedoActionTitles should operate on the top level, not on the level defined by the open + // context, ... + assertArrayEquals( new String[] { "Undo Context", undoAction1.getTitle() }, + i_undoManager.getAllUndoActionTitles() ); + // ... but Undo and Redo should be impossible as long as the context is open + assertFalse( i_undoManager.isUndoPossible() ); + assertFalse( i_undoManager.isRedoPossible() ); + + // leave the context, check the listener has been notified properly, and the notified context depth is correct + i_undoManager.leaveUndoContext(); + assertTrue( m_undoListener.wasContextLeft() ); + assertFalse( m_undoListener.wasHiddenContextLeft() ); + assertFalse( m_undoListener.hasContextBeenCancelled() ); + assertEquals( "unexpected undo context depth leaving a non-empty context", 0, m_undoListener.getCurrentUndoContextDepth() ); + // leaving a non-empty context should have cleared the redo stack + assertArrayEquals( new String[0], i_undoManager.getAllRedoActionTitles() ); + assertTrue( m_undoListener.wasRedoStackCleared() ); + + + // part II: empty contexts + i_undoManager.reset(); + m_undoListener.reset(); + + // enter a context, leave it immediately without adding an action to it + i_undoManager.enterUndoContext( "Undo Context" ); + i_undoManager.leaveUndoContext(); + assertFalse( m_undoListener.wasContextLeft() ); + assertFalse( m_undoListener.wasHiddenContextLeft() ); + assertTrue( m_undoListener.hasContextBeenCancelled() ); + assertFalse( "leaving an empty context should silently remove it, and not contribute to the stack", + i_undoManager.isUndoPossible() ); + } + + + private void impl_testNestedContexts( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + i_undoManager.enterUndoContext( "context 1" ); + i_undoManager.enterUndoContext( "context 1.1" ); + final CustomUndoAction action1 = new CustomUndoAction( "action 1.1.1" ); + i_undoManager.addUndoAction( action1 ); + i_undoManager.enterUndoContext( "context 1.1.2" ); + final CustomUndoAction action2 = new CustomUndoAction( "action 1.1.2.1" ); + i_undoManager.addUndoAction( action2 ); + i_undoManager.leaveUndoContext(); + final CustomUndoAction action3 = new CustomUndoAction( "action 1.1.3" ); + i_undoManager.addUndoAction( action3 ); + i_undoManager.leaveUndoContext(); + i_undoManager.leaveUndoContext(); + final CustomUndoAction action4 = new CustomUndoAction( "action 1.2" ); + i_undoManager.addUndoAction( action4 ); + + i_undoManager.undo(); + assertEquals( "undoing a single action notifies a wrong title", action4.getTitle(), m_undoListener.getMostRecentlyUndoneTitle() ); + assertTrue( "custom Undo not called", action4.undoCalled() ); + assertFalse( "too many custom Undos called", action1.undoCalled() || action2.undoCalled() || action3.undoCalled() ); + i_undoManager.undo(); + assertTrue( "nested actions not properly undone", action1.undoCalled() && action2.undoCalled() && action3.undoCalled() ); + } + + + private void impl_testErrorHandling( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + + // try retrieving the comments for the current Undo/Redo - this should fail + boolean caughtExpected = false; + try { i_undoManager.getCurrentUndoActionTitle(); } + catch( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "trying the title of the current Undo action is expected to fail for an empty stack", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.getCurrentRedoActionTitle(); } + catch( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "trying the title of the current Redo action is expected to fail for an empty stack", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.undo(); } catch ( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "undo should throw if no Undo action is on the stack", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.redo(); } catch ( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "redo should throw if no Redo action is on the stack", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.leaveUndoContext(); } catch ( final InvalidStateException e ) { caughtExpected = true; } + assertTrue( "leaveUndoContext should throw if no context is currently open", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.addUndoAction( null ); } catch ( com.sun.star.lang.IllegalArgumentException e ) { caughtExpected = true; } + assertTrue( "adding a NULL action should be rejected", caughtExpected ); + + i_undoManager.reset(); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.undo(); + i_undoManager.enterUndoContext( "Undo Context" ); + // those methods should fail when a context is open: + final String[] methodNames = new String[] { "undo", "redo", "clear", "clearRedo" }; + for ( int i=0; i