update uwproj
[mizunara.git] / ui / motif / container.h
1 /*
2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3  *
4  * Copyright 2014 Olaf Wintermann. All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  *   1. Redistributions of source code must retain the above copyright
10  *      notice, this list of conditions and the following disclaimer.
11  *
12  *   2. Redistributions in binary form must reproduce the above copyright
13  *      notice, this list of conditions and the following disclaimer in the
14  *      documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #ifndef CONTAINER_H
30 #define CONTAINER_H
31
32 #include "../ui/toolkit.h"
33 #include "../ui/container.h"
34 #include <ucx/list.h>
35 #include <string.h>
36
37 #ifdef  __cplusplus
38 extern "C" {
39 #endif
40
41 #define ui_reset_layout(layout) memset(&(layout), 0, sizeof(UiLayout))
42     
43 typedef struct MotifTabbedPane    MotifTabbedPane;
44 typedef struct UiTab              UiTab;
45 typedef struct UiBoxContainer     UiBoxContainer;
46 typedef struct UiGridContainer    UiGridContainer;
47 typedef struct UiTabViewContainer UiTabViewContainer;
48 typedef struct UiLayout           UiLayout;
49
50 typedef Widget (*ui_container_add_f)(UiContainer*, Arg*, int*, UiBool);
51
52 typedef enum UiLayoutBool     UiLayoutBool;
53 typedef enum UiBoxOrientation UiBoxOrientation;
54
55
56 enum UiLayoutBool {
57     UI_LAYOUT_UNDEFINED = 0,
58     UI_LAYOUT_TRUE,
59     UI_LAYOUT_FALSE,
60 };
61
62 enum UiBoxOrientation {
63     UI_BOX_VERTICAL = 0,
64     UI_BOX_HORIZONTAL
65 };
66
67 struct UiLayout {
68     UiLayoutBool fill;
69     UiBool       newline;
70     char         *label;
71     UiBool       hexpand;
72     UiBool       vexpand;
73     int          gridwidth;
74 };
75
76 struct UiContainer {
77     Widget   widget;
78     Widget   (*prepare)(UiContainer*, Arg *, int*, UiBool);
79     void     (*add)(UiContainer*, Widget);
80     UiLayout layout;
81     Widget   current;
82     Widget   menu;
83 };
84
85 struct UiBoxContainer {
86     UiContainer container;
87     Widget      prev_widget;
88     UiBool      has_fill;
89     UiBoxOrientation orientation;
90     int         margin;
91     int         spacing;
92 };
93
94 struct UiGridContainer {
95     UiContainer container;
96     UcxList     *lines;
97     UcxList     *current;
98     int         columnspacing;
99     int         rowspacing;
100 };
101
102 struct UiTabViewContainer {
103     UiContainer container;
104     UiContext   *context;
105     Widget      widget;
106     UcxList     *tabs;
107     Widget      current;
108 };
109
110 struct MotifTabbedPane {
111     UiTabbedPane view;
112     Widget       tabbar;
113     UcxList      *tabs;
114     UiTab        *current;
115     int          index;
116     Pixel        bg1;
117     Pixel        bg2;
118     int          height;
119 };
120
121 struct UiTab {
122     MotifTabbedPane *tabbedpane;
123     UiObject        *content;
124     Widget          tab_button;
125 };
126     
127
128 UiContainer* ui_frame_container(UiObject *obj, Widget frame);
129 Widget ui_frame_container_prepare(UiContainer *ct, Arg *args, int *n, UiBool fill);
130 void ui_frame_container_add(UiContainer *ct, Widget widget);
131
132 UiContainer* ui_box_container(UiObject *obj, Widget box, int margin, int spacing, UiBoxOrientation orientation);
133 Widget ui_box_container_prepare(UiContainer *ct, Arg *args, int *n, UiBool fill);
134 void ui_box_container_add(UiContainer *ct, Widget widget);
135
136 UiContainer* ui_grid_container(UiObject *obj, Widget form, int columnspacing, int rowspacing);
137 Widget ui_grid_container_prepare(UiContainer *ct, Arg *args, int *n, UiBool fill);
138 void ui_grid_container_add(UiContainer *ct, Widget widget);
139
140 UiContainer* ui_scrolledwindow_container(UiObject *obj, Widget scrolledwindow);
141 Widget ui_scrolledwindow_container_prepare(UiContainer *ct, Arg *args, int *n, UiBool fill);
142 void ui_scrolledwindow_container_add(UiContainer *ct, Widget widget);
143
144 UiContainer* ui_tabview_container(UiObject *obj, Widget rowcolumn);
145 Widget ui_tabview_container_prepare(UiContainer *ct, Arg *args, int *n, UiBool fill);
146 void ui_tabview_container_add(UiContainer *ct, Widget widget);
147
148 void ui_tab_button_callback(Widget widget, UiTab *tab, XtPointer d);
149 void ui_change_tab(MotifTabbedPane *pane, UiTab *tab);
150
151 void ui_tab_set_document(UiContext *ctx, void *document);
152 void ui_tab_detach_document(UiContext *ctx);
153
154
155 #ifdef  __cplusplus
156 }
157 #endif
158
159 #endif  /* CONTAINER_H */
160