1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SEARCH_SEARCH_NODE_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SEARCH_SEARCH_NODE_H
18 
19 #include <optional>
20 
21 #include "core/components_ng/base/group_node.h"
22 
23 namespace OHOS::Ace::NG {
24 class IconOptions {
25 public:
IconOptions(CalcDimension size)26     IconOptions(CalcDimension size) : size_(size)
27     {}
28 
IconOptions(Color color,CalcDimension size)29     IconOptions(Color color, CalcDimension size) : color_(color), size_(size)
30     {}
31 
32     IconOptions(std::string src, std::string bundleName = "", std::string moduleName = "")
33         : src_(src), bundleName_(bundleName), moduleName_(moduleName)
34     {}
35 
IconOptions(CalcDimension size,std::string src,std::string bundleName,std::string moduleName)36     IconOptions(CalcDimension size, std::string src, std::string bundleName, std::string moduleName)
37         : size_(size), src_(src), bundleName_(bundleName), moduleName_(moduleName)
38     {}
39 
IconOptions(Color color,CalcDimension size,std::string src,std::string bundleName,std::string moduleName)40     IconOptions(Color color, CalcDimension size, std::string src, std::string bundleName, std::string moduleName)
41         : color_(color), size_(size), src_(src), bundleName_(bundleName), moduleName_(moduleName)
42     {}
43 
44     IconOptions() = default;
45     ~IconOptions() = default;
46 
GetColor()47     std::optional<Color>& GetColor()
48     {
49         return color_;
50     }
51 
GetSize()52     std::optional<Dimension>& GetSize()
53     {
54         return size_;
55     }
56 
GetSrc()57     std::optional<std::string>& GetSrc()
58     {
59         return src_;
60     }
61 
GetBundleName()62     std::optional<std::string>& GetBundleName()
63     {
64         return bundleName_;
65     }
66 
GetModuleName()67     std::optional<std::string>& GetModuleName()
68     {
69         return moduleName_;
70     }
71 
UpdateSrc(std::string src,std::string bundleName,std::string moduleName)72     void UpdateSrc(std::string src, std::string bundleName, std::string moduleName)
73     {
74         src_ = src;
75         moduleName_ = moduleName;
76         bundleName_ = bundleName;
77     }
78 
UpdateSize(Dimension size)79     void UpdateSize(Dimension size)
80     {
81         size_ = size;
82     }
83 
UpdateColor(Color color)84     void UpdateColor(Color color)
85     {
86         color_ = color;
87     }
88 
89     bool operator==(const IconOptions& info) const
90     {
91         return color_ == info.color_ && size_ == info.size_ && src_ == info.src_ && bundleName_ == info.bundleName_ &&
92                moduleName_ == info.moduleName_;
93     }
94 
95     bool operator!=(const IconOptions& info) const
96     {
97         return !(operator==(info));
98     }
99 
ToString()100     std::string ToString() const
101     {
102         auto json = JsonUtil::Create(true);
103         if (src_.has_value()) {
104             json->Put("src", src_.value().c_str());
105         }
106         if (bundleName_.has_value()) {
107             json->Put("bundleName", bundleName_.value().c_str());
108         }
109         if (moduleName_.has_value()) {
110             json->Put("moduleName", moduleName_.value().c_str());
111         }
112         if (size_.has_value()) {
113             json->Put("size", size_.value().ToString().c_str());
114         }
115         if (color_.has_value()) {
116             json->Put("color", color_.value().ToString().c_str());
117         }
118         return json->ToString();
119     }
120 
121 private:
122     std::optional<Color> color_;
123     std::optional<Dimension> size_;
124     std::optional<std::string> src_;
125     std::optional<std::string> bundleName_;
126     std::optional<std::string> moduleName_;
127 };
128 
129 class ACE_EXPORT SearchNode : public GroupNode {
130     DECLARE_ACE_TYPE(SearchNode, GroupNode);
131 
132 public:
133     SearchNode(const std::string& tag, int32_t nodeId, const RefPtr<Pattern>& pattern, bool isRoot = false)
134         : GroupNode(tag, nodeId, pattern, isRoot)
135     {}
136     ~SearchNode() override = default;
137 
138     void AddChildToGroup(const RefPtr<UINode>& child, int32_t slot = DEFAULT_NODE_SLOT) override;
HasTextFieldNode()139     bool HasTextFieldNode() const
140     {
141         return textFieldId_.has_value();
142     }
143 
HasSearchIconNodeCreated()144     bool HasSearchIconNodeCreated() const
145     {
146         return searchIconNodeCreated_;
147     }
148 
HasButtonNode()149     bool HasButtonNode() const
150     {
151         return buttonId_.has_value();
152     }
153 
HasDividerNode()154     bool HasDividerNode() const
155     {
156         return dividerId_.has_value();
157     }
158 
HasCancelIconNodeCreated()159     bool HasCancelIconNodeCreated() const
160     {
161         return cancelIconNodeCreated_;
162     }
163 
HasCancelButtonNode()164     bool HasCancelButtonNode() const
165     {
166         return cancelButtonId_.has_value();
167     }
168 
GetTextFieldId()169     int32_t GetTextFieldId()
170     {
171         if (!textFieldId_.has_value()) {
172             textFieldId_ = ElementRegister::GetInstance()->MakeUniqueId();
173         }
174         return textFieldId_.value();
175     }
176 
GetButtonId()177     int32_t GetButtonId()
178     {
179         if (!buttonId_.has_value()) {
180             buttonId_ = ElementRegister::GetInstance()->MakeUniqueId();
181         }
182         return buttonId_.value();
183     }
184 
GetCancelButtonId()185     int32_t GetCancelButtonId()
186     {
187         if (!cancelButtonId_.has_value()) {
188             cancelButtonId_ = ElementRegister::GetInstance()->MakeUniqueId();
189         }
190         return cancelButtonId_.value();
191     }
192 
GetDividerId()193     int32_t GetDividerId()
194     {
195         if (!dividerId_.has_value()) {
196             dividerId_ = ElementRegister::GetInstance()->MakeUniqueId();
197         }
198         return dividerId_.value();
199     }
200 
GetSearchImageIconSize()201     Dimension& GetSearchImageIconSize()
202     {
203         return searchImageIconOptions_.GetSize().value();
204     }
205 
GetCancelImageIconSize()206     Dimension& GetCancelImageIconSize()
207     {
208         return cancelImageIconOptions_.GetSize().value();
209     }
210 
GetSearchSymbolIconSize()211     const Dimension& GetSearchSymbolIconSize() const
212     {
213         return searchSymbolIconSize_;
214     }
215 
GetCancelSymbolIconSize()216     const Dimension& GetCancelSymbolIconSize() const
217     {
218         return cancelSymbolIconSize_;
219     }
220 
GetSearchSymbolIconColor()221     const Color& GetSearchSymbolIconColor() const
222     {
223         return searchSymbolIconColor_;
224     }
225 
GetCancelSymbolIconColor()226     const Color& GetCancelSymbolIconColor() const
227     {
228         return cancelSymbolIconColor_;
229     }
230 
GetSearchImageIconColor()231     Color& GetSearchImageIconColor()
232     {
233         return searchImageIconOptions_.GetColor().value();
234     }
235 
GetCancelImageIconColor()236     Color& GetCancelImageIconColor()
237     {
238         return cancelImageIconOptions_.GetColor().value();
239     }
240 
GetSearchImageIconOptions()241     IconOptions& GetSearchImageIconOptions()
242     {
243         return searchImageIconOptions_;
244     }
245 
GetCancelImageIconOptions()246     IconOptions& GetCancelImageIconOptions()
247     {
248         return cancelImageIconOptions_;
249     }
250 
SetSearchImageIconSize(Dimension searchIconSize)251     void SetSearchImageIconSize(Dimension searchIconSize)
252     {
253         searchImageIconOptions_.UpdateSize(searchIconSize);
254     }
255 
SetCancelImageIconSize(Dimension cancelIconSize)256     void SetCancelImageIconSize(Dimension cancelIconSize)
257     {
258         cancelImageIconOptions_.UpdateSize(cancelIconSize);
259     }
260 
SetSearchSymbolIconSize(Dimension searchIconSize)261     void SetSearchSymbolIconSize(Dimension searchIconSize)
262     {
263         searchSymbolIconSize_ = searchIconSize;
264     }
265 
SetCancelSymbolIconSize(Dimension cancelIconSize)266     void SetCancelSymbolIconSize(Dimension cancelIconSize)
267     {
268         cancelSymbolIconSize_ = cancelIconSize;
269     }
270 
SetSearchSymbolIconColor(Color searchIconColor)271     void SetSearchSymbolIconColor(Color searchIconColor)
272     {
273         searchSymbolIconColor_ = searchIconColor;
274     }
275 
SetCancelSymbolIconColor(Color cancelIconColor)276     void SetCancelSymbolIconColor(Color cancelIconColor)
277     {
278         cancelSymbolIconColor_ = cancelIconColor;
279     }
280 
SetSearchImageIconColor(Color searchIconColor)281     void SetSearchImageIconColor(Color searchIconColor)
282     {
283         searchImageIconOptions_.UpdateColor(searchIconColor);
284     }
285 
SetCancelImageIconColor(Color cancelIconColor)286     void SetCancelImageIconColor(Color cancelIconColor)
287     {
288         cancelImageIconOptions_.UpdateColor(cancelIconColor);
289     }
290 
SetSearchImageIconOptions(IconOptions options)291     void SetSearchImageIconOptions(IconOptions options)
292     {
293         searchImageIconOptions_ = options;
294     }
295 
SetCancelImageIconOptions(IconOptions options)296     void SetCancelImageIconOptions(IconOptions options)
297     {
298         cancelImageIconOptions_ = options;
299     }
300 
UpdateHasSearchIconNodeCreated(bool hasNodeCreated)301     void UpdateHasSearchIconNodeCreated(bool hasNodeCreated)
302     {
303         searchIconNodeCreated_ = hasNodeCreated;
304     }
305 
UpdateHasCancelIconNodeCreated(bool hasNodeCreated)306     void UpdateHasCancelIconNodeCreated(bool hasNodeCreated)
307     {
308         cancelIconNodeCreated_ = hasNodeCreated;
309     }
310 
311 private:
312     std::optional<int32_t> textFieldId_;
313     std::optional<int32_t> buttonId_;
314     std::optional<int32_t> cancelButtonId_;
315     std::optional<int32_t> dividerId_;
316 
317     std::set<int32_t> searchChildren_;
318 
319     Dimension searchSymbolIconSize_ = 16.0_fp;
320     Color searchSymbolIconColor_;
321     Dimension cancelSymbolIconSize_ = 16.0_fp;
322     Color cancelSymbolIconColor_;
323     bool searchIconNodeCreated_ = false;
324     bool cancelIconNodeCreated_ = false;
325 
326     IconOptions searchImageIconOptions_ = IconOptions(16.0_vp);
327     IconOptions cancelImageIconOptions_ = IconOptions(16.0_vp);
328 };
329 
330 } // namespace OHOS::Ace::NG
331 
332 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SEARCH_SEARCH_NODE_H