Merge: Loose Tokens
[nit.git] / lib / android / ui / ui.nit
1 # This file is part of NIT (http://www.nitlanguage.org).
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 # Views and services to use the Android native user interface
16 module ui
17
18 # Implementation note:
19 #
20 # We cannot rely on `Activity::on_restore_instance_state` to implement
21 # `on_restore_state` is it only invoked if there is a bundled state,
22 # and we don't use the Android bundled state.
23
24 import native_ui
25 import log
26 import nit_activity
27
28 import app::ui
29 private import data_store
30
31 redef class Control
32 # The Android element used to implement `self`
33 fun native: NATIVE is abstract
34
35 # Type of `native`
36 type NATIVE: JavaObject
37 end
38
39 redef class Window
40 redef var native = app.native_activity
41
42 redef type NATIVE: NativeActivity
43
44 redef fun add(item)
45 do
46 super
47
48 # FIXME abstract the Android restriction where `content_view` must be a layout
49 assert item isa Layout
50 native.content_view = item.native
51 end
52 end
53
54 redef class View
55 redef type NATIVE: NativeView
56
57 redef fun enabled=(enabled) do native.enabled = enabled or else true
58 redef fun enabled do return native.enabled
59 end
60
61 redef class Layout
62 redef type NATIVE: NativeViewGroup
63
64 redef fun add(item)
65 do
66 super
67
68 assert item isa View
69
70 # FIXME abstract the use either homogeneous or weight to balance views size in a layout
71 native.add_view_with_weight(item.native, 1.0)
72 end
73 end
74
75 redef class HorizontalLayout
76 redef var native do
77 var layout = new NativeLinearLayout(app.native_activity)
78 layout.set_horizontal
79 return layout
80 end
81 end
82
83 redef class VerticalLayout
84 redef var native do
85 var layout = new NativeLinearLayout(app.native_activity)
86 layout.set_vertical
87 return layout
88 end
89 end
90
91 redef class TextView
92 redef type NATIVE: NativeTextView
93
94 redef fun text do return native.text.to_s
95 redef fun text=(value) do
96 if value == null then value = ""
97 native.text = value.to_java_string
98 end
99
100 # Size of the text
101 fun text_size: Float do return native.text_size
102
103 # Size of the text
104 fun text_size=(text_size: nullable Float) do
105 if text_size != null then native.text_size = text_size
106 end
107 end
108
109 redef class TextInput
110 redef type NATIVE: NativeEditText
111 redef var native = (new NativeEditText(app.native_activity)).new_global_ref
112 end
113
114 redef class Button
115 super Finalizable
116
117 redef type NATIVE: NativeButton
118 redef var native = (new NativeButton(app.native_activity, self)).new_global_ref
119
120 private fun on_click do notify_observers new ButtonPressEvent(self)
121
122 redef fun finalize do native.delete_global_ref
123 end
124
125 redef class NativeButton
126 private new (context: NativeActivity, sender_object: Button)
127 import Button.on_click in "Java" `{
128 final int final_sender_object = sender_object;
129
130 return new android.widget.Button(context){
131 @Override
132 public boolean onTouchEvent(android.view.MotionEvent event) {
133 if(event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
134 Button_on_click(final_sender_object);
135 return true;
136 }
137 return false;
138 }
139 };
140 `}
141 end