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