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