2661d0ee8b40b64ce601acb660e3e553b1b8acfa
[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.new_global_ref
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
74 redef fun remove(item)
75 do
76 super
77 if item isa View then native.remove_view item.native
78 end
79 end
80
81 redef class HorizontalLayout
82 redef var native do
83 var layout = new NativeLinearLayout(app.native_activity)
84 layout = layout.new_global_ref
85 layout.set_horizontal
86 return layout
87 end
88 end
89
90 redef class VerticalLayout
91 redef var native do
92 var layout = new NativeLinearLayout(app.native_activity)
93 layout = layout.new_global_ref
94 layout.set_vertical
95 return layout
96 end
97 end
98
99 redef class TextView
100 redef type NATIVE: NativeTextView
101
102 redef fun text do return native.text.to_s
103 redef fun text=(value) do
104 if value == null then value = ""
105 native.text = value.to_java_string
106 end
107
108 # Size of the text
109 fun text_size: Float do return native.text_size
110
111 # Size of the text
112 fun text_size=(text_size: nullable Float) do
113 if text_size != null then native.text_size = text_size
114 end
115 end
116
117 redef class TextInput
118 redef type NATIVE: NativeEditText
119 redef var native = (new NativeEditText(app.native_activity)).new_global_ref
120 end
121
122 redef class Button
123 super Finalizable
124
125 redef type NATIVE: NativeButton
126 redef var native = (new NativeButton(app.native_activity, self)).new_global_ref
127
128 private fun on_click do notify_observers new ButtonPressEvent(self)
129
130 redef fun finalize do native.delete_global_ref
131 end
132
133 redef class NativeButton
134 private new (context: NativeActivity, sender_object: Button)
135 import Button.on_click in "Java" `{
136 final int final_sender_object = sender_object;
137
138 return new android.widget.Button(context){
139 @Override
140 public boolean onTouchEvent(android.view.MotionEvent event) {
141 if(event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
142 Button_on_click(final_sender_object);
143 return true;
144 }
145 return false;
146 }
147 };
148 `}
149 end