summaryrefslogtreecommitdiffstats
path: root/js/tablemanager.js
diff options
context:
space:
mode:
authorOndrej Zara <ondrej.zara@firma.seznam.cz>2015-06-12 09:30:51 +0200
committerOndrej Zara <ondrej.zara@firma.seznam.cz>2015-06-12 09:30:51 +0200
commitb3bf2bd8ecc9bd175793f67c46a8319b7d67174c (patch)
treee74aa005861dbd62381cfce3aac1d1acba3728c0 /js/tablemanager.js
parentc5a07ea2b037cc880225defc58ead88c916fa066 (diff)
downloadwwwsqldesigner-b3bf2bd8ecc9bd175793f67c46a8319b7d67174c.zip
wwwsqldesigner-b3bf2bd8ecc9bd175793f67c46a8319b7d67174c.tar.gz
wwwsqldesigner-b3bf2bd8ecc9bd175793f67c46a8319b7d67174c.tar.bz2
js modularized
Diffstat (limited to 'js/tablemanager.js')
-rw-r--r--js/tablemanager.js211
1 files changed, 211 insertions, 0 deletions
diff --git a/js/tablemanager.js b/js/tablemanager.js
new file mode 100644
index 0000000..29f1b6a
--- /dev/null
+++ b/js/tablemanager.js
@@ -0,0 +1,211 @@
+/* --------------------- table manager ------------ */
+
+SQL.TableManager = OZ.Class();
+
+SQL.TableManager.prototype.init = function(owner) {
+ this.owner = owner;
+ this.dom = {
+ container:OZ.$("table"),
+ name:OZ.$("tablename"),
+ comment:OZ.$("tablecomment")
+ };
+ this.selection = [];
+ this.adding = false;
+
+ var ids = ["addtable","removetable","aligntables","cleartables","addrow","edittable","tablekeys"];
+ for (var i=0;i<ids.length;i++) {
+ var id = ids[i];
+ var elm = OZ.$(id);
+ this.dom[id] = elm;
+ elm.value = _(id);
+ }
+
+ var ids = ["tablenamelabel","tablecommentlabel"];
+ for (var i=0;i<ids.length;i++) {
+ var id = ids[i];
+ var elm = OZ.$(id);
+ elm.innerHTML = _(id);
+ }
+
+
+ this.select(false);
+
+ this.save = this.bind(this.save);
+
+ OZ.Event.add("area", "click", this.bind(this.click));
+ OZ.Event.add(this.dom.addtable, "click", this.bind(this.preAdd));
+ OZ.Event.add(this.dom.removetable, "click", this.bind(this.remove));
+ OZ.Event.add(this.dom.cleartables, "click", this.bind(this.clear));
+ OZ.Event.add(this.dom.addrow, "click", this.bind(this.addRow));
+ OZ.Event.add(this.dom.aligntables, "click", this.owner.bind(this.owner.alignTables));
+ OZ.Event.add(this.dom.edittable, "click", this.bind(this.edit));
+ OZ.Event.add(this.dom.tablekeys, "click", this.bind(this.keys));
+ OZ.Event.add(document, "keydown", this.bind(this.press));
+
+ this.dom.container.parentNode.removeChild(this.dom.container);
+}
+
+SQL.TableManager.prototype.addRow = function(e) {
+ var newrow = this.selection[0].addRow(_("newrow"));
+ this.owner.rowManager.select(newrow);
+ newrow.expand();
+}
+
+SQL.TableManager.prototype.select = function(table, multi) { /* activate table */
+ if (table) {
+ if (multi) {
+ var i = this.selection.indexOf(table);
+ if (i < 0) {
+ this.selection.push(table);
+ } else {
+ this.selection.splice(i, 1);
+ }
+ } else {
+ if (this.selection[0] === table) { return; }
+ this.selection = [table];
+ }
+ } else {
+ this.selection = [];
+ }
+ this.processSelection();
+}
+
+SQL.TableManager.prototype.processSelection = function() {
+ var tables = this.owner.tables;
+ for (var i=0;i<tables.length;i++) {
+ tables[i].deselect();
+ }
+ if (this.selection.length == 1) {
+ this.dom.addrow.disabled = false;
+ this.dom.edittable.disabled = false;
+ this.dom.tablekeys.disabled = false;
+ this.dom.removetable.value = _("removetable");
+ } else {
+ this.dom.addrow.disabled = true;
+ this.dom.edittable.disabled = true;
+ this.dom.tablekeys.disabled = true;
+ }
+ if (this.selection.length) {
+ this.dom.removetable.disabled = false;
+ if (this.selection.length > 1) { this.dom.removetable.value = _("removetables"); }
+ } else {
+ this.dom.removetable.disabled = true;
+ this.dom.removetable.value = _("removetable");
+ }
+ for (var i=0;i<this.selection.length;i++) {
+ var t = this.selection[i];
+ t.owner.raise(t);
+ t.select();
+ }
+}
+
+SQL.TableManager.prototype.selectRect = function(x,y,width,height) { /* select all tables intersecting a rectangle */
+ this.selection = [];
+ var tables = this.owner.tables;
+ var x1 = x+width;
+ var y1 = y+height;
+ for (var i=0;i<tables.length;i++) {
+ var t = tables[i];
+ var tx = t.x;
+ var tx1 = t.x+t.width;
+ var ty = t.y;
+ var ty1 = t.y+t.height;
+ if (((tx>=x && tx<x1) || (tx1>=x && tx1<x1) || (tx<x && tx1>x1)) &&
+ ((ty>=y && ty<y1) || (ty1>=y && ty1<y1) || (ty<y && ty1>y1)))
+ { this.selection.push(t); }
+ }
+ this.processSelection();
+}
+
+SQL.TableManager.prototype.click = function(e) { /* finish adding new table */
+ var newtable = false;
+ if (this.adding) {
+ this.adding = false;
+ OZ.DOM.removeClass("area","adding");
+ this.dom.addtable.value = this.oldvalue;
+ var scroll = OZ.DOM.scroll();
+ var x = e.clientX + scroll[0];
+ var y = e.clientY + scroll[1];
+ newtable = this.owner.addTable(_("newtable"),x,y);
+ var r = newtable.addRow("id",{ai:true});
+ var k = newtable.addKey("PRIMARY","");
+ k.addRow(r);
+ }
+ this.select(newtable);
+ this.owner.rowManager.select(false);
+ if (this.selection.length == 1) { this.edit(e); }
+}
+
+SQL.TableManager.prototype.preAdd = function(e) { /* click add new table */
+ if (this.adding) {
+ this.adding = false;
+ OZ.DOM.removeClass("area","adding");
+ this.dom.addtable.value = this.oldvalue;
+ } else {
+ this.adding = true;
+ OZ.DOM.addClass("area","adding");
+ this.oldvalue = this.dom.addtable.value;
+ this.dom.addtable.value = "["+_("addpending")+"]";
+ }
+}
+
+SQL.TableManager.prototype.clear = function(e) { /* remove all tables */
+ if (!this.owner.tables.length) { return; }
+ var result = confirm(_("confirmall")+" ?");
+ if (!result) { return; }
+ this.owner.clearTables();
+}
+
+SQL.TableManager.prototype.remove = function(e) {
+ var titles = this.selection.slice(0);
+ for (var i=0;i<titles.length;i++) { titles[i] = "'"+titles[i].getTitle()+"'"; }
+ var result = confirm(_("confirmtable")+" "+titles.join(", ")+"?");
+ if (!result) { return; }
+ var sel = this.selection.slice(0);
+ for (var i=0;i<sel.length;i++) { this.owner.removeTable(sel[i]); }
+}
+
+SQL.TableManager.prototype.edit = function(e) {
+ this.owner.window.open(_("edittable"), this.dom.container, this.save);
+
+ var title = this.selection[0].getTitle();
+ this.dom.name.value = title;
+ try { /* throws in ie6 */
+ this.dom.comment.value = this.selection[0].getComment();
+ } catch(e) {}
+
+ /* pre-select table name */
+ this.dom.name.focus();
+ if (OZ.ie) {
+ try { /* throws in ie6 */
+ this.dom.name.select();
+ } catch(e) {}
+ } else {
+ this.dom.name.setSelectionRange(0, title.length);
+ }
+}
+
+SQL.TableManager.prototype.keys = function(e) { /* open keys dialog */
+ this.owner.keyManager.open(this.selection[0]);
+}
+
+SQL.TableManager.prototype.save = function() {
+ this.selection[0].setTitle(this.dom.name.value);
+ this.selection[0].setComment(this.dom.comment.value);
+}
+
+SQL.TableManager.prototype.press = function(e) {
+ var target = OZ.Event.target(e).nodeName.toLowerCase();
+ if (target == "textarea" || target == "input") { return; } /* not when in form field */
+
+ if (this.owner.rowManager.selected) { return; } /* do not process keypresses if a row is selected */
+
+ if (!this.selection.length) { return; } /* nothing if selection is active */
+
+ switch (e.keyCode) {
+ case 46:
+ this.remove();
+ OZ.Event.prevent(e);
+ break;
+ }
+}