cordova-plugin-wizviewmanager
Version:
This plugin allows managing multiple webviews in a single application.
163 lines (124 loc) • 4.63 kB
JavaScript
/* WizViewManager for cordova - Handle Views create/remove/show/hide etc.
*
* @author Ally Ogilvie
* @copyright Wizcorp Inc. [ Incorporated Wizards ] 2013
* @file - wizViewManager.js
* @about - JavaScript cordova bridge for view management
*
*
*/
var exec = require("cordova/exec");
function propsToString(obj) {
// stringify all vars
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
obj[i] = '' + obj[i];
}
}
}
var WizViewManager = function (name) {
this.name = name;
this.views = {};
};
// View for Cordova
var View = function (name) {
this.name = name;
}
View.prototype.postMessage = function (message) {
cordova.exec(null, null, "WizViewManager", "postMessage", [message, this.name]);
};
View.create = function (name, options, success, failure) {
propsToString(options);
cordova.exec(success, failure, "WizViewManager", "createView", [name, options]);
};
View.prototype.remove = function (success, failure) {
cordova.exec(success, failure, "WizViewManager", "removeView", [this.name]);
};
View.prototype.show = function (animOptions, success, failure) {
cordova.exec(success, failure, "WizViewManager", "showView", [this.name, animOptions]);
};
View.prototype.hide = function (animOptions, success, failure) {
cordova.exec(success, failure, "WizViewManager", "hideView", [this.name, animOptions]);
};
View.prototype.load = function (source, success, failure) {
cordova.exec(success, failure, "WizViewManager", "load", [this.name, { src: source }]);
};
View.prototype.setLayout = function (options, success, failure) {
propsToString(options);
cordova.exec(success, failure, "WizViewManager", "setLayout", [this.name, options]);
};
WizViewManager.prototype.receivedMessage = function (message, senderName) {
// for more information on the MessageEvent API, see:
// http://www.w3.org/TR/2008/WD-html5-20080610/comms.html
var sender = this.views[senderName];
var event = document.createEvent('MessageEvent');
event.initMessageEvent('typeArg???', true, true, message, senderName, '', sender);
window.dispatchEvent(event);
};
WizViewManager.prototype.throwError = function (cb, error) {
if (cb) {
cb(error);
} else {
throw error;
}
};
WizViewManager.prototype.create = function (name, options, success, failure) {
if (!View.create) {
return this.throwError(failure, new Error('The create API is not implemented, while trying to create: ' + name));
}
var views = this.views;
// wrap around the success callback, so we can return a View instance
function successWrapper() {
var view = new View(name);
views[name] = view;
success(view);
}
View.create(name, options, successWrapper, failure);
};
WizViewManager.prototype.show = function (name, animOptions, success, failure) {
if (!this.views[name]) {
return this.throwError(failure, new Error('Show Error with view name: ' + name + '. View does not exist'));
}
this.views[name].show(animOptions, success, failure);
};
WizViewManager.prototype.hide = function (name, animOptions, success, failure) {
if (!this.views[name]) {
return this.throwError(failure, new Error('Hide Error with view name: ' + name + '. View does not exist'));
}
this.views[name].hide(animOptions, success, failure);
};
WizViewManager.prototype.remove = function (name, success, failure) {
if (!this.views[name]) {
return this.throwError(failure, new Error('Hide Error with view name: ' + name + '. View does not exist'));
}
this.views[name].remove(success, failure);
};
WizViewManager.prototype.setLayout = function (name, animOptions, success, failure) {
if (!this.views[name]) {
return this.throwError(failure, new Error('Set Layout Error with view name: ' + name + '. View does not exist'));
}
this.views[name].setLayout(animOptions, success, failure);
};
WizViewManager.prototype.load = function (name, source, success, failure) {
if (!this.views[name]) {
return this.throwError(failure, new Error('Load Error with view name: ' + name + '. View does not exist'));
}
this.views[name].load(source, success, failure);
};
WizViewManager.prototype.updateViewList = function (list) {
// check for removed views
for (var name in this.views) {
if (list.indexOf(name) === -1) {
delete this.views[name];
}
}
// check for new views
for (var i = 0; i < list.length; i++) {
var name = list[i];
if (!this.views[name]) {
this.views[name] = new View(name);
}
}
};
// instantiate the wizViewManager (always named "mainView" in Cordova)
module.exports = new WizViewManager('mainView');