1 /*
2 * Copyright (c) 2023 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 #include "core/interfaces/native/node/hyperlink_modifier.h"
17 #include "core/components/hyperlink/hyperlink_theme.h"
18 #include "core/components_ng/base/frame_node.h"
19 #include "core/components_ng/pattern/hyperlink/hyperlink_model_ng.h"
20 #include "core/pipeline_ng/pipeline_context.h"
21 #include "core/components/theme/theme_manager.h"
22
23 namespace OHOS::Ace::NG {
24 namespace {
25 constexpr int NUM_0 = 0;
26 constexpr int NUM_1 = 1;
27 constexpr int NUM_2 = 2;
28 constexpr int NUM_3 = 3;
29 constexpr int NUM_4 = 4;
30 } // namespace
SetHyperlinkColor(ArkUINodeHandle node,uint32_t color)31 void SetHyperlinkColor(ArkUINodeHandle node, uint32_t color)
32 {
33 auto* frameNode = reinterpret_cast<FrameNode*>(node);
34 CHECK_NULL_VOID(frameNode);
35 HyperlinkModelNG::SetColor(frameNode, Color(color));
36 }
37
ResetHyperlinkColor(ArkUINodeHandle node)38 void ResetHyperlinkColor(ArkUINodeHandle node)
39 {
40 auto* frameNode = reinterpret_cast<FrameNode*>(node);
41 CHECK_NULL_VOID(frameNode);
42 auto context = frameNode->GetContext();
43 CHECK_NULL_VOID(context);
44 auto themeManager = context->GetThemeManager();
45 CHECK_NULL_VOID(themeManager);
46 auto hyperlinkTheme = themeManager->GetTheme<HyperlinkTheme>();
47 CHECK_NULL_VOID(hyperlinkTheme);
48
49 HyperlinkModelNG::SetColor(frameNode, Color(hyperlinkTheme->GetTextColor()));
50 }
51
SetHyperlinkDraggable(ArkUINodeHandle node,ArkUI_Bool draggable)52 void SetHyperlinkDraggable(ArkUINodeHandle node, ArkUI_Bool draggable)
53 {
54 auto* frameNode = reinterpret_cast<FrameNode*>(node);
55 CHECK_NULL_VOID(frameNode);
56 HyperlinkModelNG::SetDraggable(frameNode, draggable);
57 }
58
ResetHyperlinkDraggable(ArkUINodeHandle node)59 void ResetHyperlinkDraggable(ArkUINodeHandle node)
60 {
61 auto* frameNode = reinterpret_cast<FrameNode*>(node);
62 CHECK_NULL_VOID(frameNode);
63 HyperlinkModelNG::SetDraggable(frameNode, false);
64 }
65
SetHyperlinkResponseRegion(ArkUINodeHandle node,const ArkUI_Float32 * values,const ArkUI_Int32 * units,ArkUI_Int32 length)66 void SetHyperlinkResponseRegion(
67 ArkUINodeHandle node, const ArkUI_Float32* values, const ArkUI_Int32* units, ArkUI_Int32 length)
68 {
69 auto* frameNode = reinterpret_cast<FrameNode*>(node);
70 CHECK_NULL_VOID(frameNode);
71 std::vector<DimensionRect> region;
72 for (int32_t i = 0; i < length / NUM_4; i++) {
73 CalcDimension xDimen =
74 CalcDimension(values[i * NUM_4 + NUM_0], static_cast<DimensionUnit>(units[i * NUM_4 + NUM_0]));
75 CalcDimension yDimen =
76 CalcDimension(values[i * NUM_4 + NUM_1], static_cast<DimensionUnit>(units[i * NUM_4 + NUM_1]));
77 CalcDimension widthDimen =
78 CalcDimension(values[i * NUM_4 + NUM_2], static_cast<DimensionUnit>(units[i * NUM_4 + NUM_2]));
79 CalcDimension heightDimen =
80 CalcDimension(values[i * NUM_4 + NUM_3], static_cast<DimensionUnit>(units[i * NUM_4 + NUM_3]));
81 DimensionOffset offsetDimen(xDimen, yDimen);
82 DimensionRect dimenRect(widthDimen, heightDimen, offsetDimen);
83 region.emplace_back(dimenRect);
84 }
85 HyperlinkModelNG::SetResponseRegion(frameNode, region, true);
86 }
87
ResetHyperlinkResponseRegion(ArkUINodeHandle node)88 void ResetHyperlinkResponseRegion(ArkUINodeHandle node)
89 {
90 auto *frameNode = reinterpret_cast<FrameNode *>(node);
91 CHECK_NULL_VOID(frameNode);
92 std::vector<DimensionRect> region;
93 CalcDimension xDimen = CalcDimension(0.0, DimensionUnit::VP);
94 CalcDimension yDimen = CalcDimension(0.0, DimensionUnit::VP);
95 CalcDimension widthDimen = CalcDimension(1, DimensionUnit::PERCENT);
96 CalcDimension heightDimen = CalcDimension(1, DimensionUnit::PERCENT);
97 DimensionOffset offsetDimen(xDimen, yDimen);
98 DimensionRect dimenRect(widthDimen, heightDimen, offsetDimen);
99 region.emplace_back(dimenRect);
100 HyperlinkModelNG::SetResponseRegion(frameNode, region, false);
101 }
102
103 namespace NodeModifier {
GetHyperlinkModifier()104 const ArkUIHyperlinkModifier* GetHyperlinkModifier()
105 {
106 static const ArkUIHyperlinkModifier modifier = { SetHyperlinkColor, ResetHyperlinkColor, SetHyperlinkDraggable,
107 ResetHyperlinkDraggable, SetHyperlinkResponseRegion, ResetHyperlinkResponseRegion };
108
109 return &modifier;
110 }
111
GetCJUIHyperlinkModifier()112 const CJUIHyperlinkModifier* GetCJUIHyperlinkModifier()
113 {
114 static const CJUIHyperlinkModifier modifier = { SetHyperlinkColor, ResetHyperlinkColor, SetHyperlinkDraggable,
115 ResetHyperlinkDraggable };
116
117 return &modifier;
118 }
119 } // namespace NodeModifier
120 } // namespace OHOS::Ace::NG