// Copyright 2014 The ChromeOS IME Authors. All Rights Reserved.
// limitations under the License.
// See the License for the specific language governing permissions and
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// distributed under the License is distributed on an "AS-IS" BASIS,
// Unless required by applicable law or agreed to in writing, software
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// You may obtain a copy of the License at
// you may not use this file except in compliance with the License.
// Licensed under the Apache License, Version 2.0 (the "License");
//
goog.provide('i18n.input.chrome.inputview.Model');
goog.require('goog.array');
goog.require('goog.events.EventTarget');
goog.require('goog.net.jsloader');
goog.require('i18n.input.chrome.inputview.ConditionName');
goog.require('i18n.input.chrome.inputview.Settings');
goog.require('i18n.input.chrome.inputview.SpecNodeName');
goog.require('i18n.input.chrome.inputview.StateManager');
goog.require('i18n.input.chrome.inputview.events.ConfigLoadedEvent');
goog.require('i18n.input.chrome.inputview.events.LayoutLoadedEvent');
goog.scope(function() {
var SpecNodeName = i18n.input.chrome.inputview.SpecNodeName;
/**
* The model.
* @constructor
* @extends {goog.events.EventTarget}
*/
i18n.input.chrome.inputview.Model = function() {
goog.base(this);
/**
* The state manager.
*
* @type {!i18n.input.chrome.inputview.StateManager}
*/
this.stateManager = new i18n.input.chrome.inputview.StateManager();
/**
* The configuration.
*
* @type {!i18n.input.chrome.inputview.Settings}
*/
this.settings = new i18n.input.chrome.inputview.Settings();
/** @private {!Array.<string>} */
this.loadingResources_ = [];
goog.exportSymbol('google.ime.chrome.inputview.onLayoutLoaded',
goog.bind(this.onLayoutLoaded_, this));
goog.exportSymbol('google.ime.chrome.inputview.onConfigLoaded',
goog.bind(this.onConfigLoaded_, this));
};
var Model = i18n.input.chrome.inputview.Model;
goog.inherits(Model, goog.events.EventTarget);
/**
* The path to the layouts directory.
*
* @type {string}
* @private
*/
Model.LAYOUTS_PATH_ =
'/inputview_layouts/';
/**
* The path to the content directory.
*
* @type {string}
* @private
*/
Model.CONTENT_PATH_ =
'/config/';
/**
* Callback when configuration is loaded.
*
* @param {!Object} data The configuration data.
* @private
*/
Model.prototype.onConfigLoaded_ = function(data) {
goog.array.remove(this.loadingResources_, this.getConfigUrl_(
data[SpecNodeName.ID]));
this.dispatchEvent(new i18n.input.chrome.inputview.events.ConfigLoadedEvent(
data));
};
/**
* Gets the layout url.
*
* @param {string} layout .
* @private
* @return {string} The url of the layout data.
*/
Model.prototype.getLayoutUrl_ = function(layout) {
return Model.LAYOUTS_PATH_ + layout + '.js';
};
/**
* Gets the keyset configuration url.
*
* @param {string} keyset .
* @private
* @return {string} .
*/
Model.prototype.getConfigUrl_ = function(keyset) {
// Strips out all the suffixes in the keyboard code.
var configId = keyset.replace(/\..*$/, '');
return Model.CONTENT_PATH_ + configId + '.js';
};
/**
* Callback when layout is loaded.
*
* @param {!Object} data The layout data.
* @private
*/
Model.prototype.onLayoutLoaded_ = function(data) {
goog.array.remove(this.loadingResources_, this.getLayoutUrl_(data[
SpecNodeName.LAYOUT_ID]));
this.dispatchEvent(new i18n.input.chrome.inputview.events.LayoutLoadedEvent(
data));
};
/**
* Loads a layout.
*
* @param {string} layout The layout name.
*/
Model.prototype.loadLayout = function(layout) {
var url = this.getLayoutUrl_(layout);
if (!goog.array.contains(this.loadingResources_, url)) {
this.loadingResources_.push(url);
goog.net.jsloader.load(url);
}
};
/**
* Loads the configuration for the keyboard code.
*
* @param {string} keyboardCode The keyboard code.
*/
Model.prototype.loadConfig = function(keyboardCode) {
var url = this.getConfigUrl_(keyboardCode);
if (!goog.array.contains(this.loadingResources_, url)) {
this.loadingResources_.push(url);
goog.net.jsloader.load(url);
}
};
}); // goog.scope