1/***************************************************************************
2 begin       : August 19 2010
3 copyright   : (C) 2010 by Samuel Strupp
4
5 ***************************************************************************
6 *          Please see toplevel file COPYING for license details           *
7 ***************************************************************************/
8
9
10
11/*
12 * Note: This is a special use case for gtk_notebook.
13 * To use it as a WidgetStack we have to disable drawing od tabs
14 * and borders by calling:
15 * - gtk_notebook_set_show_tabs(GTK_NOTEBOOK(g), FALSE);
16 * - gtk_notebook_set_show_border(GTK_NOTEBOOK(g), FALSE);
17 *
18 */
19
20
21
22static GWENHYWFAR_CB
23int CocoaGui_WStack_SetIntProperty(GWEN_WIDGET *w,
24								   GWEN_DIALOG_PROPERTY prop,
25								   int index,
26								   int value,
27								   int doSignal) {
28	CocoaTabView *stackView;
29
30	stackView=(CocoaTabView*)(GWEN_Widget_GetImplData(w, COCOA_DIALOG_WIDGET_REAL));
31	assert(stackView);
32
33	switch(prop) {
34		case GWEN_DialogProperty_Enabled:
35			return 0;
36
37		case GWEN_DialogProperty_Focus:
38			return 0;
39
40		case GWEN_DialogProperty_Width: {
41			NSRect frame = [stackView frame];
42			frame.size.width = value;
43			[stackView setFrame:frame];
44		}
45			return 0;
46
47		case GWEN_DialogProperty_Height: {
48			NSRect frame = [stackView frame];
49			frame.size.height = value;
50			[stackView setFrame:frame];
51		}
52			return 0;
53
54		case GWEN_DialogProperty_Value:
55			if (value >= 0 && value < [stackView numberOfTabViewItems]) {
56				[stackView selectTabViewItemAtIndex:value];
57			}
58			return 0;
59
60		default:
61			break;
62	}
63
64	DBG_WARN(GWEN_LOGDOMAIN,
65			 "Function is not appropriate for this type of widget (%s)",
66			 GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
67	return GWEN_ERROR_INVALID;
68}
69
70
71
72
73static GWENHYWFAR_CB
74int CocoaGui_WStack_GetIntProperty(GWEN_WIDGET *w,
75								   GWEN_DIALOG_PROPERTY prop,
76								   int index,
77								   int defaultValue) {
78	CocoaTabView *stackView;
79
80	stackView=(CocoaTabView*)(GWEN_Widget_GetImplData(w, COCOA_DIALOG_WIDGET_REAL));
81	assert(stackView);
82
83	switch(prop) {
84		case GWEN_DialogProperty_Enabled:
85			return 1;
86
87		case GWEN_DialogProperty_Focus:
88			return 0;
89
90		case GWEN_DialogProperty_Width:
91			return [stackView frame].size.width;
92
93		case GWEN_DialogProperty_Height:
94			return [stackView frame].size.height;
95
96		case GWEN_DialogProperty_Value:
97			return [stackView indexOfTabViewItem:[stackView selectedTabViewItem]];
98
99		default:
100			break;
101	}
102
103	DBG_WARN(GWEN_LOGDOMAIN,
104			 "Function is not appropriate for this type of widget (%s)",
105			 GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
106	return defaultValue;
107}
108
109
110
111static GWENHYWFAR_CB
112int CocoaGui_WStack_SetCharProperty(GWEN_WIDGET *w,
113									GWEN_DIALOG_PROPERTY prop,
114									int index,
115									const char *value,
116									int doSignal) {
117	CocoaTabView *stackView;
118
119	stackView=(CocoaTabView*)(GWEN_Widget_GetImplData(w, COCOA_DIALOG_WIDGET_REAL));
120	assert(stackView);
121
122	DBG_WARN(GWEN_LOGDOMAIN,
123			 "Function is not appropriate for this type of widget (%s)",
124			 GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
125	return GWEN_ERROR_INVALID;
126}
127
128
129
130static GWENHYWFAR_CB
131const char* CocoaGui_WStack_GetCharProperty(GWEN_WIDGET *w,
132											GWEN_DIALOG_PROPERTY prop,
133											int index,
134											const char *defaultValue) {
135	CocoaTabView *stackView;
136
137	stackView=(CocoaTabView*)(GWEN_Widget_GetImplData(w, COCOA_DIALOG_WIDGET_REAL));
138	assert(stackView);
139
140	DBG_WARN(GWEN_LOGDOMAIN,
141			 "Function is not appropriate for this type of widget (%s)",
142			 GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
143	return defaultValue;
144}
145
146
147
148static GWENHYWFAR_CB
149int CocoaGui_WStack_AddChildGuiWidget(GWEN_WIDGET *w, GWEN_WIDGET *wChild) {
150	CocoaTabView *stackView;
151
152	stackView=(CocoaTabView*)(GWEN_Widget_GetImplData(w, COCOA_DIALOG_WIDGET_REAL));
153	assert(stackView);
154
155	NSView *subview =(NSView*)(GWEN_Widget_GetImplData(wChild, COCOA_DIALOG_WIDGET_REAL));
156	assert(subview);
157
158	NSTabViewItem *item = [[NSTabViewItem alloc] init];
159
160	[item setView:subview];
161
162	[stackView addTabViewItem:item];
163	[item release];
164
165	return 0;
166}
167
168
169
170int CocoaGui_WStack_Setup(GWEN_WIDGET *w) {
171	CocoaTabView *stackView;
172	uint32_t flags;
173	GWEN_WIDGET *wParent;
174
175	flags=GWEN_Widget_GetFlags(w);
176	wParent=GWEN_Widget_Tree_GetParent(w);
177
178	stackView = [[[CocoaTabView alloc] initWithFrame:NSMakeRect(0.0, 0.0, 100.0, 100.0)] autorelease];
179	[stackView setTabViewType:NSNoTabsNoBorder];
180	if (flags & GWEN_WIDGET_FLAGS_FILLX) stackView.fillX = YES;
181	if (flags & GWEN_WIDGET_FLAGS_FILLY) stackView.fillY = YES;
182
183
184	GWEN_Widget_SetImplData(w, COCOA_DIALOG_WIDGET_REAL, (void*) stackView);
185	GWEN_Widget_SetImplData(w, COCOA_DIALOG_WIDGET_CONTENT, (void*) stackView);
186
187	GWEN_Widget_SetSetIntPropertyFn(w, CocoaGui_WStack_SetIntProperty);
188	GWEN_Widget_SetGetIntPropertyFn(w, CocoaGui_WStack_GetIntProperty);
189	GWEN_Widget_SetSetCharPropertyFn(w, CocoaGui_WStack_SetCharProperty);
190	GWEN_Widget_SetGetCharPropertyFn(w, CocoaGui_WStack_GetCharProperty);
191	GWEN_Widget_SetAddChildGuiWidgetFn(w, CocoaGui_WStack_AddChildGuiWidget);
192
193	if (wParent)
194		GWEN_Widget_AddChildGuiWidget(wParent, w);
195
196	return 0;
197}
198
199
200