gui/extensions/widget_manager/init.js (771 lines of code) (raw):
/*container for widgets*/
widget_display = gw_new_container();
widget_display.on_event = function(evt)
{
if(!widget_display.children.length) return false;
return widget_display.children[widget_display.children.length-1].on_event(evt);
}
widget_tool_size = 18;
widget_min_size = 5*widget_tool_size;
widget_default_size = 100;
function check_widget_display(width, height)
{
var count = WidgetManager.num_widgets;
for (var i=0; i<count; i++) {
var x, y;
var wid = WidgetManager.get(i);
if (wid == null) continue;
if (!wid.visible) continue;
x = wid.x;
y = wid.y;
if (x-wid.width/2 <= -width/2) x = wid.width/2-width/2;
else if (x+wid.width/2 >= width/2) x = width/2 - wid.width/2;
if (y + wid.height/2 >= height/2) y = height/2 - wid.height/2;
else if (y - wid.height/2 <= - height/2) y = -height/2 + wid.height/2;
if (wid.widget_control) wid.widget_control.move(x, y);
}
}
function scan_directory(dir)
{
var i, j, count, list, new_wid, uri;
list = gpac.enum_directory(dir, '.xml;.wgt;.mgt', 0);
for (i=0; i<list.length; i++) {
uri = list[i].path + list[i].name;
if (list[i].directory) {
scan_directory(uri);
} else {
count = WidgetManager.num_widgets;
for (j=0; j<count; j++) {
var wid = WidgetManager.get(j);
if (wid.url==uri) break;
}
if (j==count) {
new_wid = WidgetManager.open(uri, null);
if (new_wid!=null) {
widget_insert_icon(new_wid);
}
}
}
}
}
widman_cfg_dlg = null;
function open_widget_manager(extension)
{
if (widman_cfg_dlg) return;
widman_cfg_dlg = gw_new_window_full(null, true, 'Widget Manager');
widman_cfg_dlg.area = gw_new_grid_container(widman_cfg_dlg);
var icon = gw_new_icon_button(widman_cfg_dlg.area, gwskin.images.add, 'Add widget', 'icon_label');
icon.on_click = function() {
widman_cfg_dlg.close();
widman_cfg_dlg = null;
var filebrowse = gw_new_file_open();
filebrowse.show_directory = true;
filebrowse.filter = '*.xml;*.wgt;*.mgt';
filebrowse.browse(WidgetManager.last_widget_dir);
filebrowse.on_browse = function(value, directory) {
var new_wid = WidgetManager.open(value, null);
if (new_wid==null) return;
WidgetManager.last_widget_dir = directory;
widget_insert_icon(new_wid);
dock.layout(dock.width, dock.height);
show_dock(true);
}
filebrowse.on_directory = function(directory) {
WidgetManager.last_widget_dir = directory;
scan_directory(directory);
show_dock(true);
}
filebrowse.set_size(320 , 240);
gpacui_show_window(filebrowse);
}
var icon = gw_new_icon_button(widman_cfg_dlg.area, gwskin.images.trash, 'Remove all widgets', 'icon_label');
icon.on_click = function() {
while (1) {
var wid = WidgetManager.get(0);
if (wid==null) break;
widget_remove(wid);
}
widman_cfg_dlg.close();
widman_cfg_dlg = null;
dock.layout(dock.width, dock.height);
show_dock(true);
}
widman_cfg_dlg.on_close = function() {
widman_cfg_dlg = null;
}
widman_cfg_dlg.set_size(320 , 240);
gpacui_show_window(widman_cfg_dlg);
}
function widget_insert_icon(new_wid) {
var icon = gpacui_insert_dock_icon(new_wid.name, widget_get_icon(new_wid) );
new_wid.in_panel = true;
new_wid.visible = false;
new_wid.icon_dock = icon;
icon.on_click = on_widget_launch;
icon.widget = new_wid;
}
function collapsable_list(info_dlg, title)
{
var info = gw_new_button(info_dlg.area, title, 'button');
var children = info_dlg.area.get_children();
info.first_idx = children.length;
info.dlg = info_dlg;
info.displayed = true;
info.on_click = function() {
var children = this.dlg.area.get_children();
this.displayed = !this.displayed;
for (var i=this.first_idx; i<this.last_idx; i++) {
if (this.displayed) children[i].show();
else children[i].hide();
if (typeof children[i].last_idx != 'undefined') {
if (!children[i].displayed) children[i].on_click();
}
}
this.dlg.area.layout_changed();
}
return info;
}
//widget information dialog
function display_widget_info(wid)
{
var i, j, k, info;
var y, txt, pref;
var info_dlg = gw_new_window_full(null, true, 'Widget ' + wid.name + ' Information', 'window', null);
// info_dlg.area = gw_new_grid_container(info_dlg);
info_dlg.area = gw_new_listbox(info_dlg);
var info = collapsable_list(info_dlg, 'Widget Metadata');
gw_new_text(info_dlg.area, 'id: ' + wid.identifier + ' - shortname: '+wid.shortName + ' - name: '+wid.name, 'text');
gw_new_text(info_dlg.area, 'version: '+wid.version, 'text');
gw_new_text(info_dlg.area, 'content type: ' + wid.mainMimeType + ' - content encoding: '+wid.mainEncoding, 'text');
gw_new_text(info_dlg.area, 'default size: Width = ' + wid.defaultWidth + ' Height = '+wid.defaultHeight, 'text');
gw_new_text(info_dlg.area, 'license: '+wid.license, 'text');
gw_new_text(info_dlg.area, 'license ref: '+wid.licenseHref, 'text');
gw_new_text(info_dlg.area, 'description: '+wid.description, 'text');
gw_new_text(info_dlg.area, 'author name: '+wid.authorName + ' (mail: '+wid.authorEmail+')', 'text');
gw_new_text(info_dlg.area, 'author href: '+wid.authorHref, 'text');
gw_new_text(info_dlg.area, 'view modes: '+wid.viewmodes, 'text');
gw_new_text(info_dlg.area, 'UUID: '+wid.uuid, 'text');
gw_new_text(info_dlg.area, 'Discardable: '+wid.discardable, 'text');
gw_new_text(info_dlg.area, 'Muliple Instances: '+wid.discardable, 'text');
var icons = wid.icons;
for (j=0; j<icons.length; j++) {
gw_new_text(info_dlg.area, 'Icon #'+(j+1)+': ' + icons[j].src, 'text');
}
info.last_idx = info_dlg.area.get_children().length;
info.on_click();
info = collapsable_list(info_dlg, 'Widget Manager Info');
gw_new_text(info_dlg.area, 'nb instances: '+wid.num_instances + ' nb components: '+wid.num_components, 'text' );
gw_new_text(info_dlg.area, 'Permanently installed: '+wid.permanent + ' - is component: '+wid.is_component, 'text' );
if (wid.is_component) {
gw_new_text(info_dlg.area, 'parent widget name' + wid.parent.name, 'text');
}
if (wid.originating_device_ip) {
gw_new_text(info_dlg.area, 'Widget was pushed from device IP '+wid.originating_device_ip, 'text' );
}
gw_new_text(info_dlg.area, 'Section name in GPAC config file: '+wid.section, 'text' );
gw_new_text(info_dlg.area, 'UA Locale: ' + gpac.get_option('Systems', 'LanguageName') + ' (' + gpac.get_option('Systems', 'Language2CC') + ')', 'text');
gw_new_text(info_dlg.area, 'widget src: ' + wid.url , 'text');
gw_new_text(info_dlg.area, 'config src: ' + wid.manifest , 'text');
gw_new_text(info_dlg.area, 'content src : '+wid.localizedSrc, 'text' );
info.last_idx = info_dlg.area.get_children().length;
info.on_click();
pref = wid.features;
if (pref.length) {
info = collapsable_list(info_dlg, 'Features');
for (j=0; j<pref.length; j++) {
gw_new_text(info_dlg.area, 'Feature #'+(j+1)+' name=\''+pref[j].name+'\' required=\''+pref[j].required+'\'', 'text');
}
info.last_idx = info_dlg.area.get_children().length;
info.on_click();
}
pref = wid.preferences;
if (pref.length) {
info = collapsable_list(info_dlg, 'Preferences');
for (j=0; j<pref.length; j++) {
var val = pref[j].value;
if (val == '') val = gpac.get_option(wid.section, pref[j].name);
gw_new_text(info_dlg.area, 'Preference #'+(j+1)+' name=\''+pref[j].name+'\' value=\''+val+'\' readOnly=\''+pref[j].readonly +'\'', 'text');
}
info.last_idx = info_dlg.area.get_children().length;
info.on_click();
}
info = collapsable_list(info_dlg, 'MPEG-U Migration Context');
txt=wid.get_context();
if (!txt) txt='';
while (1) {
var idx = txt.indexOf('\n', 0);
if (idx>0) {
gw_new_text(info_dlg.area, txt.substring(0, idx), 'text');
txt = txt.substring(idx+1, txt.length);
} else {
gw_new_text(info_dlg.area, txt, 'text');
break;
}
}
info.last_idx = info_dlg.area.get_children().length;
info.on_click();
if (wid.num_interfaces) {
info = collapsable_list(info_dlg, 'MPEG-U Interfaces', 'button');
var spacer = gw_new_text(info_dlg.area, '', 'text');
spacer.hide();
info.first_idx = info_dlg.area.get_children().length;
for (j=0; j<wid.num_interfaces; j++) {
var idx;
var ifce = wid.get_interface(j);
var item = collapsable_list(info_dlg, 'Interface #' + (j+1) + ' type: '+ifce.type);
item.sublist = true;
gw_new_text(info_dlg.area, 'Multiple Binding: '+ifce.multipleBinding + ' - Service provider: '+ ifce.serviceProvider + ' - bound: ' + wid.is_interface_bound(ifce) , 'text');
for (k=0; k<ifce.num_messages; k++) {
var string, l;
var msg = ifce.get_message(k);
string = ' Message #'+ (k+1) + ': ' + msg.name + '(';
for (l=0; l<msg.num_params; l++) {
par = msg.get_param(l);
string += (par.is_input ? 'in' : 'out') + ':' +par.name + ' ';
}
string += ')';
gw_new_text(info_dlg.area, string, 'text');
}
item.last_idx = info_dlg.area.get_children().length;
item.on_click();
item.hide();
}
info.last_idx = info_dlg.area.get_children().length;
info.on_click();
}
info_dlg.area.spread_h = true;
info_dlg.area.break_at_hidden = true;
info_dlg.on_size = function(width, height) {
var i;
var children = this.area.get_children();
for (i=0; i<children.length; i++) {
if ((typeof children[i].first_idx != 'undefined') && (typeof children[i].sublist== 'undefined')) {
children[i].set_size( (width>200) ? 200 : width, 20);
} else {
children[i].set_size(width, 16);
}
}
}
info_dlg.on_event = function(evt) {
if (this.area && this.area.on_event(evt)) return true;
return false;
}
info_dlg.set_size(320, 240);
gpacui_show_window(info_dlg);
}
//widget close function
function widget_close(widget, force_remove)
{
var is_comp = widget.is_component;
if (widget.visible) {
widget.visible = false;
WidgetManager.corein_message(widget, 'hide');
WidgetManager.corein_message(widget, 'deactivate');
widget.deactivate();
/*force disconnect of main resource - we do this because we are not sure when the widget_control will be destroyed due to JS GC*/
if (widget.widget_control) {
widget.widget_control.set_url('');
widget.widget_control.close();
}
}
if (!is_comp && (!widget.permanent || force_remove)) {
WidgetManager.unload(widget, force_remove ? true : false);
}
}
//widget remove function (close and unregister)
function widget_remove(wid) {
if (typeof(wid.icon_dock) != 'undefined') {
wid.icon_dock.close();
wid.icon_dock = null;
}
widget_close(wid, 1);
}
function new_migrate_callback(widget) {
return function(renderer) {
WidgetManager.migrate_widget(renderer, widget);
widget_close(widget, 0);
}
}
function on_widget_load()
{
WidgetManager.corein_message(this, 'activate');
WidgetManager.corein_message(this, 'show');
WidgetManager.corein_message(this, 'setSize', 'width', this.width, 'height', this.height, 'dpi', screen_dpi);
}
mpegu_targets = null;
function select_mpegu_target(callback)
{
if (mpegu_targets) return;
mpegu_targets = gw_new_file_open();
mpegu_targets.set_label('Select Remote Display');
mpegu_targets.callback = callback;
mpegu_targets.on_close = function() {
mpegu_targets = null;
}
/*override browse function*/
mpegu_targets._on_mpegu_click = function() {
var target = (this.render_idx<0) ? null : WidgetManager.get_mpegu_service_providers(this.render_idx);
mpegu_targets.callback(target);
mpegu_targets.callback = null;
mpegu_targets.close();
mpegu_targets = null;
}
mpegu_targets._browse = function(dir, up) {
var w, h, i, y;
this.area.reset_children();
for (i=0; ; i++) {
var target = WidgetManager.get_mpegu_service_providers(i);
if (!target) break;
var icon = 'icons/applications-internet.svg';
var item = gw_new_icon_button(this.area, icon, target.Name);
item.set_size(item.width, item.height);
item.render_idx = i;
item.on_click = this._on_mpegu_click;
}
this.layout(this.width, this.height);
}
mpegu_targets.browse('');
mpegu_targets.go_up.hide();
mpegu_targets.set_size(display_width, display_height);
gpacui_show_window(mpegu_targets);
}
function new_widget_control(widget)
{
var ctrl;
var inline = gw_new_subscene(null);
ctrl = gw_new_window_full(widget_display, true, null, 'offscreen', inline);
ctrl.set_size(widget.width, widget.height);
ctrl.inline = inline;
ctrl.tools.spread_h = true;
ctrl.component_bound = false;
ctrl.widget = widget;
widget.widget_control = ctrl;
widget.visible = true;
ctrl.on_close = function() {
this.inline.url[0] = '';
this.widget.widget_control = null;
if (this.widget.discardable) widget_remove(this.widget);
else widget_close(this.widget, 0);
this.widget = null;
}
ctrl.tools.hide();
gw_object_set_dragable(ctrl);
gw_object_set_hitable(ctrl);
ctrl.controls_visible = false;
this.maximized = false;
ctrl.on_double_click = function() {
if (this.maximized) {
this.maximized = false;
this.move(this.widget.x, this.widget.y);
this.set_size(this.prev_width, this.prev_height);
} else {
this.maximized = true;
this.prev_width = this.widget.width;
this.prev_height = this.widget.height;
this.move(0, 0);
this.set_size(display_width, display_height);
}
this.controls_visible = false;
this.tools.hide();
}
ctrl.on_click = function() {
this.controls_visible = ! this.controls_visible;
if (this.controls_visible) this.tools.show();
else this.tools.hide();
}
/*push on top*/
ctrl.on_down = function(value) {
if (value) return;
if (this.widget==null) return;
//widget is a component, do not push on top but hide some controls
if (this.widget.is_component) {
if (this.component_bound) {
var chldren = this.tools.get_children();
children[0].hide(); //close
children[1].hide(); //remove
children[4].hide(); //resize
}
return;
}
//otherwise push widget on top
widget_display.push_to_top(this);
//and push components
comps = this.widget.components;
for (i=0; i<comps.length; i++) {
if (comps[i].widget_control && comps[i].widget_control.component_bound) {
widget_display.push_to_top(comps[i].widget_control);
}
}
}
ctrl._orig_move = ctrl.move;
ctrl.move = function(x, y) {
this.widget.x = x;
this.widget.y = y;
this._orig_move(x, y);
}
ctrl.on_drag = function(x, y) {
if (this.maximized) return;
this.move(x, y);
}
ctrl.on_event = function(evt) {
var x, y;
if (evt.type != GF_EVENT_KEYDOWN) return false;
if (!this.controls_visible) return false;
x = this.widget.x;
y = this.widget.y;
if (evt.keycode=='Up') y += 10;
else if (evt.keycode=='Down') y -= 10;
else if (evt.keycode=='Left') x -= 10;
else if (evt.keycode=='Right') x += 10;
else return false;
this.move(x, y);
return true;
}
/*widget is not temporary*/
if (!widget.discardable && widget.icon_dock) {
var icon = ctrl.add_tool(gwskin.images.trash, gwskin.labels.trash);
icon.on_click = function() { widget_remove(this.dlg.widget); };
}
if (UPnP_Enabled) {
ctrl.remote = ctrl.add_tool(gwskin.images.remote_display, gwskin.labels.remote_display);
ctrl.remote.on_click = function() {
var dlg = select_mpegu_target(new_migrate_callback(this.dlg.widget) );
};
ctrl.show_remote = function(show) {
if (show) this.remote.show();
else this.remote.hide();
}
}
var icon = ctrl.add_tool(gwskin.images.information, gwskin.labels.information);
icon.on_click = function() {
display_widget_info(this.dlg.widget);
};
var icon = ctrl.add_tool(gwskin.images.resize, gwskin.labels.resize);
gw_object_set_dragable(icon);
ctrl.prev_x=0;
ctrl.prev_y=0;
icon.begin_drag = function() {
this.dlg.prev_x=this.startx;
this.dlg.prev_y=this.starty;
}
icon.on_drag = function(valx, valy) {
var _dlg = this.dlg;
if (_dlg.widget.width + 2*(valx - _dlg.prev_x) < widget_min_size) return;
if (_dlg.widget.height + 2*(valy-_dlg.prev_y) < widget_min_size) return;
_dlg.widget.width += 2*(valx - _dlg.prev_x);
_dlg.prev_x = valx;
_dlg.widget.height += 2*(valy - _dlg.prev_y);
_dlg.prev_y = valy;
_dlg.set_size(_dlg.widget.width, _dlg.widget.height);
}
ctrl.set_url = function(url) {
ctrl.inline.url[0] = url;
}
ctrl.predestroy = function() {
this.inline = null;
this.remote = null;
this.widget = null;
}
ctrl.sub_w = 0;
ctrl.sub_h = 0;
ctrl.sub_x = 0;
ctrl.sub_y = 0;
ctrl.sub_vp_w = 0;
ctrl.sub_vp_h = 0;
ctrl.on_widget_vp_changed = function(evt) {
this.sub_vp_w = evt.width;
this.sub_vp_h = evt.height;
this.sub_vp_x = evt.offset_x;
this.sub_vp_y = evt.offset_y;
this.sub_w = evt.vp_width;
this.sub_h = evt.vp_height;
}
ctrl.inline.addEventListener('gpac_vp_changed', ctrl.on_widget_vp_changed, 0);
// ctrl.set_tool_size(widget_tool_size);
ctrl.set_size(widget.width, widget.height);
if (widget.x < -display_width/2) widget.x = 0;
else if (widget.x > display_width/2) widget.x = 0;
if (widget.y < -display_height/2) widget.y = 0;
else if (widget.y > display_height/2) widget.y = 0;
ctrl.move(widget.x, widget.y);
/*this will setup the scene graph for the widget in order to filter input and output communication pins*/
widget.activate(ctrl.inline);
ctrl.set_url(widget.main);
/*send notifications once the widget scene is loaded*/
widget.on_load = on_widget_load;
ctrl.show();
return ctrl;
}
function flash_window(wnd) {
wnd.time = gw_new_timer(true);
wnd.time.set_timeout(0.25, true);
wnd.time.ctrl = wnd;
wnd.time.on_fraction = function(val) {
var scale = (val<0.5) ? 1+val/2 : 1.5-val/2;
this.ctrl.scale.x = this.ctrl.scale.y = scale;
}
wnd.time.on_active = function (val) {
if (!val) {
this.ctrl.time = null;
this.ctrl = null;
}
}
wnd.time.stop(1);
wnd.time.start(0);
}
//widget launcher function
function widget_launch(wid) {
var widg_ctrl;
//assign default size to the widget
if (wid.width == undefined) {
wid.width = wid.defaultWidth;
if (wid.width == 0) wid.width = widget_default_size;
}
if (wid.height == undefined) {
wid.height = wid.defaultHeight;
if (wid.height == 0) wid.height = widget_default_size;
}
if (wid.x== undefined) wid.x = 0;
if (wid.y== undefined) wid.y = 0;
widg_ctrl = new_widget_control(wid);
}
//starts a widget
function on_widget_launch() {
if (this.widget.visible) {
var awid;
if (!this.widget.multipleInstances) return;
awid = WidgetManager.open(this.widget.manifest, null);
widget_launch(awid);
} else {
widget_launch(this.widget);
}
show_dock(false);
}
function widget_get_icon(widget)
{
var icon = 'icons/image-missing.svg';
var preferredIconType = '.svg';
for (var i = 0; i < widget.icons.length; i++) {
icon = widget.icons[i].relocated_src;
if (widget.icons[i].relocated_src.indexOf(preferredIconType) > 0) {
break;
}
}
return icon;
}
function widget_insert(widget)
{
/*insert the widget icon*/
if (widget.permanent && !widget.is_component)
widget_insert_icon(widget);
/*and load the widget - comment this line to disable auto load of widget*/
widget_launch(widget);
}
function __get_int(arg)
{
return (typeof arg == 'string') ? parseInt(arg) : arg;
}
function widget_request_size(widget, args)
{
if (args.length==2) {
w = __get_int(args[0]);
h = __get_int(args[1]);
widget.widget_control.set_size(w, h);
}
}
function widget_request_show(widget, args)
{
widget.widget_control.show();
}
function widget_request_hide(widget, args)
{
widget.widget_control.hide();
}
function widget_request_activate(widget, args)
{
if (!widget.visible)
widget_launch(widget);
}
function widget_request_deactivate(widget, args)
{
if (widget.visible)
widget_close(widget, 0);
}
function widget_request_attention(widget, args)
{
if (widget.visible) {
widget_display.push_to_top(widget.widget_control);
flash_window(widget.widget_control);
}
}
function widget_request_notification(widget, args)
{
var notif = gw_new_message(null, ''+widget.name+' Alert!', args[0]);
// widget_display.push_to_top(notif);
gpacui_show_window(notif);
notif.set_size(240, 120);
}
function widget_refresh_components_layout(ctrl, send_resize, comp_target)
{
var i;
var x, y, w, h, scale_x, scale_y;
var comps;
/*local to subscene transformation not known*/
if (!ctrl.sub_w) return;
if (!ctrl.sub_h) return;
comps = ctrl.widget.components;
for (i=0; i<comps.length; i++) {
var comp = comps[i];
if (!comp.widget_control || !comp.widget_control.component_bound) continue;
//compute scale from Widget Manager coord system to widget internal coordinate system
scale_x = ctrl.sub_vp_w / ctrl.sub_w;
scale_y = ctrl.sub_vp_h / ctrl.sub_h;
w = comp.widget_control.place_w * scale_x;
h = comp.widget_control.place_h * scale_y;
x = ctrl.translation.x - ctrl.widget.width/2 + ctrl.sub_vp_x + comp.widget_control.place_x * scale_x + w/2;
comp.widget_control.translation.x = x;
y = ctrl.widget.height/2 + ctrl.translation.y - h/2 - ctrl.sub_vp_y - comp.widget_control.place_y * scale_y;
comp.widget_control.translation.y = y;
if (send_resize || (comp_target==comp))
comp.widget_control.set_size(w, h);
}
}
function widget_place_component(widget, args)
{
var comp = widget.get_component(args[0]);
if (comp==null) {
log(l_err, 'Component '+args[0]+' cannot be found in widget '+widget.name);
return;
}
comp.widget_control.place_x = __get_int(args[1]);
comp.widget_control.place_y = __get_int(args[2]);
comp.widget_control.place_w = __get_int(args[3]);
comp.widget_control.place_h = __get_int(args[4]);
comp.widget_control.place_z = __get_int(args[5]);
comp.widget_control.component_bound = true;
widget_refresh_components_layout(widget.widget_control, false, comp);
}
//
// implementation of core:out install widget
//
function widget_request_install(wid, args)
{
var wid_url = args[0];
/*locate widget with same URL*/
var j, count = WidgetManager.num_widgets;
for (j = 0; j < count; j++) {
var wid = WidgetManager.get(j);
if (wid.url == wid_url) {
if (!wid.in_panel) {
widget_insert_icon(wid);
}
break;
}
}
alert('opening widget '+wid_url);
/*not found, install new widget*/
if (j == count) {
var new_wid = WidgetManager.open(wid_url, null, wid);
if (new_wid==null) return;
widget_insert_icon(new_wid);
}
var ifce = getInterfaceByType(wid, "urn:mpeg:mpegu:schema:widgets:core:out:2010");
if (ifce != null) {
wmjs_core_out_invoke_reply(coreOut.installWidgetMessage, ifce.get_message("installWidget"), wid, 1); // send return code 1 = success
}
}
function widget_migrate_component(wid, args)
{
var comp = wid.get_component(args[0], true);
var ifce = getInterfaceByType(wid, "urn:mpeg:mpegu:schema:widgets:core:out:2010");
if (comp==null) {
log(l_err, 'Component '+args[0]+' cannot be found in widget '+wid.name);
if (ifce != null) {
wmjs_core_out_invoke_reply(coreOut.migrateComponentMessage, ifce.get_message("migrateComponent"), wid, 0);
}
return;
}
comp.widget_control = null;
if (args.length > 1 && args[1] != null) {
alert('Migrating component to ' + UPnP.GetMediaRenderer(parseInt(args[1])).Name);
WidgetManager.migrate_widget(UPnP.GetMediaRenderer(parseInt(args[1])), comp);
widget_close(comp);
} else {
var dlg = select_mpegu_target(new_migrate_callback(comp) );
}
if (ifce != null) {
wmjs_core_out_invoke_reply(coreOut.migrateComponentMessage, ifce.get_message("migrateComponent"), wid, 1); // send return code 1 = success
}
}
function widget_migration_targets(wid, args)
{
var count = UPnP.MediaRenderersCount, codes = new Array(), names = new Array(), descriptions = new Array(), i, i;
for (i = 0; i < count; i++) {
var render = UPnP.GetMediaRenderer(i);
codes.push(""+i);
names.push(render.Name);
descriptions.push(render.HostName +" "+ render.UUID);
}
i = null;
var ifce_count = wid.num_interfaces, j;
for (j = 0; j < ifce_count; j++) {
var ifce = wid.get_interface(j);
if (ifce.type == "urn:mpeg:mpegu:schema:widgets:core:out:2010") {
i = ifce;
break;
}
}
if (i != null) {
wmjs_core_out_invoke_reply(coreOut.requestMigrationTargetsMessage, i.get_message("requestMigrationTargets"),
wid, codes, names, descriptions);
}
}
//
// implementation of core:out activate temporary widget
//
function widget_activate_temporary_widget(wid, args) {
var w = WidgetManager.open(args[0], null);
if (w != null) widget_launch(w);
var ifce = getInterfaceByType(wid, "urn:mpeg:mpegu:schema:widgets:core:out:2010");
if (ifce != null) {
wmjs_core_out_invoke_reply(coreOut.activateTemporaryWidgetMessage, ifce.get_message("activateTemporaryWidget"),
wid, (w != null ? 1 : 0)); // send return code 1 = success
}
}
function setup_extension(extension)
{
var count, i;
/*WidgetManager module not present*/
if (typeof(WidgetManager) == 'undefined') return 0;
/*load MPEG-U*/
Browser.loadScript('mpegu-core.js', true);
widget_manager_init();
extension.icon = 'applications-system.svg';
extension.label = 'Widget Manager';
extension.desc = 'Configure Widgets';
extension.launch = open_widget_manager;
extension.initialize = function(extension) {
WidgetManager.on_widget_remove = widget_remove;
WidgetManager.on_widget_add = widget_insert;
WidgetManager.coreOutSetSize = widget_request_size;
WidgetManager.coreOutShow = widget_request_show;
WidgetManager.coreOutHide = widget_request_hide;
WidgetManager.coreOutRequestActivate = widget_request_activate;
WidgetManager.coreOutRequestDeactivate = widget_request_deactivate;
WidgetManager.coreOutShowNotification = widget_request_notification;
WidgetManager.coreOutPlaceComponent = widget_place_component;
WidgetManager.coreOutGetAttention = widget_request_attention;
WidgetManager.coreOutInstallWidget = widget_request_install;
WidgetManager.coreOutMigrateComponent = widget_migrate_component;
WidgetManager.coreOutRequestMigrationTargets = widget_migration_targets;
WidgetManager.coreOutActivateTemporaryWidget = widget_activate_temporary_widget;
gpacui_show_window(widget_display);
/*restore our widgets*/
count = WidgetManager.num_widgets;
for (i=0; i<count; i++) {
var wid = WidgetManager.get(i);
if (wid == null) continue;
wid.device = null;
wid.device_ip = null;
if (wid.in_panel == true) {
var icon = gpacui_insert_dock_icon(wid.name, widget_get_icon(wid));
icon.widget = wid;
icon.on_click = on_widget_launch;
wid.icon_dock = icon;
}
if (wid.visible) {
widget_launch(wid);
}
}
check_widget_display(display_width, display_height);
}
if (UPnP_Enabled) {
extension.on_upnp_add = function(name, uuid, is_add) {
var i, count;
var show = UPnP.MediaRenderersCount ? 1 : 0;
count = WidgetManager.num_widgets;
for (i=0; i<count; i++) {
wid = WidgetManager.get(i);
if (wid == null) continue;
if (!wid.widget_control) continue;
wid.widget_control.show_remote(show);
}
}
extension.on_media_open = function(url, src_ip) {
if (! WidgetManager.probe(url)) return 0;
var new_wid = WidgetManager.open(url, src_ip);
if (new_wid!=null) {
widget_insert(new_wid);
}
return 1;
}
}
extension.on_resize = check_widget_display;
/*setup all widgets*/
return 1;
}