rsence-pre 2.1.0.1.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.yardopts +10 -0
- data/INSTALL.rdoc +330 -0
- data/LICENSE.txt +622 -0
- data/README.rdoc +98 -0
- data/VERSION +1 -0
- data/bin/rsence +25 -0
- data/bin/rsence-pre +25 -0
- data/conf/default_conf.yaml +346 -0
- data/conf/default_strings.yaml +76 -0
- data/conf/rsence_command_strings.yaml +444 -0
- data/docs/ExampleGuiPlugin.rdoc +193 -0
- data/docs/JavascriptBundles.rdoc +0 -0
- data/docs/PluginBundleInfo.rdoc +173 -0
- data/docs/PluginBundles.rdoc +96 -0
- data/docs/Values.rdoc +163 -0
- data/js/comm/autosync/autosync.js +17 -0
- data/js/comm/autosync/js.inc +0 -0
- data/js/comm/comm.js +203 -0
- data/js/comm/js.inc +0 -0
- data/js/comm/jsloader/js.inc +0 -0
- data/js/comm/jsloader/jsloader.js +112 -0
- data/js/comm/queue/js.inc +0 -0
- data/js/comm/queue/queue.js +184 -0
- data/js/comm/session/js.inc +0 -0
- data/js/comm/session/session.js +52 -0
- data/js/comm/sessionwatcher/js.inc +0 -0
- data/js/comm/sessionwatcher/sessionwatcher.js +44 -0
- data/js/comm/transporter/js.inc +0 -0
- data/js/comm/transporter/transporter.js +261 -0
- data/js/comm/urlresponder/js.inc +0 -0
- data/js/comm/urlresponder/urlresponder.js +149 -0
- data/js/comm/values/js.inc +0 -0
- data/js/comm/values/values.js +433 -0
- data/js/controls/button/button.js +72 -0
- data/js/controls/button/js.inc +0 -0
- data/js/controls/button/themes/bright/button.css +89 -0
- data/js/controls/button/themes/bright/button.html +7 -0
- data/js/controls/button/themes/bright/button_parts1-ie6.gif +0 -0
- data/js/controls/button/themes/bright/button_parts1.png +0 -0
- data/js/controls/button/themes/default/button.css +89 -0
- data/js/controls/button/themes/default/button.html +7 -0
- data/js/controls/button/themes/default/button_parts1-ie6.gif +0 -0
- data/js/controls/button/themes/default/button_parts1.png +0 -0
- data/js/controls/checkbox/checkbox.js +49 -0
- data/js/controls/checkbox/js.inc +0 -0
- data/js/controls/checkbox/themes/default/checkbox.css +69 -0
- data/js/controls/checkbox/themes/default/checkbox.html +5 -0
- data/js/controls/checkbox/themes/default/checkbox_parts1-ie6.gif +0 -0
- data/js/controls/checkbox/themes/default/checkbox_parts1.png +0 -0
- data/js/controls/dialogs/alert_sheet/alert_sheet.js +63 -0
- data/js/controls/dialogs/alert_sheet/js.inc +0 -0
- data/js/controls/dialogs/confirm_sheet/confirm_sheet.js +37 -0
- data/js/controls/dialogs/confirm_sheet/js.inc +0 -0
- data/js/controls/dialogs/sheet/js.inc +0 -0
- data/js/controls/dialogs/sheet/sheet.js +84 -0
- data/js/controls/dialogs/sheet/themes/default/sheet.css +64 -0
- data/js/controls/dialogs/sheet/themes/default/sheet.html +14 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_bg-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_bg.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_dim-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_dim.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts1-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts1.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts2-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts2.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_warning-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_warning.png +0 -0
- data/js/controls/imageview/imageview.js +109 -0
- data/js/controls/imageview/js.inc +0 -0
- data/js/controls/imageview/themes/default/blank.gif +0 -0
- data/js/controls/passwordcontrol/js.inc +0 -0
- data/js/controls/passwordcontrol/passwordcontrol.js +23 -0
- data/js/controls/passwordcontrol/themes/default/passwordcontrol.css +0 -0
- data/js/controls/passwordcontrol/themes/default/passwordcontrol.html +18 -0
- data/js/controls/progress/progressbar/js.inc +0 -0
- data/js/controls/progress/progressbar/progressbar.js +40 -0
- data/js/controls/progress/progressbar/themes/default/progressbar.css +16 -0
- data/js/controls/progress/progressbar/themes/default/progressbar.html +2 -0
- data/js/controls/progress/progressindicator/js.inc +0 -0
- data/js/controls/progress/progressindicator/progressindicator.js +44 -0
- data/js/controls/radiobutton/js.inc +0 -0
- data/js/controls/radiobutton/radiobutton.js +43 -0
- data/js/controls/radiobutton/themes/default/radiobutton.css +69 -0
- data/js/controls/radiobutton/themes/default/radiobutton.html +5 -0
- data/js/controls/radiobutton/themes/default/radiobutton_parts1-ie6.gif +0 -0
- data/js/controls/radiobutton/themes/default/radiobutton_parts1.png +0 -0
- data/js/controls/sliders/slider/js.inc +0 -0
- data/js/controls/sliders/slider/slider.js +357 -0
- data/js/controls/sliders/slider/themes/default/hslider_tracks-ie6.gif +0 -0
- data/js/controls/sliders/slider/themes/default/hslider_tracks.png +0 -0
- data/js/controls/sliders/slider/themes/default/slider.css +108 -0
- data/js/controls/sliders/slider/themes/default/slider.html +5 -0
- data/js/controls/sliders/slider/themes/default/slider_thumbs-ie6.gif +0 -0
- data/js/controls/sliders/slider/themes/default/slider_thumbs.png +0 -0
- data/js/controls/sliders/vslider/js.inc +0 -0
- data/js/controls/sliders/vslider/themes/default/vslider.css +52 -0
- data/js/controls/sliders/vslider/themes/default/vslider.html +5 -0
- data/js/controls/sliders/vslider/themes/default/vslider_tracks-ie6.gif +0 -0
- data/js/controls/sliders/vslider/themes/default/vslider_tracks.png +0 -0
- data/js/controls/sliders/vslider/vslider.js +41 -0
- data/js/controls/stepper/js.inc +0 -0
- data/js/controls/stepper/stepper.js +213 -0
- data/js/controls/stepper/themes/default/stepper-ie6.gif +0 -0
- data/js/controls/stepper/themes/default/stepper.css +14 -0
- data/js/controls/stepper/themes/default/stepper.html +2 -0
- data/js/controls/stepper/themes/default/stepper.png +0 -0
- data/js/controls/stringview/js.inc +0 -0
- data/js/controls/stringview/stringview.js +49 -0
- data/js/controls/stringview/themes/default/stringview.css +8 -0
- data/js/controls/stringview/themes/default/stringview.html +1 -0
- data/js/controls/tab/js.inc +0 -0
- data/js/controls/tab/tab.js +280 -0
- data/js/controls/tab/themes/bright/tab.css +76 -0
- data/js/controls/tab/themes/bright/tab.html +6 -0
- data/js/controls/tab/themes/bright/tab_bg_color-ie6.gif +0 -0
- data/js/controls/tab/themes/bright/tab_bg_color.png +0 -0
- data/js/controls/tab/themes/bright/tab_border_pattern-ie6.gif +0 -0
- data/js/controls/tab/themes/bright/tab_border_pattern.png +0 -0
- data/js/controls/tab/themes/bright/tab_parts1-ie6.gif +0 -0
- data/js/controls/tab/themes/bright/tab_parts1.png +0 -0
- data/js/controls/tab/themes/default/tab.css +77 -0
- data/js/controls/tab/themes/default/tab.html +6 -0
- data/js/controls/tab/themes/default/tab_bg_color-ie6.gif +0 -0
- data/js/controls/tab/themes/default/tab_bg_color.png +0 -0
- data/js/controls/tab/themes/default/tab_border_pattern-ie6.gif +0 -0
- data/js/controls/tab/themes/default/tab_border_pattern.png +0 -0
- data/js/controls/tab/themes/default/tab_parts1-ie6.gif +0 -0
- data/js/controls/tab/themes/default/tab_parts1.png +0 -0
- data/js/controls/textarea/js.inc +0 -0
- data/js/controls/textarea/textarea.js +24 -0
- data/js/controls/textarea/themes/default/textarea.css +21 -0
- data/js/controls/textarea/themes/default/textarea.html +18 -0
- data/js/controls/textcontrol/js.inc +0 -0
- data/js/controls/textcontrol/textcontrol.js +374 -0
- data/js/controls/textcontrol/themes/default/textcontrol.css +107 -0
- data/js/controls/textcontrol/themes/default/textcontrol.html +18 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts1-ie6.gif +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts1.png +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts2-ie6.gif +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts2.png +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts3-ie6.gif +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts3.png +0 -0
- data/js/controls/uploader/js.inc +0 -0
- data/js/controls/uploader/themes/default/upload_progress.gif +0 -0
- data/js/controls/uploader/themes/default/uploader.css +108 -0
- data/js/controls/uploader/themes/default/uploader.html +27 -0
- data/js/controls/uploader/uploader.js +154 -0
- data/js/controls/validatorview/js.inc +0 -0
- data/js/controls/validatorview/themes/default/validator-ie6.gif +0 -0
- data/js/controls/validatorview/themes/default/validator.png +0 -0
- data/js/controls/validatorview/themes/default/validatorview.css +0 -0
- data/js/controls/validatorview/themes/default/validatorview.html +0 -0
- data/js/controls/validatorview/validatorview.js +62 -0
- data/js/controls/window/js.inc +0 -0
- data/js/controls/window/themes/default/window.css +219 -0
- data/js/controls/window/themes/default/window.html +17 -0
- data/js/controls/window/themes/default/window_bg_active-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_bg_active.png +0 -0
- data/js/controls/window/themes/default/window_bg_inactive-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_bg_inactive.png +0 -0
- data/js/controls/window/themes/default/window_buttons-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_buttons.png +0 -0
- data/js/controls/window/themes/default/window_parts1-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_parts1.png +0 -0
- data/js/controls/window/themes/default/window_parts2-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_parts2.png +0 -0
- data/js/controls/window/window.js +286 -0
- data/js/core/class/class.js +318 -0
- data/js/core/class/js.inc +0 -0
- data/js/core/elem/elem.js +1383 -0
- data/js/core/elem/js.inc +0 -0
- data/js/core/event/event.js +153 -0
- data/js/core/event/js.inc +0 -0
- data/js/core/iefix/ie_css_element.htc +5 -0
- data/js/core/iefix/ie_css_style.htc +5 -0
- data/js/core/iefix/iefix.js +359 -0
- data/js/core/iefix/js.inc +0 -0
- data/js/core/rsence_ns/js.inc +0 -0
- data/js/core/rsence_ns/rsence_ns.js +21 -0
- data/js/datetime/calendar/calendar.js +198 -0
- data/js/datetime/calendar/js.inc +0 -0
- data/js/datetime/calendar/themes/default/calendar.css +108 -0
- data/js/datetime/calendar/themes/default/calendar.html +9 -0
- data/js/datetime/calendar/themes/default/calendar_arrows-ie6.gif +0 -0
- data/js/datetime/calendar/themes/default/calendar_arrows.png +0 -0
- data/js/datetime/datetimevalue/datetimevalue.js +247 -0
- data/js/datetime/datetimevalue/js.inc +0 -0
- data/js/datetime/timesheet/js.inc +0 -0
- data/js/datetime/timesheet/themes/default/timesheet.css +30 -0
- data/js/datetime/timesheet/themes/default/timesheet.html +2 -0
- data/js/datetime/timesheet/timesheet.js +183 -0
- data/js/datetime/timesheet_item/js.inc +0 -0
- data/js/datetime/timesheet_item/themes/default/timesheet_item.css +42 -0
- data/js/datetime/timesheet_item/themes/default/timesheet_item.html +8 -0
- data/js/datetime/timesheet_item/timesheet_item.js +248 -0
- data/js/datetime/timesheet_item_edit/js.inc +0 -0
- data/js/datetime/timesheet_item_edit/timesheet_item_edit.js +274 -0
- data/js/foundation/application/application.js +208 -0
- data/js/foundation/application/js.inc +0 -0
- data/js/foundation/control/control.js +339 -0
- data/js/foundation/control/controldefaults/controldefaults.js +56 -0
- data/js/foundation/control/controldefaults/js.inc +0 -0
- data/js/foundation/control/dummyvalue/dummyvalue.js +51 -0
- data/js/foundation/control/dummyvalue/js.inc +0 -0
- data/js/foundation/control/dyncontrol/dyncontrol.js +500 -0
- data/js/foundation/control/dyncontrol/js.inc +0 -0
- data/js/foundation/control/dyncontrol/themes/default/dyncontrol.css +0 -0
- data/js/foundation/control/dyncontrol/themes/default/dyncontrol.html +0 -0
- data/js/foundation/control/eventresponder/eventresponder.js +750 -0
- data/js/foundation/control/eventresponder/js.inc +0 -0
- data/js/foundation/control/js.inc +0 -0
- data/js/foundation/control/valuematrix/js.inc +0 -0
- data/js/foundation/control/valuematrix/valuematrix.js +135 -0
- data/js/foundation/control/valueresponder/js.inc +0 -0
- data/js/foundation/control/valueresponder/valueresponder.js +79 -0
- data/js/foundation/eventmanager/eventmanager.js +991 -0
- data/js/foundation/eventmanager/js.inc +0 -0
- data/js/foundation/geom/point/js.inc +0 -0
- data/js/foundation/geom/point/point.js +202 -0
- data/js/foundation/geom/rect/js.inc +0 -0
- data/js/foundation/geom/rect/rect.js +651 -0
- data/js/foundation/json_renderer/js.inc +0 -0
- data/js/foundation/json_renderer/json_renderer.js +246 -0
- data/js/foundation/system/js.inc +0 -0
- data/js/foundation/system/system.js +381 -0
- data/js/foundation/thememanager/js.inc +0 -0
- data/js/foundation/thememanager/thememanager.js +393 -0
- data/js/foundation/value/js.inc +0 -0
- data/js/foundation/value/value.js +183 -0
- data/js/foundation/view/js.inc +0 -0
- data/js/foundation/view/markupview/js.inc +0 -0
- data/js/foundation/view/markupview/markupview.js +114 -0
- data/js/foundation/view/morphanimation/js.inc +0 -0
- data/js/foundation/view/morphanimation/morphanimation.js +237 -0
- data/js/foundation/view/view.js +1812 -0
- data/js/foundation/view/viewdefaults/js.inc +0 -0
- data/js/foundation/view/viewdefaults/viewdefaults.js +26 -0
- data/js/lists/checkboxlist/checkboxlist.js +171 -0
- data/js/lists/checkboxlist/js.inc +0 -0
- data/js/lists/listitems/js.inc +0 -0
- data/js/lists/listitems/listitems.js +88 -0
- data/js/lists/propertylist/js.inc +0 -0
- data/js/lists/propertylist/propertylist.js +326 -0
- data/js/lists/radiobuttonlist/js.inc +0 -0
- data/js/lists/radiobuttonlist/radiobuttonlist.js +116 -0
- data/js/util/reloadapp/js.inc +0 -0
- data/js/util/reloadapp/reloadapp.js +152 -0
- data/js/util/reloadapp/themes/default/reloadapp_warning-ie6.gif +0 -0
- data/js/util/reloadapp/themes/default/reloadapp_warning.png +0 -0
- data/js/util/sha/js.inc +0 -0
- data/js/util/sha/sha.js +426 -0
- data/js/views/centerview/centerview.js +75 -0
- data/js/views/centerview/js.inc +0 -0
- data/js/views/inlineview/inlineview.js +15 -0
- data/js/views/inlineview/js.inc +0 -0
- data/js/views/scrollview/js.inc +0 -0
- data/js/views/scrollview/scrollview.js +40 -0
- data/lib/conf/argv.rb +850 -0
- data/lib/conf/default.rb +219 -0
- data/lib/daemon/daemon.rb +387 -0
- data/lib/daemon/sigcomm.rb +64 -0
- data/lib/http/broker.rb +150 -0
- data/lib/http/rackup.rb +91 -0
- data/lib/http/request.rb +66 -0
- data/lib/http/response.rb +65 -0
- data/lib/plugins/dependencies.rb +285 -0
- data/lib/plugins/gui_plugin.rb +160 -0
- data/lib/plugins/guiparser.rb +123 -0
- data/lib/plugins/plugin.rb +438 -0
- data/lib/plugins/plugin_base.rb +162 -0
- data/lib/plugins/plugin_plugins.rb +81 -0
- data/lib/plugins/plugin_sqlite_db.rb +98 -0
- data/lib/plugins/pluginmanager.rb +635 -0
- data/lib/plugins/plugins.rb +169 -0
- data/lib/plugins/servlet.rb +108 -0
- data/lib/rsence.rb +32 -0
- data/lib/session/msg.rb +327 -0
- data/lib/session/sessionmanager.rb +522 -0
- data/lib/session/sessionstorage.rb +340 -0
- data/lib/transporter/transporter.rb +263 -0
- data/lib/util/gzstring.rb +9 -0
- data/lib/util/ruby19_fixes.rb +18 -0
- data/lib/values/hvalue.rb +378 -0
- data/lib/values/valuemanager.rb +172 -0
- data/plugins/client_pkg/client_pkg.rb +157 -0
- data/plugins/client_pkg/info.yaml +25 -0
- data/plugins/client_pkg/lib/client_pkg_build.rb +561 -0
- data/plugins/client_pkg/lib/client_pkg_cache.rb +50 -0
- data/plugins/client_pkg/lib/client_pkg_serve.rb +218 -0
- data/plugins/index_html/img/loading.gif +0 -0
- data/plugins/index_html/img/riassence.gif +0 -0
- data/plugins/index_html/index_html.rb +120 -0
- data/plugins/index_html/info.yaml +18 -0
- data/plugins/index_html/tmpl/index.html +15 -0
- data/plugins/main/info.yaml +18 -0
- data/plugins/main/js/main.js +84 -0
- data/plugins/main/main.rb +255 -0
- data/plugins/main/values.yaml +8 -0
- data/plugins/ticket/info.yaml +21 -0
- data/plugins/ticket/lib/common.rb +392 -0
- data/plugins/ticket/lib/favicon.rb +39 -0
- data/plugins/ticket/lib/file.rb +58 -0
- data/plugins/ticket/lib/img.rb +50 -0
- data/plugins/ticket/lib/objblob.rb +66 -0
- data/plugins/ticket/lib/rsrc.rb +34 -0
- data/plugins/ticket/lib/upload.rb +236 -0
- data/plugins/ticket/ticket.rb +333 -0
- data/setup/welcome/gui/welcome.yaml +92 -0
- data/setup/welcome/info.yaml +13 -0
- data/setup/welcome/text/welcome.html +9 -0
- data/setup/welcome/values.yaml +9 -0
- data/setup/welcome/welcome.rb +54 -0
- metadata +407 -0
@@ -0,0 +1,1812 @@
|
|
1
|
+
/* RSence
|
2
|
+
* Copyright 2006 Riassence Inc.
|
3
|
+
* http://riassence.com/
|
4
|
+
*
|
5
|
+
* You should have received a copy of the GNU General Public License along
|
6
|
+
* with this software package. If not, contact licensing@riassence.com
|
7
|
+
*/
|
8
|
+
|
9
|
+
/*** = Description
|
10
|
+
** HView is the foundation class for all views. HView is useful for
|
11
|
+
** any type of view and control grouping. It is designed for easy extension
|
12
|
+
** and it's the foundation for HControl and all other controls.
|
13
|
+
**
|
14
|
+
** The major differences between HView and HControl is that HView handles
|
15
|
+
** only visual representation and structurization. In addition to HView's
|
16
|
+
** features, HControl handles labels, values, events, states and such.
|
17
|
+
** However, HControl is more complex, so use HView instead whenever you don't
|
18
|
+
** need the additional features of HControl. HView implements the HMarkupView
|
19
|
+
** interface for template-related task.
|
20
|
+
**
|
21
|
+
** = Usage
|
22
|
+
** var myAppInstance = HApplication.nu();
|
23
|
+
** var rect1 = [10, 10, 100, 100];
|
24
|
+
** var myViewInstance = HView.nu( rect1, myAppInstance );
|
25
|
+
** var myViewInstance.setStyle('background-color','#ffcc00');
|
26
|
+
** var rect2 = [10, 10, 70, 70];
|
27
|
+
** var mySubView1 = HView.nu( rect2, myViewIntance );
|
28
|
+
** var rect3 [20, 20, 50, 50];
|
29
|
+
** var mySubView2 = HView.nu( rect3, mySubView1 );
|
30
|
+
**
|
31
|
+
***/
|
32
|
+
var//RSence.Foundation
|
33
|
+
HView = HClass.extend({
|
34
|
+
|
35
|
+
/** Component specific theme path.
|
36
|
+
**/
|
37
|
+
themePath: null,
|
38
|
+
|
39
|
+
/** True, if the component using absolute positioning.
|
40
|
+
* False, if the component is using relative positioning.
|
41
|
+
**/
|
42
|
+
isAbsolute: true,
|
43
|
+
|
44
|
+
/** The display mode to use.
|
45
|
+
* Defaults to 'block'.
|
46
|
+
* The other sane alternative is 'inline'.
|
47
|
+
**/
|
48
|
+
displayMode: 'block',
|
49
|
+
|
50
|
+
/** The visual value of a component, usually a String.
|
51
|
+
* See +#setLabel+.
|
52
|
+
**/
|
53
|
+
label: null,
|
54
|
+
|
55
|
+
/** When true, calls the +refreshLabel+ method whenever
|
56
|
+
* +self.label+ is changed.
|
57
|
+
**/
|
58
|
+
refreshOnLabelChange: true,
|
59
|
+
|
60
|
+
/** Escapes HTML in the label when true.
|
61
|
+
**/
|
62
|
+
escapeLabelHTML: false,
|
63
|
+
|
64
|
+
/** True, if the coordinates are right-aligned.
|
65
|
+
* False, if the coordinates are left-aligned.
|
66
|
+
* Uses flexRightOffset if true. Defined with 6-item arrays
|
67
|
+
* for the _rect parameter of setRect or the constructor.
|
68
|
+
* Can be set directly using the setFlexRight method.
|
69
|
+
**/
|
70
|
+
flexRight: false,
|
71
|
+
|
72
|
+
/** True, if the coordinates are left-aligned.
|
73
|
+
* False, if the coordinates are right-aligned.
|
74
|
+
* Uses the X-coordinate of rect, if true.
|
75
|
+
* Disabled using 6-item arrays with null x-coordinate
|
76
|
+
* for the _rect parameter of setRect or the constructor.
|
77
|
+
* Can be set directly using the setFlexLeft method.
|
78
|
+
**/
|
79
|
+
flexLeft: true,
|
80
|
+
|
81
|
+
/** True, if the coordinates are top-aligned.
|
82
|
+
* False, if the coordinates are bottom-aligned.
|
83
|
+
* Uses the Y-coordinate of rect, if true.
|
84
|
+
* Disabled using 6-item arrays with null x-coordinate
|
85
|
+
* for the _rect parameter of setRect or the constructor.
|
86
|
+
* Can be set directly using the setFlexTop method.
|
87
|
+
**/
|
88
|
+
flexTop: true,
|
89
|
+
|
90
|
+
/** True, if the coordinates are bottom-aligned.
|
91
|
+
* False, if the coordinates are top-aligned.
|
92
|
+
* Uses flexBottomOffset if true. Defined with 6-item arrays
|
93
|
+
* for the _rect parameter of setRect or the constructor.
|
94
|
+
* Can be set directly using the setFlexRight method.
|
95
|
+
**/
|
96
|
+
flexBottom: false,
|
97
|
+
|
98
|
+
/** The amount of pixels to offset from the right edge when
|
99
|
+
* flexRight is true. Defined with 6-item arrays
|
100
|
+
* for the _rect parameter of setRect or the constructor.
|
101
|
+
* Can be set directly using the setFlexRight method.
|
102
|
+
**/
|
103
|
+
flexRightOffset: 0,
|
104
|
+
|
105
|
+
/** The amount of pixels to offset from the bottom edge when
|
106
|
+
* flexBottom is true.Defined with 6-item arrays
|
107
|
+
* for the _rect parameter of setRect or the constructor.
|
108
|
+
* Can be set directly using the setFlexBottom method.
|
109
|
+
**/
|
110
|
+
flexBottomOffset: 0,
|
111
|
+
|
112
|
+
/** The drawn flag is false before the component is visually
|
113
|
+
* drawn, it's true after it's drawn.
|
114
|
+
**/
|
115
|
+
drawn: false,
|
116
|
+
|
117
|
+
/** The theme the component is constructed with. By default,
|
118
|
+
* uses the HThemeManager.currentTheme specified at the time
|
119
|
+
* of construction.
|
120
|
+
**/
|
121
|
+
theme: null,
|
122
|
+
|
123
|
+
/** The preserveTheme flag prevents the view from being redrawn
|
124
|
+
* if HThemeManager.currentTheme is changed after the view
|
125
|
+
* has been drawn. Is true, if theme has been set.
|
126
|
+
**/
|
127
|
+
preserveTheme: false,
|
128
|
+
|
129
|
+
/** The optimizeWidthOnRefresh flag, when enabled, allows
|
130
|
+
* automatic width calculation for components that support
|
131
|
+
* that feature.
|
132
|
+
**/
|
133
|
+
optimizeWidthOnRefresh: true,
|
134
|
+
|
135
|
+
/** The parent is the +_parent+ supplied to the constructor.
|
136
|
+
* This is a complete object reference to the parent's namespace.
|
137
|
+
**/
|
138
|
+
parent: null,
|
139
|
+
|
140
|
+
/** The parents is an array containing parent instances up to
|
141
|
+
* the root controller level. The root controller is almost
|
142
|
+
* always an instance of HApplication.
|
143
|
+
**/
|
144
|
+
parents: null,
|
145
|
+
|
146
|
+
/** The viewId is the unique ID (serial number) of this view.
|
147
|
+
* This means the view can be looked up globally based on its
|
148
|
+
* id by using the +HSystem.views+ array.
|
149
|
+
**/
|
150
|
+
viewId: null,
|
151
|
+
|
152
|
+
/** The appId is the unique ID (serial number) of the app process
|
153
|
+
* acting as the root controller of the view tree of which this
|
154
|
+
* view is a member.
|
155
|
+
* This means the app can be looked up globally based on this
|
156
|
+
* id by using the +HSystem.apps+ array.
|
157
|
+
**/
|
158
|
+
appId: null,
|
159
|
+
|
160
|
+
/** The app is the reference of the app process acting as
|
161
|
+
* the root controller of the view tree of which this view is a
|
162
|
+
* member.
|
163
|
+
* This is a complete object reference to the app's namespace.
|
164
|
+
**/
|
165
|
+
app: null,
|
166
|
+
|
167
|
+
/** The views array contains a list of subviews of this view
|
168
|
+
* by id. To access the object reference, use the +HSystem.views+
|
169
|
+
* array with the id.
|
170
|
+
**/
|
171
|
+
views: null,
|
172
|
+
|
173
|
+
/** The viewsZOrder array contains a list of subviews ordered by
|
174
|
+
* zIndex. To change the order, use the bringToFront,
|
175
|
+
* sendToBack, bringForwards, sendBackwards, bringToFrontOf and
|
176
|
+
* sentToBackOf methods.
|
177
|
+
**/
|
178
|
+
viewsZOrder: null,
|
179
|
+
|
180
|
+
/** The isHidden flog reflects the visibility of the view.
|
181
|
+
**/
|
182
|
+
isHidden: false,
|
183
|
+
|
184
|
+
/** The +HRect+ instance bound to +self+ using the +constructor+ or +setRect+.
|
185
|
+
**/
|
186
|
+
rect: null,
|
187
|
+
|
188
|
+
/** An reference to the options block given as the constructor
|
189
|
+
* parameter _options.
|
190
|
+
**/
|
191
|
+
options: null,
|
192
|
+
|
193
|
+
/** The viewDefaults is a HViewDefaults object that is extended
|
194
|
+
* in the constructor with the options block given. The format of
|
195
|
+
* it is an Object.
|
196
|
+
* It's only used when not extended via HControl, see HControl#controlDefaults.
|
197
|
+
**/
|
198
|
+
viewDefaults: HViewDefaults,
|
199
|
+
|
200
|
+
/** = Description
|
201
|
+
* Constructs the logic part of a HView.
|
202
|
+
* The view still needs to be drawn on screen. To do that, call draw after
|
203
|
+
* subcomponents of the view are initialized.
|
204
|
+
*
|
205
|
+
* = Parameters
|
206
|
+
* +_rect+:: An instance of +HRect+, defines the position and size of views.
|
207
|
+
* It can be also defined with an array, see below.
|
208
|
+
* +_parent+:: The parent instance this instance will be contained within.
|
209
|
+
* A valid parent can be another HView compatible instance,
|
210
|
+
* an HApplication instance, a HControl or a similar extended
|
211
|
+
* HView instance. The origin of the +_rect+ is the same as the
|
212
|
+
* parent's offset. For HApplication instances, the web browser's
|
213
|
+
* window's left top corner is the origin.
|
214
|
+
*
|
215
|
+
* == The +_rect+ dimensions as arrays
|
216
|
+
* Instead of an instance of +HRect+, dimensions can also be supplied as arrays.
|
217
|
+
* The array length must be either 4 or 6. If the length is 4, the dimensions are
|
218
|
+
* specified as follows: +[ x, y, width, height ]+. Note that this is different
|
219
|
+
* from the construction parameters of +HRect+ that takes the coordinates as two
|
220
|
+
* points, like: +( left, top, right, bottom )+.
|
221
|
+
* Arrays with 6 items are a bit more complex (and powerful) as they can specify
|
222
|
+
* the flexible offsets too.
|
223
|
+
*
|
224
|
+
* === The array indexes for a +_rect+ configured as an 4-item array:
|
225
|
+
* Always left/top aligned, all items must be specified.
|
226
|
+
* Index:: Description
|
227
|
+
* +0+:: The X-coordinate (measured from the parent's left edge)
|
228
|
+
* +1+:: The Y-coordinate (measured from the parent's top edge)
|
229
|
+
* +2+:: The width.
|
230
|
+
* +3+:: The height.
|
231
|
+
*
|
232
|
+
* === The array indexes a +_rect+ configured as an 6-item array:
|
233
|
+
* Can be any configuration of left/top/right/bottom alignment and supports
|
234
|
+
* flexible widths. At least 4 items must be specified.
|
235
|
+
* Index:: Description
|
236
|
+
* +0+:: The left-aligned X-coordinate or +null+ if the view is
|
237
|
+
* right-aligned and using a right-aligned X-coordinate at
|
238
|
+
* index +4+ as well as the width specified at index +2+.
|
239
|
+
* +1+:: The top-aligned Y-coordinate or +null+ if the view is
|
240
|
+
* bottom-aligned and using a right-aligned X-coordinate at
|
241
|
+
* index +5+ as well as the height specified at index +3+.
|
242
|
+
* +2+:: The width, if only one X-coordinate specifies the
|
243
|
+
* position (at indexes +0+ or +4+).
|
244
|
+
* If both X-coordinates (at indexes +0+ and +4+) are
|
245
|
+
* specified, the width can be specified with a +null+ for
|
246
|
+
* automatic (flexible) width. If the width is specified,
|
247
|
+
* it's used as the minimum width.
|
248
|
+
* +3+:: The height, if only one Y-coordinate specifies the
|
249
|
+
* position (at indexes +1+ or +5+).
|
250
|
+
* If both Y-coordinates (at indexes +1+ and +5+) are
|
251
|
+
* specified, the height can be specified with a +null+ for
|
252
|
+
* automatic (flexible) height. if the height is specified,
|
253
|
+
* it's used as the minimum height.
|
254
|
+
* +4+:: The right-aligned X-coordinate or +null+ if the view is
|
255
|
+
* left-aligned and using a left-aligned X-coordinate at
|
256
|
+
* index +0+ as well as the width specified at index +2+.
|
257
|
+
* +5+:: The bottom-aligned Y-coordinate or +null+ if the view is
|
258
|
+
* top-aligned and using a top-aligned X-coordinate at
|
259
|
+
* index +1+ as well as the height specified at index +3+.
|
260
|
+
* == Usage examples of +_rect+:
|
261
|
+
* Specified as two instances of +HPoint+,
|
262
|
+
* x: 23, y: 75, width: 200, height: 100:
|
263
|
+
* HRect.nu( HPoint.nu( 23, 75 ), HPoint.nu( 223, 175 ) )
|
264
|
+
*
|
265
|
+
* The same as above, but without +HPoint+ instances:
|
266
|
+
* HRect.nu( 23, 75, 223, 175 )
|
267
|
+
*
|
268
|
+
* The same as above, but with an array as the constructor
|
269
|
+
* parameter for +HRect+:
|
270
|
+
* HRect.nu( [ 23, 75, 223, 175 ] )
|
271
|
+
*
|
272
|
+
* The same as above, but with an array instead of a +HRect+ instance:
|
273
|
+
* [ 23, 75, 200, 100 ]
|
274
|
+
*
|
275
|
+
* The same as above, but with a 6-item array:
|
276
|
+
* [ 23, 75, 200, 100, null, null ]
|
277
|
+
*
|
278
|
+
* The same as above, but aligned to the right instead of left:
|
279
|
+
* [ null, 75, 200, 100, 23, null ]
|
280
|
+
*
|
281
|
+
* The same as above, but aligned to the right/bottom edges:
|
282
|
+
* [ null, null, 200, 100, 23, 75 ]
|
283
|
+
*
|
284
|
+
* The same as above, but aligned to the left/bottom edges:
|
285
|
+
* [ 23, null, 200, 100, null, 75 ]
|
286
|
+
*
|
287
|
+
* Flexible width (based on the parent's dimensions):
|
288
|
+
* [ 23, 75, null, 100, 23, null ]
|
289
|
+
*
|
290
|
+
* Flexible height (based on the parent's dimensions):
|
291
|
+
* [ 23, 75, 200, null, null, 75 ]
|
292
|
+
*
|
293
|
+
* Flexible width and height (based on the parent's dimensions):
|
294
|
+
* [ 23, 75, null, null, 23, 75 ]
|
295
|
+
*
|
296
|
+
* Flexible width and height, but limited to a minimum width
|
297
|
+
* of 200 and a minimum height of 100 (based on the parent's dimensions):
|
298
|
+
* [ 23, 75, 200, 100, 23, 75 ]
|
299
|
+
*
|
300
|
+
**/
|
301
|
+
constructor: function(_rect, _parent, _options) {
|
302
|
+
|
303
|
+
if( !_options ){
|
304
|
+
_options = {};
|
305
|
+
}
|
306
|
+
if(!this.isinherited){
|
307
|
+
_options = (this.viewDefaults.extend(_options)).nu(this);
|
308
|
+
}
|
309
|
+
|
310
|
+
this.options = _options;
|
311
|
+
this.label = _options.label;
|
312
|
+
|
313
|
+
// Moved these to the top to ensure safe theming operation
|
314
|
+
if( _options.theme ){
|
315
|
+
this.theme = _options.theme;
|
316
|
+
this.preserveTheme = true;
|
317
|
+
}
|
318
|
+
else if(!this.theme){
|
319
|
+
this.theme = HThemeManager.currentTheme;
|
320
|
+
this.preserveTheme = false;
|
321
|
+
}
|
322
|
+
else {
|
323
|
+
this.preserveTheme = true;
|
324
|
+
}
|
325
|
+
|
326
|
+
if(_options.visible === false) {
|
327
|
+
this.isHidden = true;
|
328
|
+
}
|
329
|
+
|
330
|
+
// adds the parentClass as a "super" object
|
331
|
+
this.parent = _parent;
|
332
|
+
|
333
|
+
this.viewId = this.parent.addView(this);
|
334
|
+
// the parent addView method adds this.parents
|
335
|
+
|
336
|
+
this.appId = this.parent.appId;
|
337
|
+
this.app = HSystem.apps[this.appId];
|
338
|
+
|
339
|
+
// subview-ids, index of HView-derived objects that are found in HSystem.views[viewId]
|
340
|
+
this.views = [];
|
341
|
+
|
342
|
+
// Subviews in Z order.
|
343
|
+
this.viewsZOrder = [];
|
344
|
+
|
345
|
+
// Keep the view (and its subviews) hidden until its drawn.
|
346
|
+
this._createElement();
|
347
|
+
|
348
|
+
// Set the geometry
|
349
|
+
this.setRect(_rect);
|
350
|
+
|
351
|
+
this._cachedLeft = _rect.left;
|
352
|
+
this._cachedTop = _rect.top;
|
353
|
+
|
354
|
+
// Additional DOM element bindings are saved into this array so they can be
|
355
|
+
// deleted from the element manager when the view gets destroyed.
|
356
|
+
this._domElementBindings = [];
|
357
|
+
|
358
|
+
if(!this.isinherited) {
|
359
|
+
this.draw();
|
360
|
+
}
|
361
|
+
},
|
362
|
+
|
363
|
+
/** = Description
|
364
|
+
* When the +_flag+ is true, the view will be aligned to the right.
|
365
|
+
* The +_px+ offset defines how many pixels from the parent's right
|
366
|
+
* edge the right edge of this view will be. If both setFlexRight
|
367
|
+
* and setFlexLeft are set, the width is flexible.
|
368
|
+
* Use the constructor or setRect instead of calling this method
|
369
|
+
* directly.
|
370
|
+
*
|
371
|
+
* = Parameters
|
372
|
+
* +_flag+:: Boolean flag (true/false). Enables
|
373
|
+
* right-alignment when true.
|
374
|
+
* +_px+:: The amount of pixels to offset from the right
|
375
|
+
* edge of the parent's right edge.
|
376
|
+
*
|
377
|
+
* = Returns
|
378
|
+
* +self+
|
379
|
+
**/
|
380
|
+
setFlexRight: function(_flag,_px){
|
381
|
+
if(_flag===undefined){_flag=true;}
|
382
|
+
this.flexRight = _flag;
|
383
|
+
if(_px===undefined){_px=0;}
|
384
|
+
this.flexRightOffset = _px;
|
385
|
+
return this;
|
386
|
+
},
|
387
|
+
|
388
|
+
/** = Description
|
389
|
+
* When the +_flag+ is true, the view will be aligned to the left (default).
|
390
|
+
* The +_px+ offset defines how many pixels from the parent's left
|
391
|
+
* edge the left edge of this view will be. If both setFlexLeft
|
392
|
+
* and setFlexRight are set, the width is flexible.
|
393
|
+
* Use the constructor or setRect instead of calling this method
|
394
|
+
* directly.
|
395
|
+
*
|
396
|
+
* = Parameters
|
397
|
+
* +_flag+:: Boolean flag (true/false). Enables
|
398
|
+
* left-alignment when true.
|
399
|
+
* +_px+:: The amount of pixels to offset from the left
|
400
|
+
* edge of the parent's left edge.
|
401
|
+
*
|
402
|
+
* = Returns
|
403
|
+
* +self+
|
404
|
+
**/
|
405
|
+
setFlexLeft: function(_flag,_px){
|
406
|
+
if(_flag===undefined){_flag=true;}
|
407
|
+
this.flexLeft = _flag;
|
408
|
+
if((_px || _px === 0) && this.rect){
|
409
|
+
this.rect.setLeft(_px);
|
410
|
+
}
|
411
|
+
return this;
|
412
|
+
},
|
413
|
+
|
414
|
+
/** = Description
|
415
|
+
* When the +_flag+ is true, the view will be aligned to the top (default).
|
416
|
+
* The +_px+ offset defines how many pixels from the parent's top
|
417
|
+
* edge the top edge of this view will be. If both setFlexTop
|
418
|
+
* and setFlexBottom are set, the height is flexible.
|
419
|
+
* Use the constructor or setRect instead of calling this method
|
420
|
+
* directly.
|
421
|
+
*
|
422
|
+
* = Parameters
|
423
|
+
* +_flag+:: Boolean flag (true/false). Enables
|
424
|
+
* top-alignment when true.
|
425
|
+
* +_px+:: The amount of pixels to offset from the top
|
426
|
+
* edge of the parent's top edge.
|
427
|
+
*
|
428
|
+
* = Returns
|
429
|
+
* +self+
|
430
|
+
**/
|
431
|
+
setFlexTop: function(_flag,_px){
|
432
|
+
if(_flag===undefined){_flag=true;}
|
433
|
+
this.flexTop = _flag;
|
434
|
+
if((_px || _px === 0) && this.rect){
|
435
|
+
this.rect.setTop(_px);
|
436
|
+
}
|
437
|
+
return this;
|
438
|
+
},
|
439
|
+
|
440
|
+
/** = Description
|
441
|
+
* When the +_flag+ is true, the view will be aligned to the bottom.
|
442
|
+
* The +_px+ offset defines how many pixels from the parent's bottom
|
443
|
+
* edge the bottom edge of this view will be. If both setFlexBottom
|
444
|
+
* and setFlexTop are set, the height is flexible.
|
445
|
+
* Use the constructor or setRect instead of calling this method
|
446
|
+
* directly.
|
447
|
+
*
|
448
|
+
* = Parameters
|
449
|
+
* +_flag+:: Boolean flag (true/false). Enables
|
450
|
+
* bottom-alignment when true.
|
451
|
+
* +_px+:: The amount of pixels to offset from the bottom
|
452
|
+
* edge of the parent's bottom edge.
|
453
|
+
*
|
454
|
+
* = Returns
|
455
|
+
* +self+
|
456
|
+
**/
|
457
|
+
setFlexBottom: function(_flag,_px){
|
458
|
+
if(_flag===undefined){_flag=true;}
|
459
|
+
this.flexBottom = _flag;
|
460
|
+
if(_px===undefined){_px=0;}
|
461
|
+
this.flexBottomOffset = _px;
|
462
|
+
return this;
|
463
|
+
},
|
464
|
+
|
465
|
+
/** = Description
|
466
|
+
* The +_flag+ enables or disables the absolute positioning mode.
|
467
|
+
* (It's enabled by default). If absolute positioning mode is
|
468
|
+
* off, the coordinate system has little or no effect.
|
469
|
+
*
|
470
|
+
* = Parameters
|
471
|
+
* +_flag+:: Boolean flag (true/false). Enables
|
472
|
+
* absolute positioning when true.
|
473
|
+
* Enables relative positioning when false.
|
474
|
+
*
|
475
|
+
* = Returns
|
476
|
+
* +self+
|
477
|
+
**/
|
478
|
+
setAbsolute: function(_flag){
|
479
|
+
if(_flag===undefined){_flag=true;}
|
480
|
+
this.isAbsolute = _flag;
|
481
|
+
return this;
|
482
|
+
},
|
483
|
+
|
484
|
+
/** = Description
|
485
|
+
* The +_flag+ enables or disables the relative positioning mode.
|
486
|
+
* (It's disabled by default). If relative positioning mode is
|
487
|
+
* on, the coordinate system has little or no effect.
|
488
|
+
*
|
489
|
+
* = Parameters
|
490
|
+
* +_flag+:: Boolean flag (true/false). Enables
|
491
|
+
* absolute relative when true.
|
492
|
+
* Enables absolute positioning when false.
|
493
|
+
*
|
494
|
+
* = Returns
|
495
|
+
* +self+
|
496
|
+
**/
|
497
|
+
setRelative: function(_flag){
|
498
|
+
if(_flag===undefined){_flag=true;}
|
499
|
+
this.isAbsolute = (!_flag);
|
500
|
+
return this;
|
501
|
+
},
|
502
|
+
|
503
|
+
/** = Description
|
504
|
+
* Used by html theme templates to get the theme-specific full image path.
|
505
|
+
*
|
506
|
+
* = Returns
|
507
|
+
* The full path of the theme-specific gfx path as a string.
|
508
|
+
**/
|
509
|
+
getThemeGfxPath: function() {
|
510
|
+
var _themeName;
|
511
|
+
if( this.preserveTheme ){
|
512
|
+
_themeName = this.theme;
|
513
|
+
} else {
|
514
|
+
_themeName = HThemeManager.currentTheme;
|
515
|
+
}
|
516
|
+
return HThemeManager._componentGfxPath( _themeName, this.componentName, this.themePath );
|
517
|
+
},
|
518
|
+
|
519
|
+
/** = Description
|
520
|
+
* Used by html theme templates to get the theme-specific full path
|
521
|
+
* of the _fileName given.
|
522
|
+
*
|
523
|
+
* = Returns
|
524
|
+
* The full path of the file.
|
525
|
+
**/
|
526
|
+
getThemeGfxFile: function( _fileName ) {
|
527
|
+
if( this.preserveTheme ){
|
528
|
+
_themeName = this.theme;
|
529
|
+
} else {
|
530
|
+
_themeName = HThemeManager.currentTheme;
|
531
|
+
}
|
532
|
+
return HThemeManager._componentGfxFile( _themeName, this.componentName, this.themePath, _fileName );
|
533
|
+
},
|
534
|
+
|
535
|
+
/** --
|
536
|
+
* = Description
|
537
|
+
* The _makeElem method does the ELEM.make call to create
|
538
|
+
* the <div> element of the component. It assigns the elemId.
|
539
|
+
* It's a separate method to ease creating component that require
|
540
|
+
* other element types.
|
541
|
+
* ++
|
542
|
+
**/
|
543
|
+
_makeElem: function(_parentElemId){
|
544
|
+
this.elemId = ELEM.make(_parentElemId,'div');
|
545
|
+
},
|
546
|
+
|
547
|
+
/** --
|
548
|
+
* = Description
|
549
|
+
* The _setCSS method does the initial styling of the element.
|
550
|
+
* It's a separate method to ease creating component that require
|
551
|
+
* other initial styles.
|
552
|
+
* ++
|
553
|
+
**/
|
554
|
+
_setCSS: function(_additional){
|
555
|
+
var _cssStyle = 'display:none;overflow:hidden;visibility:hidden;';
|
556
|
+
if(this.isAbsolute){
|
557
|
+
_cssStyle += 'position:absolute;';
|
558
|
+
} else {
|
559
|
+
_cssStyle += 'position:relative;';
|
560
|
+
}
|
561
|
+
_cssStyle += _additional;
|
562
|
+
ELEM.setCSS(this.elemId,_cssStyle);
|
563
|
+
},
|
564
|
+
|
565
|
+
/** --
|
566
|
+
* = Description
|
567
|
+
* The _getParentElemId method returns the ELEM ID of the parent.
|
568
|
+
* ++
|
569
|
+
**/
|
570
|
+
_getParentElemId: function(){
|
571
|
+
var _parentElemId;
|
572
|
+
// if the parent does not have an element:
|
573
|
+
if(this.parent.elemId === undefined) {
|
574
|
+
_parentElemId = 0;
|
575
|
+
}
|
576
|
+
// if a subview element is defined in the template, use it:
|
577
|
+
else if(this.parent.markupElemIds&&this.parent.markupElemIds['subview']){
|
578
|
+
_parentElemId = this.parent.markupElemIds['subview'];
|
579
|
+
}
|
580
|
+
// otherwise, use main elemId
|
581
|
+
else {
|
582
|
+
_parentElemId = this.parent.elemId;
|
583
|
+
}
|
584
|
+
return _parentElemId;
|
585
|
+
},
|
586
|
+
|
587
|
+
/** --
|
588
|
+
* = Description
|
589
|
+
* The _createElement method calls the methods required to initialize the
|
590
|
+
* main DOM element of the view.
|
591
|
+
* ++
|
592
|
+
**/
|
593
|
+
_createElement: function() {
|
594
|
+
if(!this.elemId) {
|
595
|
+
|
596
|
+
this._makeElem(this._getParentElemId());
|
597
|
+
this._setCSS('');
|
598
|
+
|
599
|
+
// Theme name == CSS class name
|
600
|
+
if(this.preserveTheme){
|
601
|
+
ELEM.addClassName( this.elemId, this.theme );
|
602
|
+
}
|
603
|
+
else {
|
604
|
+
ELEM.addClassName( this.elemId, HThemeManager.currentTheme );
|
605
|
+
}
|
606
|
+
}
|
607
|
+
},
|
608
|
+
|
609
|
+
/** = Description
|
610
|
+
* The +drawRect+ method refreshes the dimensions of the view.
|
611
|
+
* It needs to be called to affect changes in the rect.
|
612
|
+
* It enables the drawn flag.
|
613
|
+
*
|
614
|
+
* = Returns
|
615
|
+
* +self+
|
616
|
+
*
|
617
|
+
**/
|
618
|
+
drawRect: function() {
|
619
|
+
if (this.parent && this.rect.isValid) {
|
620
|
+
var _this = this,
|
621
|
+
_elemId = _this.elemId,
|
622
|
+
_styl = ELEM.setStyle,
|
623
|
+
_rect = _this.rect;
|
624
|
+
|
625
|
+
_styl( _elemId, 'left', _this.flexLeft?(_rect.left+'px'):'auto', true);
|
626
|
+
_styl( _elemId, 'top', _this.flexTop?(_rect.top+'px'):'auto', true);
|
627
|
+
_styl( _elemId, 'right', _this.flexRight?(_this.flexRightOffset+'px'):'auto', true);
|
628
|
+
_styl( _elemId, 'bottom', _this.flexBottom?(_this.flexBottomOffset+'px'):'auto', true);
|
629
|
+
_styl( _elemId, 'width', (_this.flexLeft&&_this.flexRight)?'auto':(_rect.width+'px'), true);
|
630
|
+
_styl( _elemId, 'height', (_this.flexTop&&_this.flexBottom)?'auto':(_rect.height+'px'), true);
|
631
|
+
|
632
|
+
// Show the rectangle once it gets created, unless visibility was set to
|
633
|
+
// hidden in the constructor.
|
634
|
+
if(_this.isHidden === undefined || _this.isHidden === false) {
|
635
|
+
_styl( _elemId, 'visibility', 'inherit', true);
|
636
|
+
}
|
637
|
+
|
638
|
+
_styl( _elemId, 'display', _this.displayMode, true);
|
639
|
+
|
640
|
+
_this._updateZIndex();
|
641
|
+
|
642
|
+
if (_this._cachedLeft !== _rect.left || _this._cachedTop !== _rect.top) {
|
643
|
+
_this.invalidatePositionCache();
|
644
|
+
_this._cachedLeft = _rect.left;
|
645
|
+
_this._cachedTop = _rect.top;
|
646
|
+
}
|
647
|
+
|
648
|
+
_this.drawn = true;
|
649
|
+
}
|
650
|
+
return this;
|
651
|
+
},
|
652
|
+
|
653
|
+
/** --
|
654
|
+
* This method updates the z-index property of the children of self.
|
655
|
+
* It's essentially a wrapper for HSystem.updateZIndexOfChildren passed
|
656
|
+
* with the viewId of self.
|
657
|
+
* ++
|
658
|
+
**/
|
659
|
+
_updateZIndex: function() {
|
660
|
+
HSystem.updateZIndexOfChildren(this.viewId);
|
661
|
+
},
|
662
|
+
|
663
|
+
/** --
|
664
|
+
* This method updates the z-index property of the siblings of self.
|
665
|
+
* It's essentially a wrapper for HSystem.updateZIndexOfChildren passed
|
666
|
+
* with the parent's viewId of self.
|
667
|
+
* ++
|
668
|
+
**/
|
669
|
+
_updateZIndexAllSiblings: function() {
|
670
|
+
HSystem.updateZIndexOfChildren(this.parent.viewId);
|
671
|
+
},
|
672
|
+
|
673
|
+
/** = Description
|
674
|
+
* The higher level draw wrapper for drawRect, drawMarkup and drawSubviews.
|
675
|
+
* Finally calls refresh.
|
676
|
+
*
|
677
|
+
* = Returns
|
678
|
+
* +self+
|
679
|
+
*
|
680
|
+
**/
|
681
|
+
draw: function() {
|
682
|
+
var _isDrawn = this.drawn;
|
683
|
+
this.drawRect();
|
684
|
+
if(!_isDrawn){
|
685
|
+
this.firstDraw();
|
686
|
+
if(this['componentName']!==undefined){
|
687
|
+
this.drawMarkup();
|
688
|
+
}
|
689
|
+
this.drawSubviews();
|
690
|
+
if(this.options.style){
|
691
|
+
var
|
692
|
+
_style = this.options.style,
|
693
|
+
_styleItem, _styleKey, _styleValue, i = 0;
|
694
|
+
for(;i<_style.length;i++){
|
695
|
+
_styleItem = _style[i];
|
696
|
+
_styleKey = _styleItem[0];
|
697
|
+
_styleValue = _styleItem[1];
|
698
|
+
this.setStyle(_styleKey,_styleValue);
|
699
|
+
}
|
700
|
+
}
|
701
|
+
if(this.options.html){
|
702
|
+
this.setHTML(this.options.html);
|
703
|
+
}
|
704
|
+
if(!this.isHidden){
|
705
|
+
this.show();
|
706
|
+
}
|
707
|
+
}
|
708
|
+
this.refresh();
|
709
|
+
return this;
|
710
|
+
},
|
711
|
+
|
712
|
+
/** = Description
|
713
|
+
* Called once, before the layout of the view is initially drawn.
|
714
|
+
* Doesn't do anything by itself, but provides an extension point.
|
715
|
+
*
|
716
|
+
**/
|
717
|
+
firstDraw: function(){
|
718
|
+
},
|
719
|
+
|
720
|
+
/** = Description
|
721
|
+
* Called once, when the layout of the view is initially drawn.
|
722
|
+
* Doesn't do anything by itself, but provides an extension point for making
|
723
|
+
* subviews.
|
724
|
+
*
|
725
|
+
**/
|
726
|
+
drawSubviews: function(){
|
727
|
+
},
|
728
|
+
|
729
|
+
/** --
|
730
|
+
* Loads the markup from theme manager. If this.preserveTheme is set to true,
|
731
|
+
* the this.theme is used for loading the markup. Otherwise the currently
|
732
|
+
* active theme is used.
|
733
|
+
* ++
|
734
|
+
**/
|
735
|
+
_loadMarkup: function() {
|
736
|
+
var _themeName, _markup;
|
737
|
+
if (this.preserveTheme) {
|
738
|
+
_themeName = this.theme;
|
739
|
+
}
|
740
|
+
else {
|
741
|
+
_themeName = HThemeManager.currentTheme;
|
742
|
+
}
|
743
|
+
_markup = HThemeManager.getMarkup( _themeName, this.componentName, this.themePath );
|
744
|
+
if(_markup === false){
|
745
|
+
console.log('Warning: Markup template for "'+this.componentName+'" using theme "'+_themeName+'" not loaded.');
|
746
|
+
}
|
747
|
+
this.markup = _markup;
|
748
|
+
return (_markup !== false);
|
749
|
+
},
|
750
|
+
|
751
|
+
/** = Description
|
752
|
+
* Replaces the contents of the view's DOM element with html from the theme specific html file.
|
753
|
+
*
|
754
|
+
* = Returns
|
755
|
+
* +self+
|
756
|
+
**/
|
757
|
+
markupElemNames: ['bg', 'label', 'state', 'control', 'value', 'subview'],
|
758
|
+
drawMarkup: function() {
|
759
|
+
ELEM.setStyle(this.elemId, 'display', 'none', true);
|
760
|
+
|
761
|
+
// continue processing from here on:
|
762
|
+
var _markupStatus = this._loadMarkup();
|
763
|
+
|
764
|
+
this.bindMarkupVariables();
|
765
|
+
ELEM.setHTML(this.elemId, this.markup);
|
766
|
+
|
767
|
+
this.markupElemIds = {};
|
768
|
+
for(var i=0; i < this.markupElemNames.length; i++ ) {
|
769
|
+
var _partName = this.markupElemNames[ i ],
|
770
|
+
_elemName = _partName + this.elemId,
|
771
|
+
_htmlIdMatch = ' id="' + _elemName + '"';
|
772
|
+
if( this.markup.indexOf( _htmlIdMatch ) !== -1 ) {
|
773
|
+
this.markupElemIds[ _partName ] = this.bindDomElement( _elemName );
|
774
|
+
}
|
775
|
+
}
|
776
|
+
|
777
|
+
ELEM.setStyle(this.elemId, 'display', this.displayMode );
|
778
|
+
return this;
|
779
|
+
},
|
780
|
+
|
781
|
+
/** = Description
|
782
|
+
* Replaces the contents of the view's DOM element with custom html.
|
783
|
+
*
|
784
|
+
* = Parameters
|
785
|
+
* +_html+:: The HTML (string-formatted) to replace the content with.
|
786
|
+
*
|
787
|
+
* = Returns
|
788
|
+
* +self+
|
789
|
+
*
|
790
|
+
**/
|
791
|
+
setHTML: function( _html ) {
|
792
|
+
ELEM.setHTML( this.elemId, _html );
|
793
|
+
return this;
|
794
|
+
},
|
795
|
+
|
796
|
+
/** = Description
|
797
|
+
* Wrapper for setHTML, sets escaped html, if tags and such are present.
|
798
|
+
*
|
799
|
+
* = Parameters
|
800
|
+
* +_text+:: The text to set. If it contains any html, it's escaped.
|
801
|
+
*
|
802
|
+
* = Returns
|
803
|
+
* +self+
|
804
|
+
**/
|
805
|
+
setText: function( _text ) {
|
806
|
+
return this.setHTML( this.escapeHTML( _text ) );
|
807
|
+
},
|
808
|
+
|
809
|
+
/** = Description
|
810
|
+
* Method to escape HTML from text.
|
811
|
+
*
|
812
|
+
* Converts < to < and > to > and & to &
|
813
|
+
*
|
814
|
+
* = Parameters
|
815
|
+
* +_html+:: The html to escape.
|
816
|
+
*
|
817
|
+
* = Returns
|
818
|
+
* A string with the html escaped.
|
819
|
+
**/
|
820
|
+
escapeHTML: function( _html ) {
|
821
|
+
return _html.replace(/&/gmi, '&').replace(/>/gmi, '>').replace(/</gmi, '<');
|
822
|
+
},
|
823
|
+
|
824
|
+
/** = Description
|
825
|
+
*
|
826
|
+
* This method should be extended in order to redraw only specific parts. The
|
827
|
+
* base implementation calls optimizeWidth when optimizeWidthOnRefresh is set
|
828
|
+
* to true.
|
829
|
+
*
|
830
|
+
* = Returns
|
831
|
+
* +self+
|
832
|
+
*
|
833
|
+
**/
|
834
|
+
refresh: function() {
|
835
|
+
if(this.drawn) {
|
836
|
+
// this.drawn is checked here so the rectangle doesn't get drawn by the
|
837
|
+
// constructor when setRect() is initially called.
|
838
|
+
this.drawRect();
|
839
|
+
}
|
840
|
+
if(this.optimizeWidthOnRefresh) {
|
841
|
+
this.optimizeWidth();
|
842
|
+
}
|
843
|
+
if(this.refreshOnLabelChange){
|
844
|
+
this.refreshLabel();
|
845
|
+
}
|
846
|
+
return this;
|
847
|
+
},
|
848
|
+
|
849
|
+
/** Gets the size of the parent. If the parent is the document body, uses the browser window size.
|
850
|
+
**/
|
851
|
+
parentSize: function(){
|
852
|
+
if(this.parent.elemId === 0){
|
853
|
+
var _winSize = ELEM.windowSize();
|
854
|
+
return [ _winSize[0], _winSize[1] ];
|
855
|
+
}
|
856
|
+
else{
|
857
|
+
var _rect = this.parent.rect;
|
858
|
+
return [ _rect.width, _rect.height ];
|
859
|
+
}
|
860
|
+
},
|
861
|
+
|
862
|
+
/** Returns the maximum rect using the #parentSize.
|
863
|
+
**/
|
864
|
+
maxRect: function(){
|
865
|
+
var _parentSize = this.parentSize();
|
866
|
+
return [ 0, 0, _parentSize[0], _parentSize[1] ];
|
867
|
+
},
|
868
|
+
|
869
|
+
parentSize: function(){
|
870
|
+
var _parentElemId = this.parent.elemId;
|
871
|
+
if ( _parentElemId === 0 ) {
|
872
|
+
return ELEM.windowSize();
|
873
|
+
}
|
874
|
+
else {
|
875
|
+
ELEM.flushLoop();
|
876
|
+
return ELEM.getSize( _parentElemId );
|
877
|
+
}
|
878
|
+
},
|
879
|
+
|
880
|
+
minWidth: 0,
|
881
|
+
setMinWidth: function(_minWidth){
|
882
|
+
this.minWidth = _minWidth;
|
883
|
+
ELEM.setStyle( this.elemId, 'min-width', this.minWidth+'px', true);
|
884
|
+
},
|
885
|
+
minHeight: 0,
|
886
|
+
setMinHeight: function(_minHeight){
|
887
|
+
this.minHeight = _minHeight;
|
888
|
+
ELEM.setStyle( this.elemId, 'min-height', this.minHeight+'px', true);
|
889
|
+
},
|
890
|
+
|
891
|
+
/** = Description
|
892
|
+
* Replaces the rect of the component with a new HRect instance and
|
893
|
+
* then refreshes the display.
|
894
|
+
*
|
895
|
+
* = Parameters
|
896
|
+
* +_rect+:: The new HRect instance to replace the old rect instance with.
|
897
|
+
* +_rect+:: Array format, see HView#constructor for further details.
|
898
|
+
*
|
899
|
+
* = Returns
|
900
|
+
* +self+
|
901
|
+
*
|
902
|
+
**/
|
903
|
+
setRect: function(_rect) {
|
904
|
+
if (this.rect) {
|
905
|
+
this.rect.release(this);
|
906
|
+
}
|
907
|
+
if(typeof _rect === 'string'){
|
908
|
+
_rect = this[_rect]();
|
909
|
+
}
|
910
|
+
if(_rect instanceof Array){
|
911
|
+
var _arrLen = _rect.length,
|
912
|
+
_throwPrefix = 'HView.setRect: If the HRect instance is replaced by an array, ';
|
913
|
+
if((_arrLen === 4) || (_arrLen === 6)){
|
914
|
+
var
|
915
|
+
_leftOffset = _rect[0],
|
916
|
+
_topOffset = _rect[1],
|
917
|
+
_width = _rect[2],
|
918
|
+
_height = _rect[3],
|
919
|
+
_rightOffset = ((_arrLen === 6)?_rect[4]:null),
|
920
|
+
_bottomOffset = ((_arrLen === 6)?_rect[5]:null),
|
921
|
+
_validLeftOffset = (typeof _leftOffset === 'number'),
|
922
|
+
_validTopOffset = (typeof _topOffset === 'number'),
|
923
|
+
_validRightOffset = (typeof _rightOffset === 'number'),
|
924
|
+
_validBottomOffset = (typeof _bottomOffset === 'number'),
|
925
|
+
_validWidth = (typeof _width === 'number'),
|
926
|
+
_validHeight = (typeof _height === 'number'),
|
927
|
+
_right,
|
928
|
+
_bottom;
|
929
|
+
|
930
|
+
if(_arrLen === 6){
|
931
|
+
var
|
932
|
+
_parentSize = this.parentSize(),
|
933
|
+
_parentWidth = _parentSize[0],
|
934
|
+
_parentHeight = _parentSize[1];
|
935
|
+
}
|
936
|
+
|
937
|
+
if( (!_validLeftOffset && !_validRightOffset) ||
|
938
|
+
(!_validTopOffset && !_validBottomOffset) ){
|
939
|
+
console.log(_throwPrefix + '(left or top) and (top or bottom) must be specified.');
|
940
|
+
}
|
941
|
+
else if( (!_validWidth && !(_validLeftOffset && _validRightOffset)) ||
|
942
|
+
(!_validHeight && !(_validTopOffset && _validBottomOffset)) ){
|
943
|
+
console.log(_throwPrefix + 'the (height or width) must be specified unless both (left and top) or (top and bottom) are specified.');
|
944
|
+
}
|
945
|
+
|
946
|
+
this.setFlexLeft(_validLeftOffset,_leftOffset);
|
947
|
+
this.setFlexTop(_validTopOffset,_topOffset);
|
948
|
+
this.setFlexRight(_validRightOffset,_rightOffset);
|
949
|
+
this.setFlexBottom(_validBottomOffset,_bottomOffset);
|
950
|
+
|
951
|
+
if(_validLeftOffset && _validWidth && !_validRightOffset){
|
952
|
+
_right = _leftOffset + _width;
|
953
|
+
}
|
954
|
+
else if(!_validLeftOffset && _validWidth && _validRightOffset){
|
955
|
+
_right = _parentWidth-_validRightOffset;
|
956
|
+
_leftOffset = _right-_width;
|
957
|
+
}
|
958
|
+
else if(_validLeftOffset && _validRightOffset){
|
959
|
+
_right = _parentWidth - _rightOffset;
|
960
|
+
_validWidth && this.setMinWidth( _width );
|
961
|
+
_right = _parentWidth - _rightOffset;
|
962
|
+
}
|
963
|
+
|
964
|
+
if(_validTopOffset && _validHeight && !_validBottomOffset){
|
965
|
+
_bottom = _topOffset + _height;
|
966
|
+
}
|
967
|
+
else if(!_validTopOffset && _validHeight && _validBottomOffset){
|
968
|
+
_bottom = _parentHeight-_validBottomOffset;
|
969
|
+
_topOffset = _bottom-_height;
|
970
|
+
}
|
971
|
+
else if(_validTopOffset && _validBottomOffset){
|
972
|
+
_bottom = _parentHeight - _bottomOffset;
|
973
|
+
_validHeight && this.setMinHeight( _height );
|
974
|
+
_bottom = _parentHeight - _bottomOffset;
|
975
|
+
}
|
976
|
+
|
977
|
+
this.rect = HRect.nu(_leftOffset,_topOffset,_right,_bottom);
|
978
|
+
}
|
979
|
+
else {
|
980
|
+
console.log(_throwPrefix + 'the length has to be either 4 or 6.');
|
981
|
+
}
|
982
|
+
}
|
983
|
+
else {
|
984
|
+
this.rect = _rect;
|
985
|
+
}
|
986
|
+
this.rect.bind(this);
|
987
|
+
this.refresh();
|
988
|
+
return this;
|
989
|
+
},
|
990
|
+
|
991
|
+
/** = Description
|
992
|
+
* Sets any arbitary style of the main DOM element of the component.
|
993
|
+
* Utilizes Element Manager's drawing queue/cache to perform the action.
|
994
|
+
*
|
995
|
+
* = Parameters
|
996
|
+
* +_name+:: The style name (css syntax, eg. 'background-color')
|
997
|
+
* +_value+:: The style value (css syntax, eg. 'rgb(255,0,0)')
|
998
|
+
* +_cacheOverride+:: Cache override flag.
|
999
|
+
*
|
1000
|
+
* = Returns
|
1001
|
+
* +self+
|
1002
|
+
*
|
1003
|
+
**/
|
1004
|
+
setStyle: function(_name, _value, _cacheOverride) {
|
1005
|
+
if (this.elemId) {
|
1006
|
+
ELEM.setStyle(this.elemId, _name, _value, _cacheOverride);
|
1007
|
+
}
|
1008
|
+
return this;
|
1009
|
+
},
|
1010
|
+
|
1011
|
+
/** = Description
|
1012
|
+
* Returns a style of the main DOM element of the component.
|
1013
|
+
* Utilizes +ELEM+ cache to perform the action.
|
1014
|
+
*
|
1015
|
+
* = Parameters
|
1016
|
+
* +_name+:: The style name (css syntax, eg. 'background-color')
|
1017
|
+
*
|
1018
|
+
* = Returns
|
1019
|
+
* The style property value (css syntax, eg. 'rgb(255,0,0)')
|
1020
|
+
*
|
1021
|
+
**/
|
1022
|
+
style: function(_name) {
|
1023
|
+
if (this.elemId) {
|
1024
|
+
return ELEM.getStyle(this.elemId, _name);
|
1025
|
+
}
|
1026
|
+
return '';
|
1027
|
+
},
|
1028
|
+
|
1029
|
+
/** = Description
|
1030
|
+
* Sets a style for a specified markup element that has been bound to this
|
1031
|
+
* view.
|
1032
|
+
*
|
1033
|
+
* = Parameters
|
1034
|
+
* +_partName+:: The identifier of the markup element.
|
1035
|
+
* +_name+:: The style name
|
1036
|
+
* +_value+:: The style value
|
1037
|
+
*
|
1038
|
+
* = Returns
|
1039
|
+
* +self+
|
1040
|
+
*
|
1041
|
+
**/
|
1042
|
+
setStyleOfPart: function(_partName, _name, _value, _cacheOverride) {
|
1043
|
+
if (!this['markupElemIds']){
|
1044
|
+
console.log('Warning, setStyleOfPart: no markupElemIds');
|
1045
|
+
}
|
1046
|
+
else if (!this.markupElemIds[_partName]) {
|
1047
|
+
console.log('Warning, setStyleOfPart: partName "'+_partName+'" does not exist for viewId '+this.viewId+'.');
|
1048
|
+
}
|
1049
|
+
else {
|
1050
|
+
ELEM.setStyle(this.markupElemIds[_partName], _name, _value, _cacheOverride);
|
1051
|
+
}
|
1052
|
+
return this;
|
1053
|
+
},
|
1054
|
+
|
1055
|
+
/** = Description
|
1056
|
+
* Returns a style of a specified markup element that has been bound to this
|
1057
|
+
* view.
|
1058
|
+
*
|
1059
|
+
* = Parameters
|
1060
|
+
* +_partName+:: The identifier of the markup element.
|
1061
|
+
* +_name+:: The style name
|
1062
|
+
*
|
1063
|
+
* = Returns
|
1064
|
+
* The style of a specified markup element.
|
1065
|
+
*
|
1066
|
+
**/
|
1067
|
+
styleOfPart: function(_partName, _name) {
|
1068
|
+
if (!this.markupElemIds[_partName]) {
|
1069
|
+
console.log('Warning, styleOfPart: partName "'+_partName+'" does not exist for viewId '+this.viewId+'.');
|
1070
|
+
return '';
|
1071
|
+
}
|
1072
|
+
return ELEM.getStyle(this.markupElemIds[_partName], _name);
|
1073
|
+
},
|
1074
|
+
|
1075
|
+
/** = Description
|
1076
|
+
* Sets a style of a specified markup element that has been bound to this
|
1077
|
+
* view.
|
1078
|
+
*
|
1079
|
+
* = Parameters
|
1080
|
+
* +_partName+:: The identifier of the markup element.
|
1081
|
+
* +_value+:: Value for markup element.
|
1082
|
+
*
|
1083
|
+
* = Returns
|
1084
|
+
* +self+
|
1085
|
+
*
|
1086
|
+
**/
|
1087
|
+
setMarkupOfPart: function( _partName, _value ) {
|
1088
|
+
if (!this.markupElemIds[_partName]) {
|
1089
|
+
console.log('Warning, setMarkupOfPart: partName "'+_partName+'" does not exist for viewId '+this.viewId+'.');
|
1090
|
+
}
|
1091
|
+
else {
|
1092
|
+
ELEM.setHTML( this.markupElemIds[_partName], _value );
|
1093
|
+
}
|
1094
|
+
return this;
|
1095
|
+
},
|
1096
|
+
|
1097
|
+
/** = Description
|
1098
|
+
* Returns a style of a specified markup element that has been bound to this
|
1099
|
+
* view.
|
1100
|
+
*
|
1101
|
+
* = Parameters
|
1102
|
+
* +_partName+:: The identifier of the markup element.
|
1103
|
+
*
|
1104
|
+
* = Returns
|
1105
|
+
* The style of a specified markup element.
|
1106
|
+
*
|
1107
|
+
**/
|
1108
|
+
markupOfPart: function(_partName) {
|
1109
|
+
if (!this.markupElemIds[_partName]) {
|
1110
|
+
console.log('Warning, markupOfPart: partName "'+_partName+'" does not exist for viewId '+this.viewId+'.');
|
1111
|
+
return '';
|
1112
|
+
}
|
1113
|
+
return ELEM.getHTML(this.markupElemIds[_partName]);
|
1114
|
+
},
|
1115
|
+
|
1116
|
+
/** = Description
|
1117
|
+
* Hides the component's main DOM element (and its children).
|
1118
|
+
*
|
1119
|
+
* = Returns
|
1120
|
+
* +self+
|
1121
|
+
*
|
1122
|
+
**/
|
1123
|
+
hide: function() {
|
1124
|
+
if(!this.isHidden) {
|
1125
|
+
var _setStyl = ELEM.setStyle,
|
1126
|
+
_elemId = this.elemId;
|
1127
|
+
_setStyl(_elemId,'visibility', 'hidden');
|
1128
|
+
// Required for the old, buggy Mozilla engines ( Firefox versions below 3.0 )
|
1129
|
+
// At least text fields would show through from hidden parent elements.
|
1130
|
+
// Disabled, because keeping the display as none causes hidden views to have no dimensions at all.
|
1131
|
+
// _setStyl(_elemId,'display', 'none');
|
1132
|
+
this.isHidden = true;
|
1133
|
+
}
|
1134
|
+
return this;
|
1135
|
+
},
|
1136
|
+
|
1137
|
+
/** = Description
|
1138
|
+
* Restores the visibility of the component's main DOM element (and its children).
|
1139
|
+
*
|
1140
|
+
* = Return
|
1141
|
+
* +self+
|
1142
|
+
*
|
1143
|
+
**/
|
1144
|
+
show: function() {
|
1145
|
+
if(this.isHidden) {
|
1146
|
+
var _setStyl = ELEM.setStyle,
|
1147
|
+
_elemId = this.elemId;
|
1148
|
+
_setStyl(_elemId,'visibility', 'inherit');
|
1149
|
+
_setStyl(_elemId,'display', this.displayMode);
|
1150
|
+
this.isHidden = false;
|
1151
|
+
}
|
1152
|
+
return this;
|
1153
|
+
},
|
1154
|
+
|
1155
|
+
/** = Description
|
1156
|
+
* Toggles between hide and show.
|
1157
|
+
*
|
1158
|
+
* = Returns
|
1159
|
+
* +self+
|
1160
|
+
*
|
1161
|
+
**/
|
1162
|
+
toggle: function() {
|
1163
|
+
if(this.isHidden) {
|
1164
|
+
this.show();
|
1165
|
+
} else {
|
1166
|
+
this.hide();
|
1167
|
+
}
|
1168
|
+
return this;
|
1169
|
+
},
|
1170
|
+
|
1171
|
+
/** = Description
|
1172
|
+
* Call this if you need to remove a component from its parent's views array without
|
1173
|
+
* destroying the DOM element itself, making it in effect a view without parent.
|
1174
|
+
* Useful, for example, for moving a view from one parent component to another.
|
1175
|
+
*
|
1176
|
+
* = Returns
|
1177
|
+
* +self+
|
1178
|
+
*
|
1179
|
+
**/
|
1180
|
+
remove: function() {
|
1181
|
+
if( this.parent ) {
|
1182
|
+
|
1183
|
+
var _viewZIdx = this.parent.viewsZOrder.indexOf(this.viewId),
|
1184
|
+
_viewPIdx = this.parent.views.indexOf(this.viewId);
|
1185
|
+
|
1186
|
+
this.parent.views.splice(_viewPIdx,1);
|
1187
|
+
HSystem.delView(this.viewId);
|
1188
|
+
this.parent.viewsZOrder.splice( _viewZIdx, 1 );
|
1189
|
+
var _sysUpdateZIndexOfChildrenBufferIndex = HSystem._updateZIndexOfChildrenBuffer.indexOf( this.viewId );
|
1190
|
+
if(_sysUpdateZIndexOfChildrenBufferIndex !== -1){
|
1191
|
+
HSystem._updateZIndexOfChildrenBuffer.splice( _sysUpdateZIndexOfChildrenBufferIndex, 1 );
|
1192
|
+
}
|
1193
|
+
|
1194
|
+
this._updateZIndexAllSiblings();
|
1195
|
+
this.parent = null;
|
1196
|
+
this.parents = [];
|
1197
|
+
}
|
1198
|
+
return this;
|
1199
|
+
},
|
1200
|
+
|
1201
|
+
/** = Description
|
1202
|
+
* Deletes the component and all its children.
|
1203
|
+
* Should normally be called from the parent.
|
1204
|
+
*
|
1205
|
+
**/
|
1206
|
+
die: function() {
|
1207
|
+
// hide self, makes destruction seem faster
|
1208
|
+
this.hide();
|
1209
|
+
this.drawn = false;
|
1210
|
+
this.stopAnimation();
|
1211
|
+
// Delete the children first.
|
1212
|
+
var _childViewId, i;
|
1213
|
+
while (this.views.length !== 0) {
|
1214
|
+
_childViewId = this.views[0];
|
1215
|
+
this.destroyView(_childViewId);
|
1216
|
+
}
|
1217
|
+
// Remove this object's bindings, except the DOM element.
|
1218
|
+
this.remove();
|
1219
|
+
// Remove the DOM element bindings.
|
1220
|
+
for ( i = 0; i < this._domElementBindings.length; i++) {
|
1221
|
+
ELEM.del(this._domElementBindings[i]);
|
1222
|
+
}
|
1223
|
+
this._domElementBindings = [];
|
1224
|
+
|
1225
|
+
|
1226
|
+
// Remove the DOM object itself
|
1227
|
+
ELEM.del(this.elemId);
|
1228
|
+
|
1229
|
+
this.rect = null;
|
1230
|
+
var _this = this;
|
1231
|
+
for( i in _this ){
|
1232
|
+
_this[i] = null;
|
1233
|
+
delete _this[i];
|
1234
|
+
}
|
1235
|
+
},
|
1236
|
+
|
1237
|
+
/** Recursive idle poller. Should be extended if functionality is desired.
|
1238
|
+
**/
|
1239
|
+
onIdle: function() {
|
1240
|
+
for(var i = 0; i < this.views.length; i++) {
|
1241
|
+
HSystem.views[this.views[i]].onIdle();
|
1242
|
+
}
|
1243
|
+
},
|
1244
|
+
|
1245
|
+
/** Used by addView to build a parents array of parent classes.
|
1246
|
+
**/
|
1247
|
+
buildParents: function(_viewId){
|
1248
|
+
var _view = HSystem.views[_viewId];
|
1249
|
+
_view.parent = this;
|
1250
|
+
_view.parents = [];
|
1251
|
+
for(var _parentNum = 0; _parentNum < this.parents.length; _parentNum++) {
|
1252
|
+
_view.parents.push(this.parents[_parentNum]);
|
1253
|
+
}
|
1254
|
+
_view.parents.push(this);
|
1255
|
+
},
|
1256
|
+
|
1257
|
+
/** = Description
|
1258
|
+
* Adds a sub-view/component to the view. Called from inside the
|
1259
|
+
* HView#constructor and should be automatic for all components that accept
|
1260
|
+
* the 'parent' parameter, usually the second argument, after the HRect. May
|
1261
|
+
* also be used to attach a freely floating component (removed with remove)
|
1262
|
+
* to another component.
|
1263
|
+
*
|
1264
|
+
* = Parameter
|
1265
|
+
* +_view+:: Usually this inside HView derivate components.
|
1266
|
+
*
|
1267
|
+
* = Returns
|
1268
|
+
* The view id.
|
1269
|
+
*
|
1270
|
+
**/
|
1271
|
+
addView: function(_view) {
|
1272
|
+
var _viewId = HSystem.addView(_view);
|
1273
|
+
this.views.push(_viewId);
|
1274
|
+
|
1275
|
+
this.buildParents(_viewId);
|
1276
|
+
this.viewsZOrder.push(_viewId);
|
1277
|
+
|
1278
|
+
return _viewId;
|
1279
|
+
},
|
1280
|
+
|
1281
|
+
/** = Description
|
1282
|
+
* Call this if you need to remove a child view from this view without
|
1283
|
+
* destroying its element, making it in effect a view without parent.
|
1284
|
+
* Useful, for example, for moving a view from one parent component to another.
|
1285
|
+
*
|
1286
|
+
* = Parameters
|
1287
|
+
* +_viewId+:: The parent-specific view id. Actually an array index.
|
1288
|
+
*
|
1289
|
+
* = Returns
|
1290
|
+
* +self+
|
1291
|
+
*
|
1292
|
+
**/
|
1293
|
+
removeView: function(_viewId) {
|
1294
|
+
HSystem.views[_viewId].remove();
|
1295
|
+
return this;
|
1296
|
+
},
|
1297
|
+
|
1298
|
+
/** = Description
|
1299
|
+
* Call this if you need to remove a child view from this view, destroying its
|
1300
|
+
* child elements recursively and removing all DOM elements too.
|
1301
|
+
*
|
1302
|
+
* = Parameters
|
1303
|
+
* +_viewId+:: The parent-specific view id. Actually an array index.
|
1304
|
+
*
|
1305
|
+
* = Returns
|
1306
|
+
* +self+
|
1307
|
+
**/
|
1308
|
+
destroyView: function(_viewId) {
|
1309
|
+
HSystem.views[_viewId].die();
|
1310
|
+
return this;
|
1311
|
+
},
|
1312
|
+
|
1313
|
+
/** = Description
|
1314
|
+
* Returns bounds rectangle that defines the size and coordinate system
|
1315
|
+
* of the component. This should be identical to the rectangle used in
|
1316
|
+
* constructing the object, unless it has been changed after construction.
|
1317
|
+
*
|
1318
|
+
* = Returns
|
1319
|
+
* A new <HRect> instance with identical values to this component's rect.
|
1320
|
+
*
|
1321
|
+
**/
|
1322
|
+
bounds: function() {
|
1323
|
+
// Could be cached.
|
1324
|
+
var _bounds = new HRect(this.rect);
|
1325
|
+
|
1326
|
+
_bounds.right -= _bounds.left;
|
1327
|
+
_bounds.left = 0;
|
1328
|
+
_bounds.bottom -= _bounds.top;
|
1329
|
+
_bounds.top = 0;
|
1330
|
+
|
1331
|
+
return _bounds;
|
1332
|
+
},
|
1333
|
+
|
1334
|
+
|
1335
|
+
/** = Description
|
1336
|
+
* This method resizes the view, without moving its left and top sides.
|
1337
|
+
* It adds horizontal coordinate units to the width and vertical units to
|
1338
|
+
* the height of the view.
|
1339
|
+
* Since a View's frame rectangle must be aligned on screen pixels, only
|
1340
|
+
* integral values should be passed to this method. Values with
|
1341
|
+
* fractional components will be rounded to the nearest whole integer.
|
1342
|
+
* If the View is attached to a window, this method causes its parent view
|
1343
|
+
* to be updated, so the View is immediately displayed in its new size. If it
|
1344
|
+
* doesn't have a parent or isn't attached to a window, this method
|
1345
|
+
* merely alter its frame and bounds rectangle.
|
1346
|
+
*
|
1347
|
+
* = Parameters
|
1348
|
+
* +_horizonal+:: Horizonal units to add to the width (negative units subtract)
|
1349
|
+
* +_vertical+:: Vertical units to add to the height (negative units subtract)
|
1350
|
+
*
|
1351
|
+
* = Returns
|
1352
|
+
* +self+
|
1353
|
+
*
|
1354
|
+
**/
|
1355
|
+
resizeBy: function(_horizontal, _vertical) {
|
1356
|
+
var _rect = this.rect;
|
1357
|
+
_rect.right += _horizontal;
|
1358
|
+
_rect.bottom += _vertical;
|
1359
|
+
_rect.updateSecondaryValues();
|
1360
|
+
this.drawRect();
|
1361
|
+
return this;
|
1362
|
+
},
|
1363
|
+
|
1364
|
+
/** = Description
|
1365
|
+
* This method makes the view width units wide
|
1366
|
+
* and height units high. This method adjust the right and bottom
|
1367
|
+
* components of the frame rectangle accordingly.
|
1368
|
+
* Since a View's frame rectangle must be aligned on screen pixels, only
|
1369
|
+
* integral values should be passed to this method. Values with
|
1370
|
+
* fractional components will be rounded to the nearest whole integer.
|
1371
|
+
* If the View is attached to a window, this method causes its parent view
|
1372
|
+
* to be updated, so the View is immediately displayed in its new size. If it
|
1373
|
+
* doesn't have a parent or isn't attached to a window, this method
|
1374
|
+
* merely alter its frame and bounds rectangle.
|
1375
|
+
*
|
1376
|
+
* = Parameters
|
1377
|
+
* +_width+:: The new width of the view.
|
1378
|
+
* +_height+:: The new height of the view.
|
1379
|
+
*
|
1380
|
+
* = Returns
|
1381
|
+
* +self+
|
1382
|
+
*
|
1383
|
+
**/
|
1384
|
+
resizeTo: function(_width, _height) {
|
1385
|
+
var _rect = this.rect;
|
1386
|
+
_rect.right = _rect.left + _width;
|
1387
|
+
_rect.bottom = _rect.top + _height;
|
1388
|
+
_rect.updateSecondaryValues();
|
1389
|
+
this.drawRect();
|
1390
|
+
return this;
|
1391
|
+
},
|
1392
|
+
|
1393
|
+
/** = Descripion
|
1394
|
+
* This method moves the view to a new coordinate. It adjusts the
|
1395
|
+
* left and top components of the frame rectangle accordingly.
|
1396
|
+
* Since a View's frame rectangle must be aligned on screen pixels, only
|
1397
|
+
* integral values should be passed to this method. Values with
|
1398
|
+
* fractional components will be rounded to the nearest whole integer.
|
1399
|
+
* If the View is attached to a window, this method causes its parent view
|
1400
|
+
* to be updated, so the View is immediately displayed in its new size. If it
|
1401
|
+
* doesn't have a parent or isn't attached to a window, this method
|
1402
|
+
* merely alter its frame and bounds rectangle.
|
1403
|
+
*
|
1404
|
+
* = Parameters
|
1405
|
+
* +_x+:: The new x-coordinate of the view.
|
1406
|
+
* +_y+:: The new y-coordinate of the view.
|
1407
|
+
*
|
1408
|
+
* +_point+:: The new coordinate point of the view.
|
1409
|
+
*
|
1410
|
+
* = Returns
|
1411
|
+
* +self+
|
1412
|
+
*
|
1413
|
+
**/
|
1414
|
+
offsetTo: function() {
|
1415
|
+
this.rect.offsetTo.apply(this.rect, arguments);
|
1416
|
+
this.drawRect();
|
1417
|
+
return this;
|
1418
|
+
},
|
1419
|
+
|
1420
|
+
/** = Description
|
1421
|
+
* Alias method for offsetTo.
|
1422
|
+
*
|
1423
|
+
* = Returns
|
1424
|
+
* +self+
|
1425
|
+
*
|
1426
|
+
**/
|
1427
|
+
moveTo: function() {
|
1428
|
+
this.offsetTo.apply(this, arguments);
|
1429
|
+
return this;
|
1430
|
+
},
|
1431
|
+
|
1432
|
+
/** = Description
|
1433
|
+
* This method re-positions the view without changing its size.
|
1434
|
+
* It adds horizontal coordinate units to the x coordinate and vertical
|
1435
|
+
* units to the y coordinate of the view.
|
1436
|
+
* Since a View's frame rectangle must be aligned on screen pixels, only
|
1437
|
+
* integral values should be passed to this method. Values with
|
1438
|
+
* fractional components will be rounded to the nearest whole integer.
|
1439
|
+
* If the View is attached to a window, this method causes its parent view
|
1440
|
+
* to be updated, so the View is immediately displayed in its new size. If it
|
1441
|
+
* doesn't have a parent or isn't attached to a window, this method
|
1442
|
+
* merely alter its frame and bounds rectangle.
|
1443
|
+
*
|
1444
|
+
* = Parameters
|
1445
|
+
* +_horizonal+:: Horizonal units to change the x coordinate (negative units subtract)
|
1446
|
+
* +_vertical+:: Vertical units to add to change the y coordinate (negative units subtract)
|
1447
|
+
*
|
1448
|
+
* = Returns
|
1449
|
+
* +self+
|
1450
|
+
*
|
1451
|
+
**/
|
1452
|
+
offsetBy: function(_horizontal, _vertical) {
|
1453
|
+
this.rect.offsetBy(_horizontal, _vertical);
|
1454
|
+
this.drawRect();
|
1455
|
+
return this;
|
1456
|
+
},
|
1457
|
+
|
1458
|
+
/** = Description
|
1459
|
+
* Alias method for offsetBy.
|
1460
|
+
*
|
1461
|
+
* = Returns
|
1462
|
+
* +self+
|
1463
|
+
*
|
1464
|
+
**/
|
1465
|
+
moveBy: function() {
|
1466
|
+
this.offsetBy.apply(this, arguments);
|
1467
|
+
return this;
|
1468
|
+
},
|
1469
|
+
|
1470
|
+
/** = Description
|
1471
|
+
* Brings the view to the front by changing its Z-Index.
|
1472
|
+
*
|
1473
|
+
* = Returns
|
1474
|
+
* +self+
|
1475
|
+
*
|
1476
|
+
**/
|
1477
|
+
bringToFront: function() {
|
1478
|
+
if (this.parent) {
|
1479
|
+
var _index = this.zIndex();
|
1480
|
+
this.parent.viewsZOrder.splice(_index, 1);
|
1481
|
+
this.parent.viewsZOrder.push(this.viewId);
|
1482
|
+
this._updateZIndexAllSiblings();
|
1483
|
+
}
|
1484
|
+
return this;
|
1485
|
+
},
|
1486
|
+
|
1487
|
+
/** = Description
|
1488
|
+
* Brings itself to the front of the given view by changing its Z-Index.
|
1489
|
+
* Only works on sibling views.
|
1490
|
+
*
|
1491
|
+
* = Parameters
|
1492
|
+
* +_view+:: The view to bring to the front of.
|
1493
|
+
*
|
1494
|
+
* = Returns
|
1495
|
+
* +self+
|
1496
|
+
*
|
1497
|
+
**/
|
1498
|
+
bringToFrontOf: function(_view){
|
1499
|
+
if(this.parent.viewId === _view.parent.viewId){
|
1500
|
+
this.parent.viewsZOrder.splice( this.zIndex(), 1 ); // removes selfs index from the array
|
1501
|
+
this.parent.viewsZOrder.splice( _view.zIndex()+1, 0, this.viewId); // sets itself in front of to _view
|
1502
|
+
this._updateZIndexAllSiblings();
|
1503
|
+
}
|
1504
|
+
return this;
|
1505
|
+
},
|
1506
|
+
|
1507
|
+
/** = Description
|
1508
|
+
* Sends itself to the back of the given view by changing its Z-Index.
|
1509
|
+
* Only works on sibling views.
|
1510
|
+
*
|
1511
|
+
* = Parameters
|
1512
|
+
* +_view+:: The view to send to the back of.
|
1513
|
+
*
|
1514
|
+
* = Returns
|
1515
|
+
* +self+
|
1516
|
+
*
|
1517
|
+
**/
|
1518
|
+
sendToBackOf: function(_view){
|
1519
|
+
if(this.parent.viewId === _view.parent.viewId){
|
1520
|
+
this.parent.viewsZOrder.splice( this.zIndex(), 1 ); // removes selfs index from the array
|
1521
|
+
this.parent.viewsZOrder.splice( _view.zIndex(), 0, this.viewId); // sets itself in back of to _view
|
1522
|
+
this._updateZIndexAllSiblings();
|
1523
|
+
}
|
1524
|
+
return this;
|
1525
|
+
},
|
1526
|
+
|
1527
|
+
/** = Description
|
1528
|
+
* Sends itself one step backward by changing its Z-Index.
|
1529
|
+
*
|
1530
|
+
* = Returns
|
1531
|
+
* +self+
|
1532
|
+
*
|
1533
|
+
**/
|
1534
|
+
sendBackward: function(){
|
1535
|
+
var _index = this.zIndex();
|
1536
|
+
if(_index!==0){
|
1537
|
+
this.parent.viewsZOrder.splice( _index, 1 ); // removes selfs index from the array
|
1538
|
+
this.parent.viewsZOrder.splice( _index-1, 0, this.viewId); // moves selfs position to one step less than where it was
|
1539
|
+
this._updateZIndexAllSiblings();
|
1540
|
+
}
|
1541
|
+
return this;
|
1542
|
+
},
|
1543
|
+
|
1544
|
+
/** = Description
|
1545
|
+
* Brings itself one step forward by changing its Z-Index.
|
1546
|
+
*
|
1547
|
+
* = Returns
|
1548
|
+
* +self+
|
1549
|
+
*
|
1550
|
+
**/
|
1551
|
+
bringForward: function(){
|
1552
|
+
var _index = this.zIndex();
|
1553
|
+
if(_index!==this.parent.viewsZOrder.length-1){
|
1554
|
+
this.parent.viewsZOrder.splice( _index, 1 ); // removes selfs index from the array
|
1555
|
+
this.parent.viewsZOrder.splice( _index+1, 0, this.viewId); // moves selfs position to one step more than it was
|
1556
|
+
this._updateZIndexAllSiblings();
|
1557
|
+
}
|
1558
|
+
return this;
|
1559
|
+
},
|
1560
|
+
|
1561
|
+
|
1562
|
+
/** = Description
|
1563
|
+
* Sends the view to the back by changing its Z-Index.
|
1564
|
+
*
|
1565
|
+
* = Returns
|
1566
|
+
* +self+
|
1567
|
+
*
|
1568
|
+
**/
|
1569
|
+
sendToBack: function() {
|
1570
|
+
if (this.parent) {
|
1571
|
+
var _index = this.zIndex();
|
1572
|
+
this.parent.viewsZOrder.splice(_index, 1); // removes this index from the arr
|
1573
|
+
this.parent.viewsZOrder.splice(0, 0, this.viewId); // unshifts viewId
|
1574
|
+
this._updateZIndexAllSiblings();
|
1575
|
+
}
|
1576
|
+
return this;
|
1577
|
+
},
|
1578
|
+
|
1579
|
+
/** = Description
|
1580
|
+
* Use this method to get the Z-Index of itself.
|
1581
|
+
*
|
1582
|
+
* = Returns
|
1583
|
+
* The current Z-Index value.
|
1584
|
+
*
|
1585
|
+
**/
|
1586
|
+
zIndex: function() {
|
1587
|
+
if (!this.parent) {
|
1588
|
+
return -1;
|
1589
|
+
}
|
1590
|
+
// Returns the z-order of this item as seen by the parent.
|
1591
|
+
return this.parent.viewsZOrder.indexOf(this.viewId);
|
1592
|
+
},
|
1593
|
+
|
1594
|
+
/** = Description
|
1595
|
+
* Measures the characters encoded in length bytes of the string - or,
|
1596
|
+
* if no length is specified, the entire string up to the null character,
|
1597
|
+
* '0', which terminates it. The return value totals the width of all the
|
1598
|
+
* characters in coordinate units; it's the length of the baseline required
|
1599
|
+
* to draw the string.
|
1600
|
+
*
|
1601
|
+
* = Parameters
|
1602
|
+
* +_string+:: The string to measure.
|
1603
|
+
* +_length+:: Optional, How many characters to count.
|
1604
|
+
* +_elemId+:: Optional, The element ID where the temporary string is created
|
1605
|
+
* in.
|
1606
|
+
* +_wrap+:: Optional boolean value, wrap whitespaces?
|
1607
|
+
* +_extraCss+:: Optional, extra css to add.
|
1608
|
+
*
|
1609
|
+
* = Returns
|
1610
|
+
* The width in pixels required to draw a string in the font.
|
1611
|
+
*
|
1612
|
+
**/
|
1613
|
+
stringSize: function(_string, _length, _elemId, _wrap, _extraCss) {
|
1614
|
+
if (_length || _length === 0) {
|
1615
|
+
_string = _string.substring(0, _length);
|
1616
|
+
}
|
1617
|
+
if (!_elemId && _elemId !== 0) {
|
1618
|
+
_elemId = 0; //this.elemId;
|
1619
|
+
}
|
1620
|
+
if (!_extraCss) {
|
1621
|
+
_extraCss = '';
|
1622
|
+
}
|
1623
|
+
if (!_wrap){
|
1624
|
+
_extraCss += 'white-space:nowrap;';
|
1625
|
+
}
|
1626
|
+
|
1627
|
+
var _stringElem = ELEM.make(_elemId,'span');
|
1628
|
+
ELEM.setCSS(_stringElem, "visibility:hidden;"+_extraCss);
|
1629
|
+
ELEM.setHTML(_stringElem, _string);
|
1630
|
+
// ELEM.flushLoop();
|
1631
|
+
var _visibleSize=ELEM.getVisibleSize(_stringElem);
|
1632
|
+
// console.log('visibleSize',_visibleSize);
|
1633
|
+
ELEM.del(_stringElem);
|
1634
|
+
return [_visibleSize[0]+_visibleSize[0]%2,_visibleSize[1]+_visibleSize[1]%2];
|
1635
|
+
},
|
1636
|
+
|
1637
|
+
/** Returns the string width
|
1638
|
+
**/
|
1639
|
+
stringWidth: function(_string, _length, _elemId, _extraCss){
|
1640
|
+
return this.stringSize(_string, _length, _elemId, false, _extraCss)[0];
|
1641
|
+
},
|
1642
|
+
|
1643
|
+
/** Returns the string height.
|
1644
|
+
**/
|
1645
|
+
stringHeight: function(_string, _length, _elemId, _extraCss){
|
1646
|
+
return this.stringSize(_string, _length, _elemId, true, _extraCss)[1];
|
1647
|
+
},
|
1648
|
+
|
1649
|
+
/** Returns the X coordinate that has the scrolled position calculated.
|
1650
|
+
**/
|
1651
|
+
pageX: function() {
|
1652
|
+
var _x = 0,
|
1653
|
+
_elem = this;
|
1654
|
+
while(_elem) {
|
1655
|
+
if(_elem.elemId && _elem.rect) {
|
1656
|
+
_x += ELEM.get(_elem.elemId).offsetLeft;
|
1657
|
+
_x -= ELEM.get(_elem.elemId).scrollLeft;
|
1658
|
+
}
|
1659
|
+
if(_elem.markupElemIds&&_elem.markupElemIds.subview){
|
1660
|
+
_x += ELEM.get(_elem.markupElemIds.subview).offsetLeft;
|
1661
|
+
_x -= ELEM.get(_elem.markupElemIds.subview).scrollLeft;
|
1662
|
+
}
|
1663
|
+
_elem = _elem.parent;
|
1664
|
+
}
|
1665
|
+
return _x;
|
1666
|
+
},
|
1667
|
+
|
1668
|
+
/** = Description
|
1669
|
+
* Sets the label on a control component: the text that's displayed in
|
1670
|
+
* HControl extensions. Visual functionality is implemented in component
|
1671
|
+
* theme templates and refreshLabel method extensions.
|
1672
|
+
*
|
1673
|
+
* Avoid extending directly, extend +refreshLabel+ instead.
|
1674
|
+
*
|
1675
|
+
* = Parameters
|
1676
|
+
* +_label+:: The text the component should display.
|
1677
|
+
*
|
1678
|
+
* = Returns
|
1679
|
+
* +self+
|
1680
|
+
*
|
1681
|
+
**/
|
1682
|
+
setLabel: function(_label) {
|
1683
|
+
if(this.escapeLabelHTML){
|
1684
|
+
_label = this.escapeHTML( _label );
|
1685
|
+
}
|
1686
|
+
var _this = this,
|
1687
|
+
_differs = (_label !== _this.label);
|
1688
|
+
if(_differs){
|
1689
|
+
_this.label = _label;
|
1690
|
+
_this.options.label = _label;
|
1691
|
+
_this.refresh();
|
1692
|
+
}
|
1693
|
+
return this;
|
1694
|
+
},
|
1695
|
+
|
1696
|
+
/** = Description
|
1697
|
+
* Called when the +self.label+ has been changed. By default
|
1698
|
+
* tries to update the label element defined in the theme of
|
1699
|
+
* the component. Of course, the HControl itself doesn't
|
1700
|
+
* define a theme, so without a theme doesn't do anything.
|
1701
|
+
*
|
1702
|
+
* = Returns
|
1703
|
+
* +self+
|
1704
|
+
*
|
1705
|
+
**/
|
1706
|
+
refreshLabel: function(){
|
1707
|
+
if(this.markupElemIds){
|
1708
|
+
if(this.markupElemIds['label']){
|
1709
|
+
ELEM.setHTML(this.markupElemIds.label,this.label);
|
1710
|
+
}
|
1711
|
+
}
|
1712
|
+
return this;
|
1713
|
+
},
|
1714
|
+
|
1715
|
+
/** Returns the Y coordinate that has the scrolled position calculated.
|
1716
|
+
**/
|
1717
|
+
pageY: function() {
|
1718
|
+
var _y = 0,
|
1719
|
+
_elem = this;
|
1720
|
+
while(_elem) {
|
1721
|
+
if(_elem.elemId && _elem.rect) {
|
1722
|
+
_y += ELEM.get(_elem.elemId).offsetTop;
|
1723
|
+
_y -= ELEM.get(_elem.elemId).scrollTop;
|
1724
|
+
}
|
1725
|
+
if(_elem.markupElemIds&&_elem.markupElemIds.subview){
|
1726
|
+
_y += ELEM.get(_elem.markupElemIds.subview).offsetTop;
|
1727
|
+
_y -= ELEM.get(_elem.markupElemIds.subview).scrollTop;
|
1728
|
+
}
|
1729
|
+
_elem = _elem.parent;
|
1730
|
+
}
|
1731
|
+
return _y;
|
1732
|
+
},
|
1733
|
+
|
1734
|
+
/** Returns the HPoint that has the scrolled position calculated.
|
1735
|
+
**/
|
1736
|
+
pageLocation: function() {
|
1737
|
+
return new HPoint(this.pageX(), this.pageY());
|
1738
|
+
},
|
1739
|
+
|
1740
|
+
/** = Description
|
1741
|
+
* An abstract method that derived classes may implement, if they are able to
|
1742
|
+
* resize themselves so that their content fits nicely inside.
|
1743
|
+
* Similar to pack, might be renamed when components are written to
|
1744
|
+
* be savvy of this feature.
|
1745
|
+
**/
|
1746
|
+
optimizeWidth: function() {
|
1747
|
+
|
1748
|
+
},
|
1749
|
+
|
1750
|
+
|
1751
|
+
/** = Description
|
1752
|
+
* Invalidates event manager's element position cache for this view and its
|
1753
|
+
* subviews. Actual functionality is implemented in HControl.
|
1754
|
+
*
|
1755
|
+
* = Returns
|
1756
|
+
* +self+
|
1757
|
+
*
|
1758
|
+
**/
|
1759
|
+
invalidatePositionCache: function() {
|
1760
|
+
for(var i=0; i<this.views.length; i++) {
|
1761
|
+
HSystem.views[this.views[i]].invalidatePositionCache();
|
1762
|
+
}
|
1763
|
+
return this;
|
1764
|
+
},
|
1765
|
+
|
1766
|
+
|
1767
|
+
/** = Description
|
1768
|
+
* Binds a DOM element to the +ELEM+ cache. This is a wrapper for
|
1769
|
+
* the ELEM#elem_bind that keeps track of the bound elements and
|
1770
|
+
* frees them from the element manager when the view is destroyed.
|
1771
|
+
*
|
1772
|
+
* = Parameters
|
1773
|
+
* +_domElementId+:: The value of the DOM element's id attribute that is
|
1774
|
+
* to be bound to the element cache.
|
1775
|
+
*
|
1776
|
+
* = Returns
|
1777
|
+
* The element index id of the bound element.
|
1778
|
+
*
|
1779
|
+
**/
|
1780
|
+
bindDomElement: function(_domElementId) {
|
1781
|
+
var _cacheId = ELEM.bindId(_domElementId);
|
1782
|
+
if (_cacheId) {
|
1783
|
+
this._domElementBindings.push(_cacheId);
|
1784
|
+
}
|
1785
|
+
return _cacheId;
|
1786
|
+
},
|
1787
|
+
|
1788
|
+
|
1789
|
+
/** = Description
|
1790
|
+
* Removes a DOM element from the +ELEM+ cache. This is a wrapper
|
1791
|
+
* for the ELEM#elem_del. This is used for safely removing DOM
|
1792
|
+
* nodes from the cache.
|
1793
|
+
*
|
1794
|
+
* = Parameters
|
1795
|
+
* +_elementId+:: The id of the element in the element manager's cache
|
1796
|
+
* that is to be removed from the cache.
|
1797
|
+
*
|
1798
|
+
**/
|
1799
|
+
unbindDomElement: function(_elementId) {
|
1800
|
+
var _indexOfElementId = this._domElementBindings.indexOf(_elementId);
|
1801
|
+
if (_indexOfElementId > -1) {
|
1802
|
+
ELEM.del(_elementId);
|
1803
|
+
this._domElementBindings.splice(_indexOfElementId, 1);
|
1804
|
+
}
|
1805
|
+
}
|
1806
|
+
|
1807
|
+
|
1808
|
+
});
|
1809
|
+
|
1810
|
+
HView.implement(HMarkupView);
|
1811
|
+
HView.implement(HMorphAnimation);
|
1812
|
+
|