📄 objects.js
字号:
/* * $Id: objects.js,v 1.1 2006/08/07 10:41:25 source Exp $ * * This file is part of the OpenLink Software Ajax Toolkit (OAT) project. * * Copyright (C) 2006 Ondrej Zara and OpenLink Software * * See LICENSE file for details. *//* objekt abstractParent: setTitle() - zmena textu v _title select(), deselect() - vyber select => je-li vybrano _title => html element _div => html element*/function abstractParent_setTitle(text) { this._title.innerHTML = text;}function abstractParent_destroy() { OAT.Dom.unlink(this._div); if (this._mini) { OAT.Dom.unlink(this._mini); }}function abstractParent_select() { this._div.className = this._div.className + " " + this._div.className + "_selected"; this.selected = true;}function abstractParent_deselect() { this._div.className = this._div.getAttribute("defaultClassName"); this.selected = false;}function abstractParent(className) { this._div = OAT.Dom.create("div"); this._title = OAT.Dom.create("div"); this._title.className = "title"; this._div.className = className; this._div.setAttribute("defaultClassName",className); this._div.appendChild(this._title); this.selected = false; this.select = abstractParent_select; this.deselect = abstractParent_deselect; this.destroy = abstractParent_destroy; this.setTitle = abstractParent_setTitle;}/* objekt Row setPK(), losePK() - primary key setFK(), loseFK() - foreign key setIndex(), loseIndex() - index setNN(), loseNN() - not null setDef() - default updateTitle() - updatne title="xxx" atribut setTitle() - updatne title="xxx" atribut setType() - updatne typ a defaultni hodnotu updateSpecial() - updatne special updateColor() - updatne pozadi dle datoveho typu _special - drzadlo na specialni PK a FK, vpravo pk - je-li primary key fk - je-li foreign key index - je-li index nn - je-li notnull def - defaultni hodnota type - datovy typ (resp. jeho index) spec - delka ci vycet*/function Row_setPK() { var self = this; this.pk = 1; this.setIndex(); this.updateTitle(); this.updateSpecial(); this._title.style.fontWeight = "bold"; var process = function(elm) { var dims = OAT.Dom.getWH(self._div); elm.style.width = dims[0]+"px"; elm.style.zIndex = 100; } var callback = function(target,x,y) { var t = false; for (var i=0;i<table_array.length;i++) if (table_array[i]._div == target) { t = table_array[i]; } if (!t) alert("??"); self.deselect(); self.table.deselect(); table_admin.loseTable(); var t1 = self.table._title.innerHTML; var t2 = self._title.innerHTML; var newtitle = t2 + "_" + t1; var row = t.addRow(newtitle,0); /* new row in this table */ t.select(); t.selectRow(row); table_admin.manageTable(t); row_admin.manageTable(t); row_admin.manageRow(row); row.setFK(); var relation = add_relation(self, "1", row, "∞"); } gd.addSource(this._div,process,callback);}function Row_losePK() { this.pk = 0; this.updateTitle(); this.updateSpecial(); this._title.style.fontWeight = "normal"; gd.delSource(this._div);}function Row_setFK() { this.fk = 1; this.updateTitle(); this.updateSpecial();}function Row_loseFK() { this.fk = 0; this.updateTitle(); this.updateSpecial();}function Row_setNN() { this.nn = 1; this.updateTitle();}function Row_loseNN() { this.nn = 0; this.updateTitle();}function Row_setIndex() { this.index = 1; this.updateTitle(); this._title.style.fontStyle = "italic";}function Row_loseIndex() { this.index = 0; this.updateTitle(); this._title.style.fontStyle = "normal";}function Row_updateTitle() { var str = this._title.innerHTML + ": "; var type = get_data_type(this.type); str += type.name if (type.params != "") { str += "(" + this.spec + ")"; } str += ", default: '" + this.def + "'"; if (this.pk) { str += ", Primary key"; } if (this.fk) { str += ", Foreign key"; } if (this.nn) { str += ", NOT NULL"; } if (this.index) { str += ", Index"; } this._div.setAttribute("title",str); this._title.setAttribute("title",str);}function Row_setDef(value) { this.def = value; this.updateTitle();}function Row_setSpec(value) { this.spec = value; this.updateTitle();}function Row_setType(type) { this.type = parseInt(type); this.def = ""; this.updateTitle(); this.updateColor();}function Row_updateSpecial() { var str = ""; if (this.pk) str += "PK"; if (this.pk && this.fk) str += ","; if (this.fk) str += "FK"; this._special.innerHTML = str;}function Row_updateColor() { for (var i=0;i<SQL_DATA_TYPES.length;i++) { for (var j=0;j<SQL_DATA_TYPES[i].types.length;j++) { if (this.type == SQL_DATA_TYPES[i].types[j].type) { this._div.style.backgroundColor = SQL_DATA_TYPES[i].color; } } }}function Row_updateRelations() { var self = this; for (var i=0;i<relation_array.length;i++) { var rel = relation_array[i]; if (rel.row_1 == self || rel.row_2 == self) { rel.update(); } }}function Row_hideRelations() { var self = this; for (var i=0;i<relation_array.length;i++) { var rel = relation_array[i]; if (rel.row_1 == self || rel.row_2 == self) { rel.hide(); } }}function Row_showRelations() { var self = this; for (var i=0;i<relation_array.length;i++) { var rel = relation_array[i]; if (rel.row_1 == self || rel.row_2 == self) { rel.show(); } }}function Row(title,type) { var self = this; this.base = abstractParent; this.base("row"); this.setPK = Row_setPK; this.losePK = Row_losePK; this.setFK = Row_setFK; this.loseFK = Row_loseFK; this.setIndex = Row_setIndex; this.loseIndex = Row_loseIndex; this.setNN = Row_setNN; this.loseNN = Row_loseNN; this.setType = Row_setType; this.setSpec = Row_setSpec; this.updateTitle = Row_updateTitle; this.updateSpecial = Row_updateSpecial; this.updateColor = Row_updateColor; this.setDef = Row_setDef; this.updateRelations = Row_updateRelations; this.showRelations = Row_showRelations; this.hideRelations = Row_hideRelations; this.setTitle(title); this._title.className = "row_title"; this._special = OAT.Dom.create("div"); this._special.className="special"; this._sipka = OAT.Dom.create("div"); this._sipka.className="sipka"; this._sipka.innerHTML = "» "; this._div.insertBefore(this._special,this._title); this._div.insertBefore(this._sipka,this._title); this.pk = 0; this.fk = 0; this.index = 0; this.def = ""; this.nn = 0; this.spec = ""; this.setType(type); this.updateTitle(); this.updateColor(); this._div.style.height = ROW_HEIGHT+"px"; var downRef = function(event) { self.table.selectRow(self); var callback = function() { row_admin.manageRow(self); } setTimeout(callback,50); } OAT.Dom.attach(self._div,"mousedown",downRef); }/* objekt Relation: update() - upravi pozice na zaklade pozic otcu select(), deselect() - ma svuj vlastni select, neb sestava ze 3 casti hover(), dehover() - ma svuj vlastni hover, neb sestava ze 3 casti parent_1, parent_2 - divy otcovskych tabulek row_1, row_2 - divy relevantnich radek id - id do globalni tabulky*/function Relation_show() { this._div.style.visibility = "visible";}function Relation_hide() { this._div.style.visibility = "hidden";}function Relation_update() { /* prekresleni car: rozlisujeme dva pripady, a) kdyz maji mezi sebou tabulky horizontalni mezeru, b) kdyz ji nemaji */ /* k napozicovani elementu je potreba techto udaju: - start_x, start_y, center_x, start_y - center_x, start_y, center_x, end_y - center_x, end_y, end_x, end_y */ var left_table, right_table, left_row, right_row, left_1, left_2, right_1, right_2, width_1, width_2; var top_table_1, top_table_2, top_row_1, top_row_2; if (parseInt(this.parent_1._div.style.left) < parseInt(this.parent_2._div.style.left)) { left_table = this.parent_1._div; right_table = this.parent_2._div; left_row = this.row_1._div; right_row = this.row_2._div; this.elem_card_left.innerHTML = this.card_1; this.elem_card_right.innerHTML = this.card_2; } else { right_table = this.parent_1._div; left_table = this.parent_2._div; right_row = this.row_1._div; left_row = this.row_2._div; this.elem_card_left.innerHTML = this.card_2; this.elem_card_right.innerHTML = this.card_1; } /* ted uz vime, ktera tabulka ma levou hranu vic vlevo. spocteme dulezita cisla */ left_1 = parseInt(left_table.style.left); /* leva hrana leve tabulky */ left_2 = parseInt(right_table.style.left); /* leva hrana prave tabulky */ width_1 = parseInt(left_table.offsetWidth); /* sirka leve tabulky */ width_2 = parseInt(right_table.offsetWidth); /* sirka prave tabulky */ right_1 = left_1 + width_1; /* prava hrana leve tabulky */ right_2 = left_2 + width_2; /* prava hrana prave tabulky */ top_table_1 = parseInt(left_table.style.top); /* horni hrana leve tabulky */ top_table_2 = parseInt(right_table.style.top); /* horni hrana prave tabulky */ top_row_1 = Math.round(parseInt(left_row.offsetHeight)/2)+parseInt(left_row.offsetTop); /* posun radku v leve tabulce */ top_row_2 = Math.round(parseInt(right_row.offsetHeight)/2)+parseInt(right_row.offsetTop); /* posun radku v prave tabulce */ /* nyni detekce mezery... */ if (right_1 < left_2) { /* tabulky mezi sebou maji mezeru, standardni postup */ var width = left_2 - left_1 - width_1 + RELATION_THICKNESS; var start_x = left_1 + width_1 - RELATION_THICKNESS; var start_y = top_table_1 + top_row_1; var end_x = left_2; var end_y = top_table_2 + top_row_2; var center_x = start_x + Math.round(width / 2); /* korekce kvuli borderu... */ start_x--; this.elem_card_left.style.left = (start_x + 4) + "px"; this.elem_card_right.style.left = (end_x - 10) + "px"; } else { var diff_1 = Math.abs(left_2 - left_1); /* rozdil vlevo */ var diff_2 = Math.abs(right_2 - right_1); /* rozdil vlevo */ if (diff_1 < diff_2 + RELATION_THICKNESS) { /* "ucho" povede vlevo od obou tabulek */ start_x = left_1; start_y = top_table_1 + top_row_1; end_x = left_2; end_y = top_table_2 + top_row_2; center_x = start_x - RELATION_OFFSET; this.elem_card_left.style.left = (start_x - 10) + "px"; this.elem_card_right.style.left = (end_x - 10) + "px"; } else { /* "ucho" povede vpravo od obou tabulek */ start_x = Math.max(right_1, right_2) - RELATION_THICKNESS; start_y = (right_1 > right_2 ? top_table_1 + top_row_1 : top_table_2 + top_row_2); end_x = Math.min(right_1, right_2) - RELATION_THICKNESS; end_y = (right_1 < right_2 ? top_table_1 + top_row_1 : top_table_2 + top_row_2); center_x = start_x + RELATION_OFFSET; /* zde se muze prohodit kardinalita, takze check...*/ if (right_2 >= right_1) { this.elem_card_left.innerHTML = this.card_2; this.elem_card_right.innerHTML = this.card_1; } /* korekce kvuli borderu... */ start_x--; end_x--; this.elem_card_left.style.left = (start_x + 4) + "px"; this.elem_card_right.style.left = (end_x + 4) + "px"; } } /* korekce aby se vesla vesela znamenka kardinality... */ start_y = start_y + 4; end_y = end_y + 4; /* a jedem */ this.elem_1.style.left = Math.min(start_x, center_x) + "px"; this.elem_1.style.top = start_y + "px" this.elem_1.style.width = Math.abs(center_x - start_x) + "px"; this.elem_2.style.left = center_x + "px"; this.elem_2.style.top = Math.min(start_y, end_y) + "px"; this.elem_2.style.height = Math.abs(end_y - start_y) + RELATION_THICKNESS + "px"; this.elem_3.style.left = Math.min(center_x, end_x) + "px"; this.elem_3.style.top = end_y + "px" this.elem_3.style.width = Math.abs(center_x - end_x) + "px"; this.elem_card_left.style.top = (start_y - 12) + "px"; this.elem_card_right.style.top = (end_y - 12) + "px";}function Relation(row_1, card_1, row_2, card_2) { this.base = abstractParent; this.base("relation"); OAT.Dom.unlink(this._title); this.update = Relation_update; /* funkce na aktualizaci car */ this.show = Relation_show; /* ukazani */ this.hide = Relation_hide; /* schovani */ this.parent_1 = row_1.table; /* prvni rodicovska tabulka */ this.parent_2 = row_2.table; /* druha rodicovska tabulka */ this.row_1 = row_1; /* prvni rodicovska radka */ this.row_2 = row_2; /* druha rodicovska radka */ this.elem_1 = OAT.Dom.create("div"); this.elem_2 = OAT.Dom.create("div"); this.elem_3 = OAT.Dom.create("div"); this.elem_1.className = "line"; this.elem_2.className = "line"; this.elem_3.className = "line"; this.elem_1.style.height = RELATION_THICKNESS+"px"; this.elem_2.style.width = RELATION_THICKNESS+"px"; this.elem_3.style.height = RELATION_THICKNESS+"px"; this.elem_card_left = OAT.Dom.create("div"); this.elem_card_right = OAT.Dom.create("div"); this.elem_card_left.className = "card"; this.elem_card_right.className = "card"; this.card_1 = card_1; this.card_2 = card_2; this._div.appendChild(this.elem_1); this._div.appendChild(this.elem_2); this._div.appendChild(this.elem_3); this._div.appendChild(this.elem_card_left); this._div.appendChild(this.elem_card_right); this.cardinality = 1; var tmp = this; var ref=function(event) { /* show relation's properties */ var coords = OAT.Dom.eventPos(event); var x = coords[0]; var y = coords[1]; var props = dialogs.rel_props; props.object = tmp; $("rel_1").innerHTML = tmp.parent_1._title.innerHTML; $("rel_2").innerHTML = tmp.parent_2._title.innerHTML; $("rel_type").selectedIndex = props.object.cardinality; props.show(); } OAT.Dom.attach(this._div,"click",ref); this._div.style.cursor = "crosshair";}/* objekt Table: moveTo() - posun na zadane souradnice addRow() - prida radku removeRow() - odebere radku selectRow() - vybere radku updateWidth() - aktualizuje sirku updateMini() - aktualizuje minimapku updateShadow() - aktualizuje rozbite stiny showRelations() - ukaze relevantni relace hideRelations() - schova relevantni relace rows => pole radku _rows => html drzak radku*/function Table_updateMini() { var w = parseInt(this._div.offsetWidth); var h = parseInt(this._div.offsetHeight); var l = parseInt(this._div.style.left); var t = parseInt(this._div.style.top); this._mini.style.width = Math.round(w * MAP_SIZE / DESK_SIZE) + "px"; this._mini.style.height = Math.round(h * MAP_SIZE / DESK_SIZE) + "px"; this._mini.style.left = Math.round(l * MAP_SIZE / DESK_SIZE) + "px"; this._mini.style.top = Math.round(t * MAP_SIZE / DESK_SIZE) + "px";}function Table_moveTo(x,y) { this._div.style.left = x + "px"; this._div.style.top = y + "px"; this.updateMini();}function Table_addRow(title,type) { var self = this; var row = new Row(title,type); /* to je ona */ row.table = this; this.rows.push(row); /* dame si objekt do pole */ this._rows.appendChild(row._div); /* a pridame i do HTML stromu */ this.updateWidth(); self.updateMini(); self.updateShadow(); for (var i=0;i<self.rows.length;i++) { self.rows[i].updateRelations(); self.rows[i].showRelations(); } return row;}function Table_removeRow(row) { /* neprijdeme tim o nejake pekne relace? */ var list = []; for (var i=0;i<relation_array.length;i++) { var rel = relation_array[i]; if (rel.row_1 == row || rel.row_2 == row) { list.push(rel); } } for (var i=0;i<list.length;i++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -