ui/motif/container.c

changeset 52
25e5390cce41
parent 36
e4198fc2ead4
child 53
62205699cd0e
equal deleted inserted replaced
51:42506e19eb6b 52:25e5390cce41
79 uic_obj_add(obj, right); 79 uic_obj_add(obj, right);
80 uic_obj_add(obj, left); 80 uic_obj_add(obj, left);
81 81
82 return sidebar; 82 return sidebar;
83 } 83 }
84
85 UiTabbedPane* ui_tabbed_document_view(UiObject *obj) {
86 int n = 0;
87 Arg args[16];
88
89 UiContainer *ct = uic_get_current_container(obj);
90 Widget parent = ct->add(ct, args, &n);
91
92 Widget tabview = XmCreateForm(parent, "tabview_form", args, n);
93 XtManageChild(tabview);
94
95 XtSetArg(args[0], XmNorientation, XmHORIZONTAL);
96 XtSetArg(args[1], XmNpacking, XmPACK_TIGHT);
97 XtSetArg(args[2], XmNspacing, 1);
98 XtSetArg(args[3], XmNleftAttachment, XmATTACH_FORM);
99 XtSetArg(args[4], XmNrightAttachment, XmATTACH_FORM);
100 XtSetArg(args[5], XmNtopAttachment, XmATTACH_FORM);
101 Widget tabbar = XmCreateRowColumn(tabview, "toolbar", args, 6);
102 XtManageChild(tabbar);
103
104 XtSetArg(args[0], XmNleftAttachment, XmATTACH_FORM);
105 XtSetArg(args[1], XmNrightAttachment, XmATTACH_FORM);
106 XtSetArg(args[2], XmNtopAttachment, XmATTACH_WIDGET);
107 XtSetArg(args[3], XmNtopWidget, tabbar);
108 XtSetArg(args[4], XmNbottomAttachment, XmATTACH_FORM);
109 XtSetArg(args[5], XmNshadowThickness, 0);
110 Widget tabct = XmCreateForm(tabview, "tabview", args, 6);
111 XtManageChild(tabct);
112
113 MotifTabbedPane *tabbedpane = ui_malloc(obj->ctx, sizeof(MotifTabbedPane));
114 tabbedpane->view.ctx = uic_current_obj(obj)->ctx;
115 tabbedpane->view.widget = tabct;
116 tabbedpane->view.document = NULL;
117 tabbedpane->tabbar = tabbar;
118 //tabbedpane->form = tabview;
119 tabbedpane->tabs = NULL;
120 tabbedpane->current = NULL;
121
122 return &tabbedpane->view;
123 }
124
125 UiObject* ui_document_tab(UiTabbedPane *view) {
126 MotifTabbedPane *v = (MotifTabbedPane*)view;
127 int n = 0;
128 Arg args[16];
129
130 // hide the current tab content
131 if(v->current) {
132 XtUnmanageChild(v->current->content->widget);
133 }
134
135 UiTab *tab = ui_malloc(view->ctx, sizeof(UiTab));
136
137 // create the new tab content
138 XtSetArg(args[0], XmNshadowThickness, 0);
139 XtSetArg(args[1], XmNleftAttachment, XmATTACH_FORM);
140 XtSetArg(args[2], XmNrightAttachment, XmATTACH_FORM);
141 XtSetArg(args[3], XmNtopAttachment, XmATTACH_FORM);
142 XtSetArg(args[4], XmNbottomAttachment, XmATTACH_FORM);
143 XtSetArg(args[5], XmNuserData, tab);
144 Widget frame = XmCreateFrame(view->widget, "tab", args, 6);
145 XtManageChild(frame);
146
147 UiObject *content = ui_malloc(view->ctx, sizeof(UiObject));
148 content->widget = NULL; // initialization for uic_context()
149 content->ctx = uic_context(content, view->ctx->mempool);
150 content->ctx->parent = view->ctx;
151 content->ctx->set_document = ui_tab_set_document;
152 content->ctx->detach_document = ui_tab_detach_document;
153 content->widget = frame;
154 content->window = view->ctx->obj->window;
155 content->container = ui_frame_container(content, frame);
156 content->next = NULL;
157
158 // add tab button
159 XmString label = XmStringCreateLocalized("tab");
160 XtSetArg(args[0], XmNlabelString, label);
161 XtSetArg(args[1], XmNshadowThickness, 1);
162 XtSetArg(args[2], XmNtraversalOn, FALSE);
163 Widget button = XmCreatePushButton(v->tabbar, "tab_button", args, 3);
164 XtManageChild(button);
165 XtAddCallback(
166 button,
167 XmNactivateCallback,
168 (XtCallbackProc)ui_tab_button_callback,
169 tab);
170
171 tab->tabbedpane = v;
172 tab->content = content;
173 tab->tab_button = button;
174
175 v->tabs = ucx_list_append_a(view->ctx->mempool->allocator, v->tabs, tab);
176 v->current = tab;
177 ui_change_tab(v, tab);
178
179 return content;
180 }
181
182 void ui_tab_button_callback(Widget widget, UiTab *tab, XtPointer d) {
183 MotifTabbedPane *t = tab->tabbedpane;
184 if(t->current) {
185 XtUnmanageChild(t->current->content->widget);
186 }
187 XtManageChild(tab->content->widget);
188
189 t->current = tab;
190 ui_change_tab(t, tab);
191 }
192
193 void ui_change_tab(MotifTabbedPane *pane, UiTab *tab) {
194 UiContext *ctx = tab->content->ctx;
195 ctx->parent->set_document(ctx->parent, ctx->document);
196 }
197
198 void ui_tab_set_document(UiContext *ctx, void *document) {
199 if(ctx->parent->document) {
200 //ctx->parent->detach_document(ctx->parent, ctx->parent->document);
201 }
202 uic_context_set_document(ctx, document);
203 //uic_context_set_document(ctx->parent, document);
204 //ctx->parent->document = document;
205
206 UiTab *tab = NULL;
207 XtVaGetValues(
208 ctx->obj->widget,
209 XmNuserData,
210 &tab,
211 NULL);
212 if(tab) {
213 if(tab->tabbedpane->current == tab) {
214 ctx->parent->set_document(ctx->parent, ctx->document);
215 }
216 } else {
217 fprintf(stderr, "UiError: ui_bar_set_document: Cannot set document");
218 }
219 }
220
221 void ui_tab_detach_document(UiContext *ctx, void *document) {
222 uic_context_detach_document(ctx->parent, document);
223 }

mercurial