1 /***************************************************************************
2 * Copyright (c) 2024 Microsoft Corporation
3 *
4 * This program and the accompanying materials are made available under the
5 * terms of the MIT License which is available at
6 * https://opensource.org/licenses/MIT.
7 *
8 * SPDX-License-Identifier: MIT
9 **************************************************************************/
10
11
12 /**************************************************************************/
13 /**************************************************************************/
14 /** */
15 /** GUIX Component */
16 /** */
17 /** Multi Line Text View Management (Multi Line Text View) */
18 /** */
19 /**************************************************************************/
20
21 #define GX_SOURCE_CODE
22
23
24 /* Include necessary system files. */
25
26 #include "gx_api.h"
27 #include "gx_system.h"
28 #include "gx_multi_line_text_view.h"
29 #include "gx_window.h"
30 #include "gx_widget.h"
31 #include "gx_utility.h"
32 #include "gx_scrollbar.h"
33
34
35 /**************************************************************************/
36 /* */
37 /* FUNCTION RELEASE */
38 /* */
39 /* _gx_multi_line_text_view_scroll PORTABLE C */
40 /* 6.1 */
41 /* AUTHOR */
42 /* */
43 /* Kenneth Maxwell, Microsoft Corporation */
44 /* */
45 /* DESCRIPTION */
46 /* */
47 /* This function performs the scroll action */
48 /* */
49 /* INPUT */
50 /* */
51 /* view Multi-line text view widget */
52 /* control block */
53 /* amount_to_scroll Shifting value */
54 /* */
55 /* OUTPUT */
56 /* */
57 /* status Completion status */
58 /* */
59 /* CALLS */
60 /* */
61 /* _gx_window_scrollbar_find Find scrollbar for a window */
62 /* _gx_scrollbar_reset Reset scrollbar information */
63 /* _gx_utility_rectangle_resize Offset rectangle by specified */
64 /* value */
65 /* _gx_multi_line_text_view_line_cache_update */
66 /* Update line cache */
67 /* _gx_widget_block_move Move a block of pixels */
68 /* */
69 /* CALLED BY */
70 /* */
71 /* _gx_multi_line_text_view_event_process */
72 /* Multi line text view */
73 /* event process routine */
74 /* */
75 /* RELEASE HISTORY */
76 /* */
77 /* DATE NAME DESCRIPTION */
78 /* */
79 /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */
80 /* 09-30-2020 Kenneth Maxwell Modified comment(s), */
81 /* resulting in version 6.1 */
82 /* */
83 /**************************************************************************/
_gx_multi_line_text_view_scroll(GX_MULTI_LINE_TEXT_VIEW * view,GX_VALUE amount_to_scroll)84 UINT _gx_multi_line_text_view_scroll(GX_MULTI_LINE_TEXT_VIEW *view, GX_VALUE amount_to_scroll)
85 {
86 GX_RECTANGLE block;
87 GX_SCROLLBAR *scroll;
88
89 if (!amount_to_scroll)
90 {
91 return GX_SUCCESS;
92 }
93
94 /* Calculate the shift value. */
95 view -> gx_multi_line_text_view_text_scroll_shift += amount_to_scroll;
96
97 _gx_window_scrollbar_find((GX_WINDOW *)view, GX_TYPE_VERTICAL_SCROLL, &scroll);
98
99 if (scroll)
100 {
101 _gx_scrollbar_reset((GX_SCROLLBAR *)scroll, GX_NULL);
102 }
103 else
104 {
105 if (view -> gx_multi_line_text_view_text_total_rows >
106 view -> gx_multi_line_text_view_cache_size)
107 {
108 /* Update line index. */
109 _gx_multi_line_text_view_line_cache_update(view);
110 }
111 }
112
113 block = view -> gx_window_client;
114
115 /* Offset client area by the size of whitespace. */
116 _gx_utility_rectangle_resize(&block, (GX_VALUE)(-view -> gx_multi_line_text_view_whitespace));
117
118 block.gx_rectangle_left = (GX_VALUE)(block.gx_rectangle_left + 1);
119
120 /* If the text view has a thin (rounded) border with no
121 whitespace between border and text, we cannot use block
122 move to scroll because we will capture pixels from the
123 rounded corner. In that case just use dirty_mark, otherwise
124 use block_move
125 */
126 if ((view -> gx_widget_style & GX_STYLE_BORDER_THIN) &&
127 !(view -> gx_widget_style & GX_STYLE_TRANSPARENT) &&
128 (view -> gx_multi_line_text_view_whitespace == 0))
129 {
130 _gx_system_dirty_mark((GX_WIDGET *)view);
131 }
132 else
133 {
134 _gx_widget_block_move((GX_WIDGET *)view, &block, 0, amount_to_scroll);
135 }
136
137 return(GX_SUCCESS);
138 }
139
140