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