blob: 771851081ba6075c6a458acdeeb88d22270640f4 [file] [log] [blame]
// Copyright (c) 2000-2017 Ericsson Telecom AB //
// All rights reserved. This program and the accompanying materials are made available under the //
// terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at //
// http://www.eclipse.org/legal/epl-v10.html //
///////////////////////////////////////////////////////////////////////////////////////////////////////
function GuiEditor_ContentEditor_ViewModel(p_model, p_sanityChecker) {
var v_model = p_model;
var v_sanityChecker = p_sanityChecker;
var v_setup;
// we will store the opened FileLoaders in a hashmap whose keys will be the div ids
var v_fileLoaders = {};
// we also store the name-id pairs of the editors, so we can easily check whether a file is already open
var v_nameIds = {};
var v_viewmodelCounter = -1;
var v_viewCounter = -1;
this.setSetup = function(setup) {
v_setup = setup;
};
this.getFileName = function(id) {
return v_fileLoaders[id]["name"];
};
this.isSaveable = function(id) {
return v_fileLoaders[id]["saveable"];
};
this.isEdited = function(id) {
return v_fileLoaders[id]["edited"];
};
this.save = function(p_id, callback) {
var id = p_id;
function saved(ok) {
if (ok) {
v_fileLoaders[id]["edited"] = false;
var url = v_fileLoaders[id]["loader"].getUrl();
if (url.endsWith(".js")) {
v_sanityChecker.addFile(url);
}
}
callback(ok, id);
}
v_fileLoaders[id]["loader"].save(undefined, undefined, saved);
};
function saveAs(p_id, name, url, p_callback) {
var id = p_id;
function saved(ok) {
if (ok) {
v_fileLoaders[id]["saveable"] = true;
v_fileLoaders[id]["edited"] = false;
v_fileLoaders[id]["name"] = name;
if (url.endsWith(".js")) {
v_sanityChecker.addFile(url);
}
}
p_callback(ok, id);
}
v_fileLoaders[id]["loader"].save(undefined, url, saved);
}
function switchId(name, id) {
for (var key in v_nameIds) {
if (v_nameIds.hasOwnProperty(key) && v_nameIds[key] == id) {
v_nameIds[key] = undefined;
v_nameIds[name] = id;
break;
}
}
}
this.saveViewAs = function(id, name, callback) {
var existingId = v_nameIds[name];
if (existingId == id) {
existingId = undefied;
}
function saved(ok) {
if (ok) {
switchId(name, id);
callback(ok, id, existingId);
} else {
callback(ok);
}
}
function SaveTask(p_id, p_url) {
var id = p_id;
var url = p_url;
this.taskOperation = function(p_callback) {
saveAs(id, name, url, p_callback);
}
}
var taskList = new TaskList([
new SaveTask(id + "_Html", v_model.getViewUrl(name + ".html")),
new SaveTask(id + "_Css", v_model.getViewUrl(name + ".css")),
new SaveTask(id + "_Js", v_model.getViewUrl(name + ".js"))
], saved);
taskList.taskOperation();
};
this.saveViewmodelAs = function(id, name, callback) {
if (!name.endsWith(".js")) {
name = name + ".js";
}
var url = v_model.getViewmodelUrl(name);
var existingId = v_nameIds[name];
if (existingId == id) {
existingId = undefied;
}
function saved(ok) {
if (ok) {
switchId(name, id);
callback(ok, id, existingId);
} else {
callback(ok);
}
}
saveAs(id, name, url, saved);
};
this.viewExists = function(name, callback) {
v_model.viewExists(name, callback);
};
this.viewmodelExists = function(name, callback) {
v_model.viewmodelExists(name + ".js", callback);
};
this.editorClosed = function(id) {
for (var key in v_fileLoaders) {
if (v_fileLoaders.hasOwnProperty(key) && key.startsWith(id)) {
v_fileLoaders[key] = undefined;
}
}
for (var name in v_nameIds) {
if (v_nameIds.hasOwnProperty(name) && v_nameIds[name] != undefined && v_nameIds[name].startsWith(id)) {
v_nameIds[name] = undefined;
}
}
};
this.loadViewContent = function(viewName, callback) {
loadView(false, viewName, callback);
};
this.loadViewTemplate = function(viewName, callback) {
loadView(true, viewName, callback);
}
function loadView(template, viewName, callback) {
if (v_nameIds[viewName] != undefined) {
callback(v_nameIds[viewName], viewName, "exists");
return;
}
var url = viewName;
if (!template) {
url = v_model.getViewUrl(viewName);
}
++v_viewCounter;
var id = "GuiEditor_ViewContentEditor_File_" + v_viewCounter;
var saveable = !template;
function LoadTask(id, name, url) {
var v_id = id;
var v_name = name;
var v_url = url;
this.taskOperation = function(callback) {
loadContent(v_id, v_name, saveable, v_url, callback);
}
}
function contentAdded() {
v_nameIds[viewName] = id;
callback(id, viewName, "load");
}
var taskList = new TaskList([
new LoadTask(id + "_Html", viewName + ".html", url + ".html"),
new LoadTask(id + "_Css", viewName + ".css", url + ".css"),
new LoadTask(id + "_Js", viewName + ".js", url + ".js")
], contentAdded);
taskList.taskOperation();
}
this.loadViewmodelContent = function(viewmodelName, callback) {
loadViewmodel(false, viewmodelName, callback);
};
this.loadViewmodelTemplate = function(viewmodelName, callback) {
loadViewmodel(true, viewmodelName, callback);
};
function loadViewmodel(template, viewmodelName, callback) {
if (!viewmodelName.endsWith(".js")) {
viewmodelName += ".js";
}
if (v_nameIds[viewmodelName] != undefined) {
callback(v_nameIds[viewmodelName], viewmodelName, "exists");
return;
}
var url = viewmodelName;
if (!template) {
url = v_model.getViewmodelUrl(viewmodelName);
}
++v_viewmodelCounter;
var id = "GuiEditor_ViewmodelContentEditor_File_" + v_viewmodelCounter + "_Js";
var saveable = !template;
function contentAdded() {
v_nameIds[viewmodelName] = id;
callback(id, viewmodelName, "load");
}
loadContent(id, name, saveable, url, contentAdded);
}
function createContentOptionsFromList(list) {
var result = [];
for (var i = 0; i < list.length; ++i) {
result.push({
"value": list[i],
"text": list[i]
})
}
v_model.sortOptions(result);
return result;
}
function createTemplateOptionsFromList(list) {
var result = [];
for (var i = 0; i < list.length; ++i) {
result.push({
"value": list[i].substring(0, list[i].lastIndexOf(".")),
"text": list[i].substring(list[i].lastIndexOf("/") + 1, list[i].lastIndexOf("."))
})
}
v_model.sortOptions(result);
return result;
}
this.listViewTemplates = function(callback) {
v_model.listViews(function(files) {
callback(createTemplateOptionsFromList(files));
})
};
this.listViewmodelTemplates = function(callback) {
v_model.listViewmodels(function(files) {
callback(createTemplateOptionsFromList(files));
})
};
this.listViews = function(callback) {
v_model.listCustomViews(function(views) {
callback(createContentOptionsFromList(views));
});
};
this.listViewmodels = function(callback) {
v_model.listCustomViewmodels(function(viewmodels) {
callback(createContentOptionsFromList(viewmodels));
});
};
function addNewContent(id, name) {
v_fileLoaders[id] = {
"loader": new FileLoader(undefined, v_model.getFileHandler()),
"saveable": false,
"edited": true,
"name": name
}
}
function loadContent(id, name, saveable, url, callback) {
v_fileLoaders[id] = {
"loader": new FileLoader(url, v_model.getFileHandler()),
"saveable": saveable,
"edited": false,
"name": name
}
v_fileLoaders[id]["loader"].taskOperation(callback);
}
this.deleteView = function(name, callback) {
function deleted(ok) {
var id = v_nameIds[name];
if (ok && id != undefined) {
v_fileLoaders[id + "_Html"]["saveable"] = false;
v_fileLoaders[id + "_Css"]["saveable"] = false;
v_fileLoaders[id + "_Js"]["saveable"] = false;
}
callback(ok, id);
}
function DeleteTask(p_name) {
var v_name = p_name;
this.taskOperation = function(p_callback) {
v_model.deleteFile(v_name, p_callback);
}
}
var taskList = new TaskList([
new DeleteTask(v_model.getViewUrl(name + ".html")),
new DeleteTask(v_model.getViewUrl(name + ".css")),
new DeleteTask(v_model.getViewUrl(name + ".js"))
], deleted);
taskList.taskOperation();
};
this.deleteViewmodel = function(name, callback) {
function deleted(ok) {
var id = v_nameIds[name];
if (ok && id != undefined) {
v_fileLoaders[id]["saveable"] = false;
}
callback(ok, id);
}
v_model.deleteFile(v_model.getViewmodelUrl(name), deleted);
};
this.newViewContent = function(callback) {
++v_viewCounter;
var id = "GuiEditor_ViewContentEditor_File_" + v_viewCounter;
var name = "View_" + v_viewCounter;
addNewContent(id + "_Html", name + ".html");
addNewContent(id + "_Css", name + ".css");
addNewContent(id + "_Js", name + ".js");
v_nameIds[name] = id;
callback(id, name, "new");
};
this.newViewmodelContent = function(callback) {
++v_viewmodelCounter;
var id = "GuiEditor_ViewmodelContentEditor_File_" + v_viewmodelCounter + "_Js";
var name = "Viewmodel_" + v_viewmodelCounter;
addNewContent(id, name + ".js");
v_nameIds[name] = id;
callback(id, name, "new");
};
this.getContent = function(id) {
var content = {};
content.text = v_fileLoaders[id]["loader"].getData();
if (id.endsWith("Html")) {
content.mode = "xml";
} else if (id.endsWith("Css")) {
content.mode = "css";
} else if (id.endsWith("Js")) {
content.mode = "javascript";
}
return content;
};
this.setContent = function(id, content) {
v_fileLoaders[id]["loader"].setData(content);
v_fileLoaders[id]["edited"] = true;
};
}
//# sourceURL=GuiEditor\ViewModels\ViewModel_ContentEditor.js