123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- /**
- * Parse SQL CREATE TABLE. Simple initial version for community to improve.
- */
- Draw.loadPlugin(function(ui)
- {
- // LATER: REFERENCES and PRIMARY KEY
- var div = document.createElement('div');
- div.style.userSelect = 'none';
- div.style.overflow = 'hidden';
- div.style.padding = '10px';
- div.style.height = '100%';
- var graph = ui.editor.graph;
- var sqlInput = document.createElement('textarea');
- sqlInput.style.height = '200px';
- sqlInput.style.width = '100%';
- sqlInput.value = 'CREATE TABLE Persons\n(\nPersonID int,\nLastName varchar(255),\n' +
- 'FirstName varchar(255),\nAddress varchar(255),\nCity varchar(255)\n);';
- mxUtils.br(div);
- div.appendChild(sqlInput);
-
- var graph = ui.editor.graph;
-
- // Extends Extras menu
- mxResources.parse('fromSql=From SQL');
- var wnd = new mxWindow(mxResources.get('fromSql'), div, document.body.offsetWidth - 480, 140,
- 320, 300, true, true);
- wnd.destroyOnClose = false;
- wnd.setMaximizable(false);
- wnd.setResizable(false);
- wnd.setClosable(true);
- function parseSql(text)
- {
- var lines = text.split('\n');
- var tableCell = null;
- var rows = null;
- var cells = [];
- var dx = 0;
- for (var i = 0; i < lines.length; i++)
- {
- var tmp = mxUtils.trim(lines[i]);
-
- if (tmp.substring(0, 12).toLowerCase() == 'create table')
- {
- var name = mxUtils.trim(tmp.substring(12));
-
- if (name.charAt(name.length - 1) == '(')
- {
- name = name.substring(0, name.lastIndexOf(' '));
- }
-
- tableCell = new mxCell(name, new mxGeometry(dx, 0, 160, 26),
- 'swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#e0e0e0;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;swimlaneFillColor=#ffffff;align=center;');
- tableCell.vertex = true;
- cells.push(tableCell);
-
- var size = ui.editor.graph.getPreferredSizeForCell(rowCell);
-
- if (size != null)
- {
- tableCell.geometry.width = size.width + 10;
- }
-
- // For primary key lookups
- rows = {};
- }
- else if (tableCell != null && tmp.charAt(0) == ')')
- {
- dx += tableCell.geometry.width + 40;
- tableCell = null;
- }
- else if (tmp != '(' && tableCell != null)
- {
- var name = tmp.substring(0, (tmp.charAt(tmp.length - 1) == ',') ? tmp.length - 1 : tmp.length);
-
- if (name.substring(0, 11).toLowerCase() != 'primary key')
- {
- var rowCell = new mxCell(name, new mxGeometry(0, 0, 90, 26),
- 'shape=partialRectangle;top=0;left=0;right=0;bottom=0;align=left;verticalAlign=top;spacingTop=-2;fillColor=none;spacingLeft=34;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;');
- rowCell.vertex = true;
-
- var left = sb.cloneCell(rowCell, '' /* eg. PK */);
- left.connectable = false;
- left.style = 'shape=partialRectangle;top=0;left=0;bottom=0;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;'
- left.geometry.width = 30;
- left.geometry.height = 26;
- rowCell.insert(left);
-
- var size = ui.editor.graph.getPreferredSizeForCell(rowCell);
-
- if (size != null && tableCell.geometry.width < size.width + 10)
- {
- tableCell.geometry.width = size.width + 10;
- }
-
- tableCell.insert(rowCell);
- tableCell.geometry.height += 26;
-
- rows[rowCell.value] = rowCell;
- }
- }
- }
-
- if (cells.length > 0)
- {
- var graph = ui.editor.graph;
- var view = graph.view;
- var bds = graph.getGraphBounds();
-
- // Computes unscaled, untranslated graph bounds
- var x = Math.ceil(Math.max(0, bds.x / view.scale - view.translate.x) + 4 * graph.gridSize);
- var y = Math.ceil(Math.max(0, (bds.y + bds.height) / view.scale - view.translate.y) + 4 * graph.gridSize);
- graph.setSelectionCells(graph.importCells(cells, x, y));
- graph.scrollCellToVisible(graph.getSelectionCell());
- }
-
- wnd.setVisible(false);
- };
- mxUtils.br(div);
- var resetBtn = mxUtils.button(mxResources.get('reset'), function()
- {
- sqlInput.value = '';
- });
-
- resetBtn.style.marginTop = '8px';
- resetBtn.style.marginRight = '4px';
- resetBtn.style.padding = '4px';
- div.appendChild(resetBtn);
- var btn = mxUtils.button(mxResources.get('cancel'), function()
- {
- wnd.setVisible(false);
- });
-
- btn.style.marginTop = '8px';
- btn.style.marginRight = '4px';
- btn.style.padding = '4px';
- div.appendChild(btn);
- var btn = mxUtils.button(mxResources.get('insert'), function()
- {
- parseSql(sqlInput.value);
- });
-
- btn.style.marginTop = '8px';
- btn.style.padding = '4px';
- div.appendChild(btn);
- // Adds action
- ui.actions.addAction('fromSql', function()
- {
- wnd.setVisible(!wnd.isVisible());
-
- if (wnd.isVisible())
- {
- sqlInput.focus();
- }
- });
-
- var theMenu = ui.menus.get('insert');
- var oldMenu = theMenu.funct;
-
- theMenu.funct = function(menu, parent)
- {
- oldMenu.apply(this, arguments);
-
- ui.menus.addMenuItems(menu, ['fromSql'], parent);
- };
- });
|