js画图开发库--mxgraph--[schema-结构定义.html]
<!Doctype html> <html xmlns=http://www.w3.org/1999/xhtml> <head> <meta http-equiv=Content-Type content="text/html;charset=utf-8"> <title>结构定义</title> <!-- 如果本文件的包与src不是在同一个目录,就要将basepath设置到src目录下 --> <script type="text/javascript"> mxBasePath = '../src'; </script> <!-- 引入支持库文件 --> <script type="text/javascript" src="../src/js/mxClient.js"></script> <!-- 示例代码 --> <script type="text/javascript"> // 程序在此方法中启动 function main(container, outline, toolbar, sidebar, status) { // 检查浏览器支持 if (!mxClient.isBrowserSupported()) { mxUtils.error('Browser is not supported!', 200, false); } else { // 指定透明度,颜色和偏移 mxConstants.SHADOW_OPACITY = 0.5; mxConstants.SHADOWCOLOR = '#C0C0C0'; mxConstants.SHADOW_OFFSET_X = 5; mxConstants.SHADOW_OFFSET_Y = 6; // 表的尺寸和位置 mxSwimlane.prototype.imageSize = 20; mxSwimlane.prototype.imageDx = 16; mxSwimlane.prototype.imageDy = 4; // 泳道背景为白色 mxSwimlaneCreateSvg = mxSwimlane.prototype.createSvg; mxSwimlane.prototype.createSvg = function() { var node = mxSwimlaneCreateSvg.apply(this, arguments); this.content.setAttribute('fill', '#FFFFFF'); return node; }; // 阴影效果 mxSwimlaneReconfigure = mxSwimlane.prototype.reconfigure; mxSwimlane.prototype.reconfigure = function(node) { mxSwimlaneReconfigure.apply(this, arguments); if (this.dialect == mxConstants.DIALECT_SVG && this.shadowNode != null) { this.shadowNode.setAttribute('height', this.bounds.height); } }; // 重绘图标位置 mxSwimlaneRedrawSvg = mxSwimlane.prototype.redrawSvg; mxSwimlane.prototype.redrawSvg = function() { mxSwimlaneRedrawSvg.apply(this, arguments); // 阴影 if (this.dialect == mxConstants.DIALECT_SVG && this.shadowNode != null) { this.shadowNode.setAttribute('height', this.bounds.height); } // 表图标位置 if (this.imageNode != null) { this.imageNode.setAttribute('x', this.bounds.x + this.imageDx * this.scale); this.imageNode.setAttribute('y', this.bounds.y + this.imageDy * this.scale); } }; // 在VML中显示表图标的位置 mxSwimlaneRedrawVml = mxSwimlane.prototype.redrawVml; mxSwimlane.prototype.redrawVml = function() { mxSwimlaneRedrawVml.apply(this, arguments); // 表图标的位置 if (this.imageNode != null) { this.imageNode.style.left = Math.floor(this.imageDx * this.scale) + 'px'; this.imageNode.style.top = Math.floor(this.imageDy * this.scale) + 'px'; } }; // 自定义阴影效果 mxSwimlaneCreateVml = mxSwimlane.prototype.createVml; mxSwimlane.prototype.createVml = function() { this.isShadow = false; var node = mxSwimlaneCreateVml.apply(this, arguments); this.shadowNode = document.createElement('v:rect'); // 指定阴影的位置和大小 this.shadowNode.style.left = mxConstants.SHADOW_OFFSET_X + 'px'; this.shadowNode.style.top = mxConstants.SHADOW_OFFSET_Y + 'px'; this.shadowNode.style.width = '100%' this.shadowNode.style.height = '100%' // 阴影填充颜色 var fillNode = document.createElement('v:fill'); this.updateVmlFill(fillNode, mxConstants.SHADOWCOLOR, null, null, mxConstants.SHADOW_OPACITY * 100); this.shadowNode.appendChild(fillNode); // 阴影颜色的深度 this.shadowNode.setAttribute('strokecolor', mxConstants.SHADOWCOLOR); this.shadowNode.setAttribute('strokeweight', (this.strokewidth * this.scale) + 'px'); // 透明度 var strokeNode = document.createElement('v:stroke'); strokeNode.setAttribute('opacity', (mxConstants.SHADOW_OPACITY * 100) + '%'); this.shadowNode.appendChild(strokeNode); node.insertBefore(this.shadowNode, node.firstChild); // 泳道背景颜色 this.content.setAttribute('fillcolor', 'white'); this.content.setAttribute('filled', 'true'); // 内容区透明度 if (this.opacity != null) { var contentFillNode = document.createElement('v:fill'); contentFillNode.setAttribute('opacity', this.opacity + '%'); this.content.appendChild(contentFillNode); } return node; }; // 定义新的连接的图标。这将自动禁用高亮显示的元素。 mxConnectionHandler.prototype.connectImage = new mxImage('images/connector.gif', 16, 16); // 读取字段中出现的图像 var keyImage = new Image(); keyImage.src = "images/key.png"; var plusImage = new Image(); plusImage.src = "images/plus.png"; var checkImage = new Image(); checkImage.src = "images/check.png"; // IE浏览器添加样式 if (mxClient.IS_QUIRKS) { document.body.style.overflow = 'hidden'; new mxDivResizer(container); new mxDivResizer(outline); new mxDivResizer(toolbar); new mxDivResizer(sidebar); new mxDivResizer(status); } // 创建编辑器 var editor = new mxEditor(); var graph = editor.graph; var model = graph.model; // 禁用一些全局变量 graph.setConnectable(true); graph.setCellsDisconnectable(false); graph.setCellsCloneable(false); graph.swimlaneNesting = false; graph.dropEnabled = true; // 不允许连接线晃动 graph.setAllowDanglingEdges(true); // 使用默认连接处理程序 graph.connectionHandler.factoryMethod = null; // 表只能调整大小 graph.isCellResizable = function(cell) { return this.isSwimlane(cell); }; // 表只能移动 graph.isCellMovable = function(cell) { return this.isSwimlane(cell); }; // 设置图形容器,并配置编辑器 editor.setGraphContainer(container); var config = mxUtils.load( 'editors/config/keyhandler-minimal.xml'). getDocumentElement(); editor.configure(config); // 配置表列自动布局 editor.layoutSwimlanes = true; editor.createSwimlaneLayout = function () { var layout = new mxStackLayout(this.graph, false); layout.fill = true; layout.resizeParent = true; // 覆盖函数永远返回 true layout.isVertexMovable = function(cell) { return true; }; return layout; }; // 对象创建将显示文本提示标签 graph.model.valueForCellChanged = function(cell, value) { if (value.name != null) { return mxGraphModel.prototype.valueForCellChanged.apply(this, arguments); } else { var old = cell.value.name; cell.value.name = value; return old; } }; // 表列是动态创建的 graph.isHtmlLabel = function(cell) { return !this.isSwimlane(cell) && !this.model.isEdge(cell); }; // 连接线不可编辑 graph.isCellEditable = function(cell) { return !this.model.isEdge(cell); }; // 返回元素的名称 graph.convertValueToString = function(cell) { if (cell.value != null && cell.value.name != null) { return cell.value.name; } return mxGraph.prototype.convertValueToString.apply(this, arguments); // "supercall" }; // 返回元素类型 graph.getTooltip = function(state) { if (this.isHtmlLabel(state.cell)) { return 'Type: '+state.cell.value.type; } else if (this.model.isEdge(state.cell)) { var source = this.model.getTerminal(state.cell, true); var parent = this.model.getParent(source); return parent.value.name+'.'+source.value.name; } return mxGraph.prototype.getTooltip.apply(this, arguments); // "supercall" }; // 动态创建标签 graph.getLabel = function(cell) { if (this.isHtmlLabel(cell)) { var label = ''; if (cell.value.primaryKey) { label += '<img title="Primary Key" src="images/key.png" width="16" height="16" align="top"> '; } else { label += '<img src="images/spacer.gif" width="16" height="1"> '; } if (cell.value.autoIncrement) { label += '<img title="Auto Increment" src="images/plus.png" width="16" height="16" align="top"> '; } else if (cell.value.unique) { label += '<img title="Unique" src="images/check.png" width="16" height="16" align="top"> '; } else { label += '<img src="images/spacer.gif" width="16" height="1"> '; } return label + mxUtils.htmlEntities(cell.value.name, false) + ': ' + mxUtils.htmlEntities(cell.value.type, false); } return mxGraph.prototype.getLabel.apply(this, arguments); // "supercall" }; // 如果连接线被删除,删除顶点元素 graph.addListener(mxEvent.REMOVE_CELLS, function(sender, evt) { var cells = evt.getProperty('cells'); for (var i = 0; i < cells.length; i++) { var cell = cells[i]; if (this.model.isEdge(cell)) { var terminal = this.model.getTerminal(cell, true); var parent = this.model.getParent(terminal); this.model.remove(terminal); } } }); // 禁用拖动 graph.isValidDropTarget = function(cell, cells, evt) { return this.isSwimlane(cell); }; // 添加一个下拉菜单 graph.panningHandler.factoryMethod = function(menu, cell, evt) { createPopupMenu(editor, graph, menu, cell, evt); }; // 添加所有样式 configureStylesheet(graph); // 添加表对象的侧边栏图标 var tableObject = new Table('TABLENAME'); var table = new mxCell(tableObject, new mxGeometry(0, 0, 200, 28), 'table'); table.setVertex(true); addSidebarIcon(graph, sidebar, table, 'images/icons48/table.png'); // 添加表对象的侧边栏图标 var columnObject = new Column('COLUMNNAME'); var column = new mxCell(columnObject, new mxGeometry(0, 0, 0, 26)); column.setVertex(true); column.setConnectable(false); addSidebarIcon(graph, sidebar, column, 'images/icons48/column.png'); // 添加主键字段 var firstColumn = column.clone(); firstColumn.value.name = 'TABLENAME_ID'; firstColumn.value.type = 'INTEGER'; firstColumn.value.primaryKey = true; firstColumn.value.autoIncrement = true; table.insert(firstColumn); // 添加子列的新表与表之间的连接 graph.addEdge = function(edge, parent, source, target, index) { // Finds the primary key child of the target table var primaryKey = null; var childCount = this.model.getChildCount(target); for (var i=0; i < childCount; i++) { var child = this.model.getChildAt(target, i); if (child.value.primaryKey) { primaryKey = child; break; } } if (primaryKey == null) { mxUtils.alert('Target table must have a primary key'); return; } this.model.beginUpdate(); try { var col1 = this.model.cloneCell(column); col1.value.name = primaryKey.value.name; col1.value.type = primaryKey.value.type; this.addCell(col1, source); source = col1; target = primaryKey; return mxGraph.prototype.addEdge.apply(this, arguments); // "supercall" } finally { this.model.endUpdate(); } return null; }; // 在一个半透明的小框显示提示。 var hints = document.createElement('div'); hints.style.position = 'absolute'; hints.style.overflow = 'hidden'; hints.style.width = '230px'; hints.style.bottom = '56px'; hints.style.height = '86px'; hints.style.right = '20px'; hints.style.background = 'black'; hints.style.color = 'white'; hints.style.fontFamily = 'Arial'; hints.style.fontSize = '10px'; hints.style.padding = '4px'; mxUtils.setOpacity(hints, 50); mxUtils.writeln(hints, '- Drag an image from the sidebar to the graph'); mxUtils.writeln(hints, '- Doubleclick on a table or column to edit'); mxUtils.writeln(hints, '- Shift- or Rightclick and drag for panning'); mxUtils.writeln(hints, '- Move the mouse over a cell to see a tooltip'); mxUtils.writeln(hints, '- Click and drag a table to move and connect'); mxUtils.writeln(hints, '- Shift- or Rightclick to show a popup menu'); document.body.appendChild(hints); // 创建工具栏并添加工具按钮 var spacer = document.createElement('div'); spacer.style.display = 'inline'; spacer.style.padding = '8px'; addToolbarButton(editor, toolbar, 'properties', 'Properties', 'editors/images/properties.gif'); // 定义新的导出动作 editor.addAction('properties', function(editor, cell) { if (cell == null) { cell = graph.getSelectionCell(); } if (graph.isHtmlLabel(cell)) { showProperties(graph, cell); } }); addToolbarButton(editor, toolbar, 'delete', 'Delete', 'images/delete2.png'); toolbar.appendChild(spacer.cloneNode(true)); addToolbarButton(editor, toolbar, 'undo', '', 'images/undo.png'); addToolbarButton(editor, toolbar, 'redo', '', 'images/redo.png'); toolbar.appendChild(spacer.cloneNode(true)); addToolbarButton(editor, toolbar, 'show', 'Show', 'images/camera.png'); addToolbarButton(editor, toolbar, 'print', 'Print', 'images/printer.png'); toolbar.appendChild(spacer.cloneNode(true)); // 定义导出SQL 动作 editor.addAction('showSql', function(editor, cell) { var sql = createSql(graph); if (sql.length > 0) { var textarea = document.createElement('textarea'); textarea.style.width = '400px'; textarea.style.height = '400px'; textarea.value = sql; showModalWindow('SQL', textarea, 410, 440); } else { mxUtils.alert('Schema is empty'); } }); // 定义导出动作 editor.addAction('createGears', function(editor, cell) { var sql = createSql(graph); if (sql.length > 0) { loadGoogleGears(); try { var db = google.gears.factory.create('beta.database', '1.0'); var name = mxUtils.prompt('Enter name of new database', 'MyDatabase'); if (name != null) { db.open(name); // Checks if database is empty var rs = db.execute('SELECT * FROM sqlite_master'); if (rs.isValidRow()) { if (mxUtils.confirm(name+' exists. Do you want to continue? This will replace existing tables.') == 0) { return; } } try { db.execute(sql); mxUtils.alert(name+' successfully created'); } catch (e) { mxUtils.alert('SQL Error: '+e.message); } } } catch (e) { mxUtils.alert('Google Gears is not available: '+e.message); } } else { mxUtils.alert('Schema is empty'); } }); addToolbarButton(editor, toolbar, 'showSql', 'Show SQL', 'images/export1.png'); addToolbarButton(editor, toolbar, 'createGears', 'Create in Google Gears', 'images/export1.png'); toolbar.appendChild(spacer.cloneNode(true)); // Defines export XML action editor.addAction('export', function(editor, cell) { var textarea = document.createElement('textarea'); textarea.style.width = '400px'; textarea.style.height = '400px'; var enc = new mxCodec(mxUtils.createXmlDocument()); var node = enc.encode(editor.graph.getModel()); textarea.value = mxUtils.getPrettyXml(node); showModalWindow('XML', textarea, 410, 440); }); addToolbarButton(editor, toolbar, 'export', 'Export XML', 'images/export1.png'); // 在底部的状态栏添加工具栏按钮 addToolbarButton(editor, status, 'collapseAll', 'Collapse All', 'images/navigate_minus.png', true); addToolbarButton(editor, status, 'expandAll', 'Expand All', 'images/navigate_plus.png', true); status.appendChild(spacer.cloneNode(true)); addToolbarButton(editor, status, 'zoomIn', '', 'images/zoom_in.png', true); addToolbarButton(editor, status, 'zoomOut', '', 'images/zoom_out.png', true); addToolbarButton(editor, status, 'actualSize', '', 'images/view_1_1.png', true); addToolbarButton(editor, status, 'fit', '', 'images/fit_to_size.png', true); // 创建提示 var outln = new mxOutline(graph, outline); // Fades-out the splash screen after the UI has been loaded. var splash = document.getElementById('splash'); if (splash != null) { try { mxEvent.release(splash); mxEffects.fadeOut(splash, 100, true); } catch (e) { // mxUtils is not available (library not loaded) splash.parentNode.removeChild(splash); } } } } function addToolbarButton(editor, toolbar, action, label, image, isTransparent) { var button = document.createElement('button'); button.style.fontSize = '10'; if (image != null) { var img = document.createElement('img'); img.setAttribute('src', image); img.style.width = '16px'; img.style.height = '16px'; img.style.verticalAlign = 'middle'; img.style.marginRight = '2px'; button.appendChild(img); } if (isTransparent) { button.style.background = 'transparent'; button.style.color = '#FFFFFF'; button.style.border = 'none'; } mxEvent.addListener(button, 'click', function(evt) { editor.execute(action); }); mxUtils.write(button, label); toolbar.appendChild(button); }; function showModalWindow(title, content, width, height) { var background = document.createElement('div'); background.style.position = 'absolute'; background.style.left = '0px'; background.style.top = '0px'; background.style.right = '0px'; background.style.bottom = '0px'; background.style.background = 'black'; mxUtils.setOpacity(background, 50); document.body.appendChild(background); if (mxClient.IS_QUIRKS) { new mxDivResizer(background); } var x = Math.max(0, document.body.scrollWidth/2-width/2); var y = Math.max(10, (document.body.scrollHeight || document.documentElement.scrollHeight)/2-height*2/3); var wnd = new mxWindow(title, content, x, y, width, height, false, true); wnd.setClosable(true); // Fades the background out after after the window has been closed wnd.addListener(mxEvent.DESTROY, function(evt) { mxEffects.fadeOut(background, 50, true, 10, 30, true); }); wnd.setVisible(true); return wnd; }; function addSidebarIcon(graph, sidebar, prototype, image) { // Function that is executed when the image is dropped on // the graph. The cell argument points to the cell under // the mousepointer if there is one. var funct = function(graph, evt, cell) { graph.stopEditing(false); var pt = graph.getPointForEvent(evt); var parent = graph.getDefaultParent(); var model = graph.getModel(); var isTable = graph.isSwimlane(prototype); var name = null; if (!isTable) { var offset = mxUtils.getOffset(graph.container); parent = graph.getSwimlaneAt(evt.clientX-offset.x, evt.clientY-offset.y); var pstate = graph.getView().getState(parent); if (parent == null || pstate == null) { mxUtils.alert('Drop target must be a table'); return; } pt.x -= pstate.x; pt.y -= pstate.y; var columnCount = graph.model.getChildCount(parent)+1; name = mxUtils.prompt('Enter name for new column', 'COLUMN'+columnCount); } else { var tableCount = 0; var childCount = graph.model.getChildCount(parent); for (var i=0; i<childCount; i++) { if (!graph.model.isEdge(graph.model.getChildAt(parent, i))) { tableCount++; } } graph.model.getChildCount(parent)+1; var name = mxUtils.prompt('Enter name for new table', 'TABLE'+(tableCount+1)); } if (name != null) { var v1 = model.cloneCell(prototype); model.beginUpdate(); try { v1.value.name = name; v1.geometry.x = pt.x; v1.geometry.y = pt.y; graph.addCell(v1, parent); if (isTable) { v1.geometry.alternateBounds = new mxRectangle(0, 0, v1.geometry.width, v1.geometry.height); v1.children[0].value.name = name + '_ID'; } } finally { model.endUpdate(); } graph.setSelectionCell(v1); } } // 创建拖动源图标 var img = document.createElement('img'); img.setAttribute('src', image); img.style.width = '48px'; img.style.height = '48px'; img.title = 'Drag this to the diagram to create a new vertex'; sidebar.appendChild(img); // 创建拖动源预览图标 var dragImage = img.cloneNode(true); var ds = mxUtils.makeDraggable(img, graph, funct, dragImage); // 高亮效果 ds.highlightDropTargets = true; ds.getDropTarget = function(graph, x, y) { if (graph.isSwimlane(prototype)) { return null; } else { var cell = graph.getCellAt(x, y); if (graph.isSwimlane(cell)) { return cell; } else { var parent = graph.getModel().getParent(cell); if (graph.isSwimlane(parent)) { return parent; } } } }; }; function configureStylesheet(graph) { var style = new Object(); style[mxConstants.STYLE_SHAPE] = mxConstants.SHAPE_RECTANGLE; style[mxConstants.STYLE_PERIMETER] = mxPerimeter.RectanglePerimeter; style[mxConstants.STYLE_ALIGN] = mxConstants.ALIGN_LEFT; style[mxConstants.STYLE_VERTICAL_ALIGN] = mxConstants.ALIGN_MIDDLE; style[mxConstants.STYLE_FONTCOLOR] = '#000000'; style[mxConstants.STYLE_FONTSIZE] = '11'; style[mxConstants.STYLE_FONTSTYLE] = 0; style[mxConstants.STYLE_SPACING_LEFT] = '4'; style[mxConstants.STYLE_IMAGE_WIDTH] = '48'; style[mxConstants.STYLE_IMAGE_HEIGHT] = '48'; graph.getStylesheet().putDefaultVertexStyle(style); style = new Object(); style[mxConstants.STYLE_SHAPE] = mxConstants.SHAPE_SWIMLANE; style[mxConstants.STYLE_PERIMETER] = mxPerimeter.RectanglePerimeter; style[mxConstants.STYLE_ALIGN] = mxConstants.ALIGN_CENTER; style[mxConstants.STYLE_VERTICAL_ALIGN] = mxConstants.ALIGN_TOP; style[mxConstants.STYLE_GRADIENTCOLOR] = '#41B9F5'; style[mxConstants.STYLE_FILLCOLOR] = '#8CCDF5'; style[mxConstants.STYLE_STROKECOLOR] = '#1B78C8'; style[mxConstants.STYLE_FONTCOLOR] = '#000000'; style[mxConstants.STYLE_STROKEWIDTH] = '2'; style[mxConstants.STYLE_STARTSIZE] = '28'; style[mxConstants.STYLE_VERTICAL_ALIGN] = 'middle'; style[mxConstants.STYLE_FONTSIZE] = '12'; style[mxConstants.STYLE_FONTSTYLE] = 1; style[mxConstants.STYLE_IMAGE] = 'images/icons48/table.png'; // 如果启用了阴影 //style[mxConstants.STYLE_OPACITY] = '80'; style[mxConstants.STYLE_SHADOW] = 1; graph.getStylesheet().putCellStyle('table', style); style = graph.stylesheet.getDefaultEdgeStyle(); style[mxConstants.STYLE_LABEL_BACKGROUNDCOLOR] = '#FFFFFF'; style[mxConstants.STYLE_STROKEWIDTH] = '2'; style[mxConstants.STYLE_ROUNDED] = true; style[mxConstants.STYLE_EDGE] = mxEdgeStyle.EntityRelation; }; // 创建下拉菜单 function createPopupMenu(editor, graph, menu, cell, evt) { if (cell != null) { if (graph.isHtmlLabel(cell)) { menu.addItem('Properties', 'editors/images/properties.gif', function() { editor.execute('properties', cell); }); menu.addSeparator(); } menu.addItem('Delete', 'images/delete2.png', function() { editor.execute('delete', cell); }); menu.addSeparator(); } menu.addItem('Undo', 'images/undo.png', function() { editor.execute('undo', cell); }); menu.addItem('Redo', 'images/redo.png', function() { editor.execute('redo', cell); }); menu.addSeparator(); menu.addItem('Show SQL', 'images/export1.png', function() { editor.execute('showSql', cell); }); }; // 显示属性栏 function showProperties(graph, cell) { // Creates a form for the user object inside // the cell var form = new mxForm('properties'); // Adds a field for the columnname var nameField = form.addText('Name', cell.value.name); var typeField = form.addText('Type', cell.value.type); var primaryKeyField = form.addCheckbox('Primary Key', cell.value.primaryKey); var autoIncrementField = form.addCheckbox('Auto Increment', cell.value.autoIncrement); var notNullField = form.addCheckbox('Not Null', cell.value.notNull); var uniqueField = form.addCheckbox('Unique', cell.value.unique); var defaultField = form.addText('Default', cell.value.defaultValue || ''); var useDefaultField = form.addCheckbox('Use Default', (cell.value.defaultValue != null)); var wnd = null; // 定义下一步按钮 var okFunction = function() { var clone = cell.value.clone(); clone.name = nameField.value; clone.type = typeField.value; if (useDefaultField.checked) { clone.defaultValue = defaultField.value; } else { clone.defaultValue = null; } clone.primaryKey = primaryKeyField.checked; clone.autoIncrement = autoIncrementField.checked; clone.notNull = notNullField.checked; clone.unique = uniqueField.checked; graph.model.setValue(cell, clone); wnd.destroy(); } // 定义上一步按钮 var cancelFunction = function() { wnd.destroy(); } form.addButtons(okFunction, cancelFunction); var parent = graph.model.getParent(cell); var name = parent.value.name + '.' + cell.value.name; wnd = showModalWindow(name, form.table, 240, 240); }; function createSql(graph) { var sql = []; var parent = graph.getDefaultParent(); var childCount = graph.model.getChildCount(parent); for (var i=0; i<childCount; i++) { var child = graph.model.getChildAt(parent, i); if (!graph.model.isEdge(child)) { sql.push('CREATE TABLE IF NOT EXISTS '+child.value.name+' ('); var columnCount = graph.model.getChildCount(child); if (columnCount > 0) { for (var j=0; j<columnCount; j++) { var column = graph.model.getChildAt(child, j).value; sql.push('\n '+column.name+' '+column.type); if (column.notNull) { sql.push(' NOT NULL'); } if (column.primaryKey) { sql.push(' PRIMARY KEY'); } if (column.autoIncrement) { sql.push(' AUTOINCREMENT'); } if (column.unique) { sql.push(' UNIQUE'); } if (column.defaultValue != null) { sql.push(' DEFAULT '+column.defaultValue); } sql.push(','); } sql.splice(sql.length-1, 1); sql.push('\n);'); } sql.push('\n'); } } return sql.join(''); }; //加载google配置 function loadGoogleGears() { // We are already defined. Hooray! if (window.google && google.gears) { return; } var factory = null; // Firefox if (typeof GearsFactory != 'undefined') { factory = new GearsFactory(); } else { // IE try { factory = new ActiveXObject('Gears.Factory'); } catch (e) { // Safari if (navigator.mimeTypes["application/x-googlegears"]) { factory = document.createElement("object"); factory.style.display = "none"; factory.width = 0; factory.height = 0; factory.type = "application/x-googlegears"; document.documentElement.appendChild(factory); } } } // *Do not* define any objects if Gears is not installed. This mimics the // behavior of Gears defining the objects in the future. if (!factory) { return; } // Now set up the objects, being careful not to overwrite anything. if (!window.google) { window.google = {}; } if (!google.gears) { google.gears = {factory: factory}; } }; // 定义字段 function Column(name) { this.name = name; }; Column.prototype.type = 'TEXT'; Column.prototype.defaultValue = null; Column.prototype.primaryKey = false; Column.prototype.autoIncrement = false; Column.prototype.notNull = false; Column.prototype.unique = false; Column.prototype.clone = function() { return mxUtils.clone(this); }; // 定义表 function Table(name) { this.name = name; }; Table.prototype.clone = function() { return mxUtils.clone(this); }; </script> </head> <!-- 页面载入时启动程序 --> <body onload="main(document.getElementById('graphContainer'), document.getElementById('outlineContainer'), document.getElementById('toolbarContainer'), document.getElementById('sidebarContainer'), document.getElementById('statusContainer'));"> <!-- 创建容器的启动画面 --> <div id="splash" style="position:absolute;top:0px;left:0px;width:100%;height:100%;background:white;z-index:1;"> <center id="splash" style="padding-top:230px;"> <img src="editors/images/loading.gif"> </center> </div> <!-- 创建容器侧边栏 --> <div id="toolbarContainer" style="position:absolute;white-space:nowrap;overflow:hidden;top:0px;left:0px;max-height:24px;height:36px;right:0px;padding:6px;background-image:url('images/toolbar_bg.gif');"> </div> <!-- 创建容器的工具箱 --> <div id="sidebarContainer" style="position:absolute;overflow:hidden;top:36px;left:0px;bottom:36px;max-width:52px;width:56px;padding-top:10px;padding-left:4px;background-image:url('images/sidebar_bg.gif');"> </div> <!-- 创建图形容器--> <div id="graphContainer" style="position:absolute;overflow:hidden;top:36px;left:60px;bottom:36px;right:0px;"> </div> <!-- 创建导航框--> <div id="outlineContainer" style="position:absolute;overflow:hidden;top:36px;right:0px;width:200px;height:140px;background:transparent;border-style:solid;border-color:black;"> </div> <!-- 创建容器侧边栏 --> <div id="statusContainer" style="text-align:right;position:absolute;overflow:hidden;bottom:0px;left:0px;max-height:24px;height:36px;right:0px;color:white;padding:6px;background-image:url('images/toolbar_bg.gif');"> <div style="font-size:10pt;float:left;"> Created with <a href="http://www.jgraph.com" target="_blank">mxGraph</a> </div> </div> </body> </html>