1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <emojicontrol.hxx>
21 #include <emojipopup.hxx>
22 #include <emojiview.hxx>
23 #include <sfx2/thumbnailviewitem.hxx>
24 #include <rtl/ustrbuf.hxx>
25 #include <comphelper/propertysequence.hxx>
26 #include <comphelper/dispatchcommand.hxx>
27 #include <officecfg/Office/Common.hxx>
29 constexpr OStringLiteral FILTER_PEOPLE
= "people";
30 constexpr OStringLiteral FILTER_NATURE
= "nature";
31 constexpr OStringLiteral FILTER_FOOD
= "food";
32 constexpr OStringLiteral FILTER_ACTIVITY
= "activity";
33 constexpr OStringLiteral FILTER_TRAVEL
= "travel";
34 constexpr OStringLiteral FILTER_OBJECTS
= "objects";
35 constexpr OStringLiteral FILTER_SYMBOLS
= "symbols";
36 constexpr OStringLiteral FILTER_FLAGS
= "flags";
37 constexpr OStringLiteral FILTER_UNICODE9
= "unicode9";
39 using namespace com::sun::star
;
41 SfxEmojiControl::SfxEmojiControl(const EmojiPopup
* pControl
, weld::Widget
* pParent
)
42 : WeldToolbarPopup(pControl
->getFrameInterface(), pParent
, "sfx/ui/emojicontrol.ui", "emojictrl")
43 , mxPeopleBtn(m_xBuilder
->weld_toggle_button(FILTER_PEOPLE
))
44 , mxNatureBtn(m_xBuilder
->weld_toggle_button(FILTER_NATURE
))
45 , mxFoodBtn(m_xBuilder
->weld_toggle_button(FILTER_FOOD
))
46 , mxActivityBtn(m_xBuilder
->weld_toggle_button(FILTER_ACTIVITY
))
47 , mxTravelBtn(m_xBuilder
->weld_toggle_button(FILTER_TRAVEL
))
48 , mxObjectsBtn(m_xBuilder
->weld_toggle_button(FILTER_OBJECTS
))
49 , mxSymbolsBtn(m_xBuilder
->weld_toggle_button(FILTER_SYMBOLS
))
50 , mxFlagsBtn(m_xBuilder
->weld_toggle_button(FILTER_FLAGS
))
51 , mxUnicode9Btn(m_xBuilder
->weld_toggle_button(FILTER_UNICODE9
))
52 , mxEmojiView(new EmojiView(m_xBuilder
->weld_scrolled_window("emoji_win", true)))
53 , mxEmojiWeld(new weld::CustomWeld(*m_xBuilder
, "emoji_view", *mxEmojiView
))
55 ConvertLabelToUnicode(*mxPeopleBtn
);
56 ConvertLabelToUnicode(*mxNatureBtn
);
57 ConvertLabelToUnicode(*mxFoodBtn
);
58 ConvertLabelToUnicode(*mxActivityBtn
);
59 ConvertLabelToUnicode(*mxTravelBtn
);
60 ConvertLabelToUnicode(*mxObjectsBtn
);
61 ConvertLabelToUnicode(*mxSymbolsBtn
);
62 ConvertLabelToUnicode(*mxFlagsBtn
);
63 ConvertLabelToUnicode(*mxUnicode9Btn
);
65 mxPeopleBtn
->connect_toggled(LINK(this, SfxEmojiControl
, ActivatePageHdl
));
66 mxNatureBtn
->connect_toggled(LINK(this, SfxEmojiControl
, ActivatePageHdl
));
67 mxFoodBtn
->connect_toggled(LINK(this, SfxEmojiControl
, ActivatePageHdl
));
68 mxActivityBtn
->connect_toggled(LINK(this, SfxEmojiControl
, ActivatePageHdl
));
69 mxTravelBtn
->connect_toggled(LINK(this, SfxEmojiControl
, ActivatePageHdl
));
70 mxObjectsBtn
->connect_toggled(LINK(this, SfxEmojiControl
, ActivatePageHdl
));
71 mxSymbolsBtn
->connect_toggled(LINK(this, SfxEmojiControl
, ActivatePageHdl
));
72 mxFlagsBtn
->connect_toggled(LINK(this, SfxEmojiControl
, ActivatePageHdl
));
73 mxUnicode9Btn
->connect_toggled(LINK(this, SfxEmojiControl
, ActivatePageHdl
));
75 mxEmojiView
->setItemMaxTextLength(ITEM_MAX_TEXT_LENGTH
);
76 mxEmojiView
->setItemDimensions(ITEM_MAX_WIDTH
, 0, ITEM_MAX_HEIGHT
, ITEM_PADDING
);
78 mxEmojiView
->Populate();
79 ActivatePageHdl(*mxPeopleBtn
);
81 mxEmojiView
->setInsertEmojiHdl(LINK(this, SfxEmojiControl
, InsertHdl
));
82 mxEmojiView
->ShowTooltips(true);
85 void SfxEmojiControl::GrabFocus()
87 mxEmojiView
->GrabFocus();
90 SfxEmojiControl::~SfxEmojiControl()
94 void SfxEmojiControl::ConvertLabelToUnicode(weld::ToggleButton
& rBtn
)
96 OUStringBuffer sHexText
;
97 OUString sLabel
= rBtn
.get_label();
98 sHexText
.appendUtf32(sLabel
.toUInt32(16));
99 rBtn
.set_label(sHexText
.toString());
102 FILTER_CATEGORY
SfxEmojiControl::getFilter(const weld::Toggleable
& rCurPageId
) const
104 if (&rCurPageId
== mxPeopleBtn
.get())
105 return FILTER_CATEGORY::PEOPLE
;
106 else if (&rCurPageId
== mxNatureBtn
.get())
107 return FILTER_CATEGORY::NATURE
;
108 else if (&rCurPageId
== mxFoodBtn
.get())
109 return FILTER_CATEGORY::FOOD
;
110 else if (&rCurPageId
== mxActivityBtn
.get())
111 return FILTER_CATEGORY::ACTIVITY
;
112 else if (&rCurPageId
== mxTravelBtn
.get())
113 return FILTER_CATEGORY::TRAVEL
;
114 else if (&rCurPageId
== mxObjectsBtn
.get())
115 return FILTER_CATEGORY::OBJECTS
;
116 else if (&rCurPageId
== mxSymbolsBtn
.get())
117 return FILTER_CATEGORY::SYMBOLS
;
118 else if (&rCurPageId
== mxFlagsBtn
.get())
119 return FILTER_CATEGORY::FLAGS
;
120 else if (&rCurPageId
== mxUnicode9Btn
.get())
121 return FILTER_CATEGORY::UNICODE9
;
123 return FILTER_CATEGORY::PEOPLE
;
126 IMPL_LINK(SfxEmojiControl
, ActivatePageHdl
, weld::Toggleable
&, rButton
, void)
128 mxPeopleBtn
->set_active(&rButton
== mxPeopleBtn
.get());
129 mxNatureBtn
->set_active(&rButton
== mxNatureBtn
.get());
130 mxFoodBtn
->set_active(&rButton
== mxFoodBtn
.get());
131 mxActivityBtn
->set_active(&rButton
== mxActivityBtn
.get());
132 mxTravelBtn
->set_active(&rButton
== mxTravelBtn
.get());
133 mxObjectsBtn
->set_active(&rButton
== mxObjectsBtn
.get());
134 mxSymbolsBtn
->set_active(&rButton
== mxSymbolsBtn
.get());
135 mxFlagsBtn
->set_active(&rButton
== mxFlagsBtn
.get());
136 mxUnicode9Btn
->set_active(&rButton
== mxUnicode9Btn
.get());
138 mxEmojiView
->filterItems(ViewFilter_Category(getFilter(rButton
)));
141 IMPL_STATIC_LINK(SfxEmojiControl
, InsertHdl
, ThumbnailViewItem
*, pItem
, void)
143 const OUString
& sHexText
= pItem
->getTitle();
144 sal_uInt32 cEmojiChar
= sHexText
.toUInt32(16);
146 uno::Reference
< uno::XComponentContext
> xContext( comphelper::getProcessComponentContext() );
147 OUString
sFontName(officecfg::Office::Common::Misc::EmojiFont::get(xContext
));
149 uno::Sequence
<beans::PropertyValue
> aArgs( comphelper::InitPropertySequence({
150 { "Symbols", uno::Any(OUString(&cEmojiChar
, 1)) },
151 // add font settings here
152 { "FontName", uno::Any(sFontName
) }
155 comphelper::dispatchCommand(".uno:InsertSymbol", aArgs
);
158 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */