• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 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 FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_JS_VIEW_JS_TEXTPICKER_H
17 #define FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_JS_VIEW_JS_TEXTPICKER_H
18 
19 #include "bridge/declarative_frontend/jsview/js_interactable_view.h"
20 #include "bridge/declarative_frontend/jsview/js_view_abstract.h"
21 #include "core/components/picker/picker_text_component.h"
22 #include "core/components_ng/pattern/picker/picker_type_define.h"
23 #include "core/components_ng/pattern/text_picker/textpicker_event_hub.h"
24 #include "core/common/resource/resource_object.h"
25 
26 namespace OHOS::Ace::Framework {
27 
28 enum class PickerStyle {
29     INLINE = 0,
30     BLOCK,
31     FADE,
32 };
33 
34 struct ParseTextArrayParam {
35     std::vector<NG::RangeContent> result;
36     uint32_t kind = NG::TEXT;
37     uint32_t selected = 0;
38     std::vector<Dimension> columnWidths;
39     std::string value;
40     std::vector<NG::TextCascadePickerOptions> options;
41     std::vector<uint32_t> selecteds;
42     std::vector<std::string> values;
43     JSRef<JSVal> valueChangeEventVal;
44     JSRef<JSVal> selectedChangeEventVal;
45 
46     RefPtr<ResourceObject> resultResObj;
47     RefPtr<ResourceObject> valueResObj;
48     std::vector<RefPtr<ResourceObject>> columnWidthResObjs;
49     std::vector<RefPtr<ResourceObject>> valueArrResObj;
50 };
51 
52 class JSTextPickerParser : public JSViewAbstract {
53 public:
54     static bool ParseIconTextArray(const JSRef<JSObject>& paramObject,  ParseTextArrayParam& param);
55     static bool ParseTextArray(const JSRef<JSObject>& paramObject, ParseTextArrayParam& param);
56     static void ParseTextStyle(const JSRef<JSObject>& paramObj, NG::PickerTextStyle& textStyle, const std::string& pos);
57     static void ParseTextStyleFontSize(const JSRef<JSVal>& fontSize, NG::PickerTextStyle& textStyle);
58     static bool ParseMultiTextArray(const JSRef<JSObject>& paramObj, ParseTextArrayParam& param);
59     static bool ParseCascadeTextArray(const JSRef<JSObject>& paramObj, ParseTextArrayParam& param,
60         NG::TextCascadePickerOptionsAttr& attr);
61     static bool GenerateCascadeOptions(const JSRef<JSArray>& array,
62         std::vector<NG::TextCascadePickerOptions>& options);
63     static bool GenerateCascadeOptionsInternal(const JSRef<JSObject>& jsObj,
64         std::vector<NG::TextCascadePickerOptions>& options);
65     static bool ParseInternalArray(const JSRef<JSArray>& jsRangeValue, std::vector<uint32_t>& selecteds,
66         std::vector<std::string>& values, uint32_t index, bool isHasSelectAttr);
67     static void SetSelectedValues(std::vector<uint32_t>& selectedValues, std::vector<std::string>& values,
68         uint32_t index, bool isHasSelectAttr, std::vector<std::string>& resultStr);
69     static bool ParseMultiTextArrayValue(const JsiRef<JsiValue>& jsValue, ParseTextArrayParam& param);
70     static bool ParseMultiTextArraySelect(const JsiRef<JsiValue>& jsSelectedValue, ParseTextArrayParam& param);
71     static bool ParseMultiColumnWidths(const JsiRef<JsiValue>& jsColumnWidthsValue, ParseTextArrayParam& param);
72     static void ParseMultiTextArraySelectInternal(const std::vector<NG::TextCascadePickerOptions>& options,
73         const std::vector<std::string>& values, std::vector<uint32_t>& selecteds);
74     static bool ParseMultiTextArrayRange(const JSRef<JSArray>& jsRangeValue,
75         std::vector<NG::TextCascadePickerOptions>& options);
76     static bool ParseMultiTextArrayRangeInternal(const JSRef<JSVal>& value,
77         std::vector<NG::TextCascadePickerOptions>& options);
78     static void ParseMultiTextArraySelectArrayInternal(const std::vector<NG::TextCascadePickerOptions>& options,
79         std::vector<uint32_t>& selecteds);
80     static void ParseMultiTextArrayValueInternal(const std::vector<NG::TextCascadePickerOptions>& options,
81         std::vector<std::string>& values);
82     static void ParseMultiTextArrayValueSingleInternal(
83         const std::vector<NG::TextCascadePickerOptions>& options, const std::string& value,
84         std::vector<std::string>& values);
85     static void IsUserDefinedFontFamily(const std::string& pos);
86     static void ParseDefaultTextStyle(const JSRef<JSObject>& paramObj, NG::PickerTextStyle& textStyle);
87     static bool ParseColumnWidths(const JSRef<JSObject>& paramObject, ParseTextArrayParam& param);
88     static void ParsePickerBackgroundStyle(const JSRef<JSObject>& paramObj, NG::PickerBackgroundStyle& bgStyle);
89 };
90 
91 class JSTextPicker : public JSViewAbstract {
92 public:
93     static void Create(const JSCallbackInfo& info);
94     static void JSBind(BindingTarget globalObj);
95 
96     static void SetDefaultPickerItemHeight(const JSCallbackInfo& info);
97     static void SetCanLoop(const JSCallbackInfo& info);
98     static void SetDigitalCrownSensitivity(const JSCallbackInfo& info);
99 
100     static void OnAccept(const JSCallbackInfo& info);
101     static void OnCancel(const JSCallbackInfo& info);
102     static void OnChange(const JSCallbackInfo& info);
103     static void OnScrollStop(const JSCallbackInfo& info);
104     static void OnEnterSelectedArea(const JSCallbackInfo& info);
105     static void SetDisappearTextStyle(const JSCallbackInfo& info);
106     static void SetTextStyle(const JSCallbackInfo& info);
107     static void SetSelectedTextStyle(const JSCallbackInfo& info);
108     static void SetSelectedIndex(const JSCallbackInfo& info);
109     static void PickerBackgroundColor(const JSCallbackInfo& info);
110     static void SetDivider(const JSCallbackInfo& info);
111     static void SetGradientHeight(const JSCallbackInfo& info);
112     static void JsOpacity(const JSCallbackInfo& info);
113 
114     static void SetDisableTextStyleAnimation(const JSCallbackInfo& info);
115     static void SetDefaultTextStyle(const JSCallbackInfo& info);
116     static void SetEnableHapticFeedback(const JSCallbackInfo& info);
117     static void SetSelectedBackgroundStyle(const JSCallbackInfo& info);
118 
119 private:
120     static size_t ProcessCascadeOptionDepth(const NG::TextCascadePickerOptions& option);
121     static void ProcessCascadeSelected(const std::vector<NG::TextCascadePickerOptions>& options,
122         uint32_t index, std::vector<uint32_t>& selecteds);
123     static bool ProcessCascadeOptions(const JSRef<JSObject>& paramObject, ParseTextArrayParam& param,
124         NG::TextCascadePickerOptionsAttr& attr);
125     static void SetSelectedIndexMulti(const JsiRef<JsiValue>& jsSelectedValue);
126     static void SetSelectedIndexMultiInternal(uint32_t count, std::vector<NG::TextCascadePickerOptions>& options,
127         std::vector<uint32_t>& selecteds);
128     static void SetSelectedInternal(uint32_t count, std::vector<NG::TextCascadePickerOptions>& options,
129         std::vector<uint32_t>& selecteds);
130     static void SetSelectedIndexSingle(const JsiRef<JsiValue>& jsSelectedValue);
131     static bool ProcessSingleRangeValue(const JSRef<JSObject>& paramObjec, ParseTextArrayParam& param);
132     static void SetSelectedIndexSingleInternal(const std::vector<NG::TextCascadePickerOptions>& options,
133         uint32_t count, uint32_t& selectedValue, std::vector<uint32_t>& selectedValues);
134     static void CreateSingle(const RefPtr<PickerTheme>& theme, ParseTextArrayParam& param);
135     static void CreateMulti(const RefPtr<PickerTheme>& theme,
136         const NG::TextCascadePickerOptionsAttr& attr, ParseTextArrayParam& param);
137     static bool CheckDividerValue(const Dimension &dimension);
138 };
139 
140 class JSTextPickerDialog {
141 public:
142     static void JSBind(BindingTarget globalObj);
143     static void Show(const JSCallbackInfo& info);
144     static void TextPickerDialogShow(const JSRef<JSObject>& paramObj,
145         const std::map<std::string, NG::DialogTextEvent>& dialogEvent,
146         const std::map<std::string, NG::DialogGestureEvent>& dialogCancelEvent);
147     static std::map<std::string, NG::DialogTextEvent> DialogEvent(const JSCallbackInfo& info);
148     static std::map<std::string, NG::DialogGestureEvent> DialogCancelEvent(const JSCallbackInfo& info);
149 
150 private:
151     static void ParseText(RefPtr<PickerTextComponent>& component, const JSRef<JSObject>& paramObj);
152     static void AddEvent(RefPtr<PickerTextComponent>& picker, const JSCallbackInfo& info);
153     static bool ParseShowData(const JSRef<JSObject>& paramObj, NG::TextPickerSettingData& settingData);
154     static void ParseTextProperties(const JSRef<JSObject>& paramObj, NG::PickerTextProperties& result);
155     static void ParseShowDataMultiContent(const std::vector<NG::TextCascadePickerOptions>& options,
156         const std::vector<uint32_t>& selecteds, const std::vector<std::string>& values,
157         NG::TextCascadePickerOptionsAttr& attr, NG::TextPickerSettingData& settingData);
158     static bool ParseShowDataAttribute(const JSRef<JSObject>& paramObject,
159         NG::TextPickerSettingData& settingData);
160     static bool ParseCanLoop(const JSRef<JSObject>& paramObject, bool& canLoop);
161     static bool ParseShowDataOptions(
162         const JSRef<JSObject>& paramObject, ParseTextArrayParam& param, NG::TextCascadePickerOptionsAttr& attr);
163     static void ParseDisableTextStyleAnimation(const JSRef<JSObject>& paramObject, bool& isDisableTextStyleAnimation);
164     static void ParseEnterSelectedAreaEvent(const JSRef<JSObject>& paramObject, const JSCallbackInfo& info,
165         const WeakPtr<NG::FrameNode>& targetNode, std::map<std::string, NG::DialogTextEvent>& dialogEvent);
166 };
167 } // namespace OHOS::Ace::Framework
168 #endif // FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_JS_VIEW_JS_TEXTPICKER_H
169