ui/cocoa/TabView.m

Sun, 23 Nov 2025 10:49:24 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 23 Nov 2025 10:49:24 +0100
changeset 931
6ca1ef6c8107
parent 863
589bca248476
permissions
-rw-r--r--

add ui_window_menubar_set_visible (Motif)

851
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2024 Olaf Wintermann. All rights reserved.
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #import "TabView.h"
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 #import "BoxContainer.h"
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #import "GridLayout.h"
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 @implementation UiTopTabView
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 @synthesize container = _container;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 - (id)init:(UiObject*)obj args:(UiTabViewArgs*)args {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 self = [super init];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 _obj = obj;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 _subcontainer = args->subcontainer;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 _padding = args->padding;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 _spacing = args->spacing;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 _columnspacing = args->columnspacing;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 _rowspacing = args->rowspacing;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 _onchange = args->onchange;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 _onchangedata = args->onchangedata;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 _var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER);
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 if(args->tabview == UI_TABVIEW_INVISIBLE || args->tabview == UI_TABVIEW_NAVIGATION_SIDE) {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 self.tabViewType = NSNoTabsNoBorder;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52
863
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
53 if(_var) {
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
54 UiInteger *i = _var->value;
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
55 i->obj = (__bridge void*)self;
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
56 i->get = ui_nstabview_get;
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
57 i->set = ui_nstabview_set;
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
58 }
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
59
851
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60 return self;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 - (void) addView:(NSView*)view layout:(UiLayout*)layout {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 // noop
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67 - (NSView<Container>*) createTab:(int)index title:(NSString*)title {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68 NSTabViewItem *item = [[NSTabViewItem alloc]initWithIdentifier:nil];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69 [item setLabel:title];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 if(index < 0) {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 [self addTabViewItem:item];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72 } else {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 [self insertTabViewItem:item atIndex:index];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 BoxContainer *content = [[BoxContainer alloc]init];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 item.view = content;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 GridLayout *sub;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 switch(_subcontainer) {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81 default: sub = [[BoxContainer alloc] init:NSUserInterfaceLayoutOrientationVertical spacing:_spacing]; break;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 case UI_CONTAINER_HBOX: sub = [[BoxContainer alloc] init:NSUserInterfaceLayoutOrientationHorizontal spacing:_spacing]; break;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 case UI_CONTAINER_GRID: {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84 sub = [[GridLayout alloc] init];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85 sub.columnspacing = _columnspacing;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86 sub.rowspacing = _rowspacing;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87 break;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
88 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90 UiLayout layout = {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 .margin = _padding,
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 .margin_left = _padding, .margin_right = _padding, .margin_top = _padding, .margin_bottom = _padding,
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93 .fill = TRUE };
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
94 [content addView:sub layout:&layout];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96 return sub;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 - (void) selectTab:(int)index {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 [self selectTabViewItemAtIndex:index];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 - (void) removeTab:(int)index {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 NSTabViewItem *item = [self tabViewItemAtIndex:index];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105 if(item != nil) {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 [self removeTabViewItem:item];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110 - (UiObject*) addTab:(int)index title:(NSString*)title {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 NSView<Container> *sub = [self createTab:index title:title];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
113 UiObject *newobj = uic_object_new_toplevel();
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114 newobj->widget = (__bridge void*)sub;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
115
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
116 UiContainerX *container = ui_create_container(newobj, sub);
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
117 uic_object_push_container(newobj, container);
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
118
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
119 return newobj;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
120 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
121
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
122 @end
863
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
123
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
124 int64_t ui_nstabview_get(UiInteger *i) {
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
125 UiTopTabView *tabview = (__bridge UiTopTabView*)i->obj;
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
126 i->value = [tabview indexOfTabViewItem:tabview.selectedTabViewItem];
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
127 return i->value;
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
128 }
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
129
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
130 void ui_nstabview_set(UiInteger *i, int64_t value) {
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
131 UiTopTabView *tabview = (__bridge UiTopTabView*)i->obj;
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
132 [tabview selectTab:(int)value];
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
133 i->value = [tabview indexOfTabViewItem:tabview.selectedTabViewItem];
589bca248476 implement tabview value binding (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 851
diff changeset
134 }

mercurial