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_multi_line_text_view.h"
28 #include "gx_window.h"
29 #include "gx_system.h"
30 #include "gx_utility.h"
31 
32 /**************************************************************************/
33 /*                                                                        */
34 /*  FUNCTION                                               RELEASE        */
35 /*                                                                        */
36 /*    _gx_multi_line_text_view_event_process              PORTABLE C      */
37 /*                                                           6.1          */
38 /*  AUTHOR                                                                */
39 /*                                                                        */
40 /*    Kenneth Maxwell, Microsoft Corporation                              */
41 /*                                                                        */
42 /*  DESCRIPTION                                                           */
43 /*                                                                        */
44 /*    This service processes an event for a multi-line text view widget.  */
45 /*                                                                        */
46 /*  INPUT                                                                 */
47 /*                                                                        */
48 /*    text_view                             Multi-line text view widget   */
49 /*                                            control block               */
50 /*    event_ptr                             Point to event to process     */
51 /*                                                                        */
52 /*  OUTPUT                                                                */
53 /*                                                                        */
54 /*    status                                Completion status             */
55 /*                                                                        */
56 /*  CALLS                                                                 */
57 /*                                                                        */
58 /*    _gx_multi_line_text_view_text_id_set  Set new text id               */
59 /*    _gx_multi_line_text_view_scroll       Scroll the text view window   */
60 /*    _gx_window_event_process              Window event process          */
61 /*                                                                        */
62 /*  CALLED BY                                                             */
63 /*                                                                        */
64 /*    Application Code                                                    */
65 /*                                                                        */
66 /*  RELEASE HISTORY                                                       */
67 /*                                                                        */
68 /*    DATE              NAME                      DESCRIPTION             */
69 /*                                                                        */
70 /*  05-19-2020     Kenneth Maxwell          Initial Version 6.0           */
71 /*  09-30-2020     Kenneth Maxwell          Modified comment(s),          */
72 /*                                            added delete event handle,  */
73 /*                                            added logic to handle new   */
74 /*                                            events,                     */
75 /*                                            resulting in version 6.1    */
76 /*                                                                        */
77 /**************************************************************************/
78 
_gx_multi_line_text_view_event_process(GX_MULTI_LINE_TEXT_VIEW * text_view,GX_EVENT * event_ptr)79 UINT _gx_multi_line_text_view_event_process(GX_MULTI_LINE_TEXT_VIEW *text_view, GX_EVENT *event_ptr)
80 {
81     switch (event_ptr -> gx_event_type)
82     {
83     case GX_EVENT_SHOW:
84         _gx_window_event_process((GX_WINDOW *)text_view, event_ptr);
85 
86         /* If the text view text ID is specified.*/
87         if (text_view -> gx_multi_line_text_view_text_id)
88         {
89             _gx_multi_line_text_view_text_id_set(text_view, text_view -> gx_multi_line_text_view_text_id);
90         }
91 
92         /* Get visible rows. */
93         _gx_multi_line_text_view_visible_rows_compute(text_view);
94         break;
95 
96     case GX_EVENT_RESIZED:
97         if (text_view -> gx_widget_status & GX_STATUS_VISIBLE)
98         {
99             text_view -> gx_multi_line_text_view_line_index_old = GX_TRUE;
100 
101 #if defined(GX_DYNAMIC_BIDI_TEXT_SUPPORT)
102             if (text_view -> gx_multi_line_text_view_bidi_resolved_text_info)
103             {
104                 /* Widget size changed, clear reorderd bidi text so that it will be recreated when needed. */
105                 _gx_utility_bidi_resolved_text_info_delete(&text_view -> gx_multi_line_text_view_bidi_resolved_text_info);
106             }
107 #endif
108         }
109         break;
110 
111     case GX_EVENT_CLIENT_UPDATED:
112         if (text_view -> gx_widget_status & GX_STATUS_VISIBLE)
113         {
114             text_view -> gx_multi_line_text_view_line_index_old = GX_TRUE;
115             _gx_system_dirty_mark((GX_WIDGET *)text_view);
116         }
117         break;
118 
119     case GX_EVENT_STYLE_CHANGED:
120         if (text_view -> gx_widget_status & GX_STATUS_VISIBLE)
121         {
122             if ((event_ptr -> gx_event_payload.gx_event_ulongdata & GX_STYLE_BORDER_MASK) !=
123                 (text_view -> gx_widget_style & GX_STYLE_BORDER_MASK))
124             {
125                 text_view -> gx_multi_line_text_view_line_index_old = GX_TRUE;
126             }
127         }
128         break;
129 
130     case GX_EVENT_LANGUAGE_CHANGE:
131         if (text_view -> gx_multi_line_text_view_text_id)
132         {
133             _gx_multi_line_text_view_text_id_set(text_view, text_view -> gx_multi_line_text_view_text_id);
134         }
135         break;
136 
137 #if defined(GX_DYNAMIC_BIDI_TEXT_SUPPORT)
138     case GX_EVENT_DYNAMIC_BIDI_TEXT_ENABLE:
139     case GX_EVENT_DYNAMIC_BIDI_TEXT_DISABLE:
140         text_view -> gx_multi_line_text_view_line_index_old = GX_TRUE;
141         break;
142 #endif
143 
144     case GX_EVENT_DELETE:
145         if ((text_view -> gx_widget_style & GX_STYLE_TEXT_COPY) &&
146             text_view -> gx_multi_line_text_view_text.gx_string_ptr &&
147             text_view -> gx_multi_line_text_view_text_id == 0)
148         {
149             if (!_gx_system_memory_free)
150             {
151                 return GX_SYSTEM_MEMORY_ERROR;
152             }
153             _gx_system_memory_free((void *)text_view -> gx_multi_line_text_view_text.gx_string_ptr);
154             text_view -> gx_multi_line_text_view_text.gx_string_ptr = GX_NULL;
155             text_view -> gx_multi_line_text_view_text.gx_string_length = 0;
156         }
157 
158 #if defined(GX_DYNAMIC_BIDI_TEXT_SUPPORT)
159         if (text_view -> gx_multi_line_text_view_bidi_resolved_text_info)
160         {
161             _gx_utility_bidi_resolved_text_info_delete(&text_view -> gx_multi_line_text_view_bidi_resolved_text_info);
162         }
163 #endif
164          break;
165 
166     case GX_EVENT_VERTICAL_SCROLL:
167         _gx_multi_line_text_view_scroll(text_view, (GX_VALUE)(event_ptr -> gx_event_payload.gx_event_intdata[1] - event_ptr -> gx_event_payload.gx_event_intdata[0]));
168         return 0;
169     }
170 
171     return(_gx_window_event_process((GX_WINDOW *)text_view, event_ptr));
172 }
173 
174