GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: gx_tree_view_scroll.c Lines: 27 27 100.0 %
Date: 2024-12-05 08:52:37 Branches: 12 12 100.0 %

Line Branch Exec Source
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
/**   Tree View Management (Tree 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_widget.h"
28
#include "gx_tree_view.h"
29
#include "gx_system.h"
30
#include "gx_window.h"
31
#include "gx_scrollbar.h"
32
33
/**************************************************************************/
34
/*                                                                        */
35
/*  FUNCTION                                               RELEASE        */
36
/*                                                                        */
37
/*    _gx_tree_view_scroll                                PORTABLE C      */
38
/*                                                           6.1          */
39
/*  AUTHOR                                                                */
40
/*                                                                        */
41
/*    Kenneth Maxwell, Microsoft Corporation                              */
42
/*                                                                        */
43
/*  DESCRIPTION                                                           */
44
/*                                                                        */
45
/*    This service scrolls the tree client area by the specified amount.  */
46
/*                                                                        */
47
/*                                                                        */
48
/*  INPUT                                                                 */
49
/*                                                                        */
50
/*    tree                                  Pointer to tree view          */
51
/*    x_scroll                              Amount to scroll on x-axis    */
52
/*    y_scroll                              Amount to scroll on y-axis    */
53
/*                                                                        */
54
/*  OUTPUT                                                                */
55
/*                                                                        */
56
/*    status                                Completion status             */
57
/*                                                                        */
58
/*  CALLS                                                                 */
59
/*                                                                        */
60
/*    _gx_widget_scroll_shift               Change position of a widget   */
61
/*    _gx_widget_block_move                 Move a block of widget area   */
62
/*    _gx_window_scrollbar_find             Find scrollbar for a widget   */
63
/*    _gx_scrollbar_reset                   Reset scrollbar information   */
64
/*    _gx_system_dirty_partial_add          Mark partial area of a widget */
65
/*                                            as dirty                    */
66
/*                                                                        */
67
/*  CALLED BY                                                             */
68
/*                                                                        */
69
/*    GUIX Internal Code                                                  */
70
/*                                                                        */
71
/*  RELEASE HISTORY                                                       */
72
/*                                                                        */
73
/*    DATE              NAME                      DESCRIPTION             */
74
/*                                                                        */
75
/*  05-19-2020     Kenneth Maxwell          Initial Version 6.0           */
76
/*  09-30-2020     Kenneth Maxwell          Modified comment(s),          */
77
/*                                            resulting in version 6.1    */
78
/*                                                                        */
79
/**************************************************************************/
80
14
UINT _gx_tree_view_scroll(GX_TREE_VIEW *tree, GX_VALUE x_scroll, GX_VALUE y_scroll)
81
{
82
GX_RECTANGLE  block;
83
GX_WIDGET    *child;
84
GX_SCROLLBAR *scroll;
85
86
14
    block = tree -> gx_window_client;
87
88
14
    if (!(tree -> gx_widget_style & GX_STYLE_TRANSPARENT) &&
89
12
        (tree -> gx_widget_style & GX_STYLE_BORDER_THIN))
90
    {
91
        /* Widget with think border have a round corner, which have some effects to block move. */
92
9
        block.gx_rectangle_right = (GX_VALUE)(block.gx_rectangle_left + 1);
93
9
        _gx_system_dirty_partial_add((GX_WIDGET *)tree, &block);
94
95
9
        block = tree -> gx_window_client;
96
9
        block.gx_rectangle_bottom = (GX_VALUE)(block.gx_rectangle_top + 1);
97
9
        _gx_system_dirty_partial_add((GX_WIDGET *)tree, &block);
98
99
9
        block = tree -> gx_window_client;
100
9
        block.gx_rectangle_left = (GX_VALUE)(block.gx_rectangle_left + 2);
101
9
        block.gx_rectangle_top = (GX_VALUE)(block.gx_rectangle_top + 2);
102
    }
103
104
    /* Calculate shift values. */
105
14
    tree -> gx_tree_view_x_shift = (GX_VALUE)(tree -> gx_tree_view_x_shift + x_scroll);
106
14
    tree -> gx_tree_view_y_shift = (GX_VALUE)(tree -> gx_tree_view_y_shift + y_scroll);
107
108
14
    child = tree -> gx_widget_first_child;
109
133
    while (child)
110
    {
111
119
        if (!(child -> gx_widget_status & GX_STATUS_NONCLIENT))
112
        {
113
92
            _gx_widget_scroll_shift(child, x_scroll, y_scroll, GX_TRUE);
114
        }
115
119
        child = child -> gx_widget_next;
116
    }
117
118
14
    _gx_widget_block_move((GX_WIDGET *)tree, &block, x_scroll, y_scroll);
119
120
    /* if we have a scrollbar, we need to tell it to re-calculate the thumb position */
121
122
14
    scroll = GX_NULL;
123
124
14
    if (x_scroll)
125
    {
126
5
        _gx_window_scrollbar_find((GX_WINDOW *)tree, (USHORT)GX_TYPE_HORIZONTAL_SCROLL, &scroll);
127
    }
128
    else
129
    {
130
9
        _gx_window_scrollbar_find((GX_WINDOW *)tree, GX_TYPE_VERTICAL_SCROLL, &scroll);
131
    }
132
133
14
    if (scroll)
134
    {
135
13
        _gx_scrollbar_reset(scroll, GX_NULL);
136
    }
137
14
    return(GX_SUCCESS);
138
}
139