Ext.ns('App');
App = {
webforms: {},
init: function() {
Ext.QuickTips.init();
this.propertyManager = new App.property.PropertyManager();
var viewport = new Ext.Viewport({
layout: 'border',
items: [
this.createNorth(),
this.createSouth(),
this.createWest(),
this.createEast(),
this.createCenter()
]
});
this.initEditor();
setTimeout(function() {
Ext.get('loading').remove();
Ext.get('loading-mask').fadeOut({remove:true});
}, 100);
},
initEditor: function() {
var xml = ""
+ "";
var editor = new Gef.jbs.ExtEditor();
var input = new Gef.jbs.JBSEditorInput();
input.readXml(xml);
var workbenchWindow = new Gef.ui.support.DefaultWorkbenchWindow();
workbenchWindow.getActivePage().openEditor(editor, input);
workbenchWindow.render();
Gef.activeEditor = editor;
this.propertyManager.initSelectionListener(editor);
},
getProcessModel: function() {
var viewer = Gef.activeEditor.getGraphicalViewer();
var processEditPart = viewer.getContents();
return processEditPart.model;
},
createNorth: function() {
var p = null;
if (Gef.MODE_DEMO === true) {
p = new Ext.Panel({
region: 'north'
});
} else {
p = new Ext.Panel({
region: 'north',
html: '
Web户型图设计器 - 多比图形控件演示'
});
}
App.northPanel = p;
return p;
},
createSouth: function() {
var p = this.propertyManager.getBottom();
return p;
},
createWest: function() {
var p = new App.PalettePanel({
collapsible: true
});
App.westPanel = p;
return p;
},
createEast: function() {
var p = this.propertyManager.getRight();
return p;
},
createCenter: function() {
var p = new App.CanvasPanel();
App.centerPanel = p;
return p;
},
getSelectionListener: function() {
if (!this.selectionListener) {
this.selectionListener = new Gef.jbs.ExtSelectionListener(null);
}
return this.selectionListener;
}
};
/*
Gef.override(App.PalettePanel, {
configItems: function() {
this.html = 'sdfasfdfdsa';
}
});
*/
//Gef.PALETTE_TYPE = 'plain';
Gef.PALETTE_TYPE = 'accordion';
Ext.onReady(App.init, App);
App.CanvasPanel = Ext.extend(Ext.Panel, {
initComponent: function() {
//this.on('bodyresize', function(p, w, h) {
// var b = p.body.getBox();
//});
this.region = 'center';
this.autoScroll = true;
this.tbar = new Ext.Toolbar([{
text: '新建',
iconCls: 'tb-new',
handler: function() {
Gef.activeEditor.reset();
}
}, {
text: '导入',
iconCls: 'tb-webform',
handler: function() {
var xml = Gef.activeEditor.serial();
if (!this.openWin) {
this.openWin = new Ext.Window({
title: 'xml',
layout: 'fit',
width: 500,
height: 300,
closeAction: 'hide',
modal: true,
items: [{
id: '__gef_jbpm4_xml_import__',
xtype: 'textarea'
}],
buttons: [{
text: '导入',
handler: function() {
var xml = Ext.getDom('__gef_jbpm4_xml_import__').value;
Gef.activeEditor.resetAndOpen(xml);
this.openWin.hide();
},
scope: this
}, {
text: '取消',
handler: function() {
this.openWin.hide();
},
scope: this
}]
});
this.openWin.on('show', function() {
Gef.activeEditor.disable();
});
this.openWin.on('hide', function() {
Gef.activeEditor.enable();
});
}
this.openWin.show(null, function() {
Ext.getDom('__gef_jbpm4_xml_import__').value = xml;
});
}
}, {
text: '导出',
iconCls: 'tb-prop',
handler: function() {
var xml = Gef.activeEditor.serial();
if (!this.openWin) {
this.openWin = new Ext.Window({
title: 'xml',
layout: 'fit',
width: 500,
height: 300,
closeAction: 'hide',
modal: true,
items: [{
id: '__gef_jbpm4_xml_export__',
xtype: 'textarea'
}],
buttons: [{
text: '关闭',
handler: function() {
this.openWin.hide();
},
scope: this
}]
});
this.openWin.on('show', function() {
Gef.activeEditor.disable();
});
this.openWin.on('hide', function() {
Gef.activeEditor.enable();
});
}
this.openWin.show(null, function() {
Ext.getDom('__gef_jbpm4_xml_export__').value = xml;
});
}
}, {
text: '保存',
iconCls: 'tb-save',
handler: function() {
var editor = Gef.activeEditor;
var xml = editor.serial();
var name = editor.getGraphicalViewer().getContents().getModel().text;
Ext.Msg.wait('正在保存');
Ext.Ajax.request({
method: 'post',
url: Gef.SAVE_URL,
success: function(response) {
try {
var o = Ext.decode(response.responseText);
if (o.success === true) {
Ext.Msg.alert('信息', '操作成功');
} else {
Ext.Msg.alert('错误', o.errors.msg);
}
} catch(e) {
Ext.Msg.alert('系统错误', response.responseText);
}
},
failure: function(response) {
Ext.Msg.alert('系统错误', response.responseText);
},
params: {
id: Gef.PROCESS_ID,
processName: name,
xml: xml
}
});
}
}, {
text: '发布',
iconCls: 'tb-deploy',
handler: function() {
var editor = Gef.activeEditor;
var isValid = new Validation(editor).validate();
if (!isValid) {
return false;
}
var xml = editor.serial();
var model = editor.getGraphicalViewer().getContents().getModel();
var name = model.text;
Ext.Msg.wait('正在发布');
Ext.Ajax.request({
method: 'post',
url: Gef.DEPLOY_URL,
success: function(response) {
try {
var o = Ext.decode(response.responseText);
if (o.success === true) {
Ext.Msg.alert('信息', '操作成功');
} else {
Ext.Msg.alert('错误', o.errors.msg);
}
} catch(e) {
Ext.Msg.alert('系统错误', response.responseText);
}
},
failure: function(response) {
Ext.Msg.alert('系统错误', response.responseText);
},
params: {
id: Gef.PROCESS_ID,
procCatId: model.procCatId,
procDefName: model.procDefName,
procDefCode: model.procDefCode,
procVerName: model.procVerName,
xml: xml
}
});
}
}, {
text: '清空',
iconCls: 'tb-clear',
handler: function() {
Gef.activeEditor.clear();
}
}, {
text: '撤销',
iconCls: 'tb-undo',
handler: function() {
var viewer = Gef.activeEditor.getGraphicalViewer();
var browserListener = viewer.getBrowserListener();
var selectionManager = browserListener.getSelectionManager();
selectionManager.clearAll();
var commandStack = viewer.getEditDomain().getCommandStack();
commandStack.undo();
},
scope: this
}, {
text: '重做',
iconCls: 'tb-redo',
handler: function() {
var viewer = Gef.activeEditor.getGraphicalViewer();
var browserListener = viewer.getBrowserListener();
var selectionManager = browserListener.getSelectionManager();
selectionManager.clearAll();
var commandStack = viewer.getEditDomain().getCommandStack();
commandStack.redo();
},
scope: this
}, {
text: '布局',
iconCls: 'tb-activity',
handler: function() {
var viewer = Gef.activeEditor.getGraphicalViewer();
var browserListener = viewer.getBrowserListener();
var selectionManager = browserListener.getSelectionManager();
selectionManager.clearAll();
new Layout(Gef.activeEditor).doLayout();
},
scope: this
}, {
text: '删除',
iconCls: 'tb-delete',
handler: this.removeSelected,
scope: this
}]);
App.CanvasPanel.superclass.initComponent.call(this);
},
afterRender: function() {
App.CanvasPanel.superclass.afterRender.call(this);
var width = 1500;
var height = 1000;
Ext.DomHelper.append(this.body, [{
id: '__gef_jbs__',
tag: 'div',
style: 'width:' + (width + 10) + 'px;height:' + (height + 10) + 'px;',
children: [{
id: '__gef_jbs_center__',
tag: 'div',
style: 'width:' + width + 'px;height:' + height + 'px;float:left;'
}, {
id: '__gef_jbs_right__',
tag: 'div',
style: 'width:10px;height:' + height + 'px;float:left;background-color:#EEEEEE;cursor:pointer;'
}, {
id: '__gef_jbs_bottom__',
tag: 'div',
style: 'width:' + (width + 10) + 'px;height:10px;float:left;background-color:#EEEEEE;cursor:pointer;'
}]
}]);
var rightEl = Ext.fly('__gef_jbs_right__');
rightEl.on('mouseover', function(e) {
var t = e.getTarget();
t.style.backgroundColor = 'yellow';
t.style.backgroundImage = 'url(images/arrow/arrow-right.png)';
});
rightEl.on('mouseout', function(e) {
var t = e.getTarget();
t.style.backgroundColor = '#EEEEEE';
t.style.backgroundImage = '';
});
rightEl.on('click', function(e) {
Ext.fly('__gef_jbs__').setWidth(Ext.fly('__gef_jbs__').getWidth() + 100);
Ext.fly('__gef_jbs_center__').setWidth(Ext.fly('__gef_jbs_center__').getWidth() + 100);
Ext.fly('__gef_jbs_bottom__').setWidth(Ext.fly('__gef_jbs_bottom__').getWidth() + 100);
Gef.activeEditor.addWidth(100);
});
var bottomEl = Ext.fly('__gef_jbs_bottom__');
bottomEl.on('mouseover', function(e) {
var t = e.getTarget();
t.style.backgroundColor = 'yellow';
t.style.backgroundImage = 'url(images/arrow/arrow-bottom.png)';
});
bottomEl.on('mouseout', function(e) {
var t = e.getTarget();
t.style.backgroundColor = '#EEEEEE';
t.style.backgroundImage = '';
});
rightEl.on('click', function(e) {
Ext.fly('__gef_jbs__').setHeight(Ext.fly('__gef_jbs__').getHeight() + 100);
Ext.fly('__gef_jbs_center__').setHeight(Ext.fly('__gef_jbs_center__').getHeight() + 100);
Ext.fly('__gef_jbs_right__').setHeight(Ext.fly('__gef_jbs_right__').getHeight() + 100);
Gef.activeEditor.addHeight(100);
});
this.body.on('contextmenu', this.onContextMenu, this);
},
onContextMenu: function(e) {
if (!this.contextMenu) {
this.contextMenu = new Ext.menu.Menu({
items: [{
text: '详细配置',
iconCls: 'tb-prop',
handler: this.showWindow,
scope: this
}, {
text: '删除',
iconCls: 'tb-remove',
handler: this.removeSelected,
scope: this
}]
});
}
e.preventDefault();
this.contextMenu.showAt(e.getXY());
},
showWindow: function() {
App.propertyManager.changePropertyStatus('max');
},
removeSelected: function() {
var viewer = Gef.activeEditor.getGraphicalViewer();
var browserListener = viewer.getBrowserListener();
var selectionManager = browserListener.getSelectionManager();
var edge = selectionManager.selectedConnection;
var nodes = selectionManager.items;
var request = {};
if (edge != null) {
request.role = {
name: 'REMOVE_EDGE'
};
this.executeCommand(edge, request);
selectionManager.removeSelectedConnection();
} else if (nodes.length > 0) {
request.role = {
name: 'REMOVE_NODES',
nodes: nodes
};
this.executeCommand(viewer.getContents(), request);
selectionManager.clearAll();
}
},
executeCommand: function(editPart, request) {
var command = editPart.getCommand(request);
if (command != null) {
Gef.activeEditor.getGraphicalViewer().getEditDomain().getCommandStack().execute(command);
}
}
});
/*
* Compressed by JSA(www.xidea.org)
*/
Layout = function(editor) {
this.editor = editor;
this.processEditPart = editor.getGraphicalViewer().getContents();
this.processModel = this.processEditPart.getModel();
};
Layout.prototype = {
doLayout: function() {
var diagram = new Diagram();
diagram.init(this.processModel);
var sorter = new TopologicalSorter(diagram);
var sortedElements = sorter.getSortedElements();
var sortedIds = [];
for (var i = 0; i < sortedElements.length; i++) {
sortedIds.push(sortedElements[i].id);
}
//console.info(sortedIds);
var layouter = new LeftToRightGridLayouter(diagram, sortedIds);
layouter.doLayout();
var edgeMap = diagram.getEdgeMap();
for (var edgeId in edgeMap) {
var edge = edgeMap[edgeId];
new EdgeLayouter(layouter.grid, edge);
}
diagram.updateModel();
}
};
;
Diagram = function() {
};
Diagram.prototype = {
getNodeMap: function() {
return this.nodeMap;
},
getEdgeMap: function() {
return this.edgeMap;
},
init: function(process) {
this.process = process;
this.nodeMap = {};
this.edgeMap = {};
for (var i = 0; i < this.process.children.length; i++) {
var child = process.children[i];
var node = new Node();
node.id = child.text;
node.type = child.type;
node.x = child.x;
node.y = child.y;
node.w = child.w;
node.h = child.h;
this.nodeMap[node.id] = node;
}
for (var i = 0; i < this.process.children.length; i++) {
var child = process.children[i];
for (var j = 0; j < child.getOutgoingConnections().length; j++) {
var connection = child.getOutgoingConnections()[j];
this.createEdge(connection);
}
}
},
createEdge: function(connection) {
var connectionId = connection.getSource().text + '_' + connection.getTarget().text;
var edge = this.edgeMap[connectionId];
if (!edge) {
edge = new Edge();
edge.id = connectionId;
edge.name = connection.text;
edge.source = this.nodeMap[connection.getSource().text];
edge.target = this.nodeMap[connection.getTarget().text];
edge.source.outgoingLinks.push(edge);
edge.target.incomingLinks.push(edge);
this.edgeMap[connectionId] = edge;
}
},
updateModel: function() {
for (var nodeId in this.nodeMap) {
var item = this.nodeMap[nodeId];
var model = this.getModel(nodeId);
model.x = item.x;
model.y = item.y;
model.getEditPart().getFigure().x = model.x;
model.getEditPart().getFigure().y = model.y;
for (var i = 0; i < item.outgoingLinks.length; i++) {
var connection = item.outgoingLinks[i];
var connectionModel = this.getConnectionModel(model, connection);
if (connectionModel == null) {
continue;
}
connectionModel.innerPoints = typeof connection.innerPoints == 'undefined' ? []
: connection.innerPoints;
connectionModel.textX = 0;
connectionModel.textY = 0;
connectionModel.getEditPart().getFigure().innerPoints = connectionModel.innerPoints;
connectionModel.getEditPart().getFigure().textX = connectionModel.textX;
connectionModel.getEditPart().getFigure().textY = connectionModel.textY;
}
}
this.process.getEditPart().refresh();
},
getModel: function(name) {
var model = null;
Gef.each(this.process.children, function(item) {
if (item.text == name) {
model = item;
return false;
}
});
return model;
},
getConnectionModel: function(nodeModel, edge) {
var model = null;
Gef.each(nodeModel.getOutgoingConnections(), function(item) {
if (item.getTarget().text == edge.getTarget().id) {
model = item;
return false;
}
});
return model;
}
};
;
// should be change name to LayoutingElement
Node = function() {
this.incomingLinks = [];
this.outgoingLinks = [];
};
Node.prototype = {
getIncomingLinks: function() {
return this.incomingLinks;
},
getOutgoingLinks: function() {
return this.outgoingLinks;
},
getPrecedingElements: function() {
var previousElements = [];
for (var i = 0; i < this.incomingLinks.length; i++) {
previousElements.push(this.incomingLinks[i].source);
}
return previousElements;
},
getFollowingElements: function() {
var followingElements = [];
for (var i = 0; i < this.outgoingLinks.length; i++) {
followingElements.push(this.outgoingLinks[i].target);
}
return followingElements;
},
isJoin: function() {
return this.incomingLinks.length > 1;
},
isSplit: function() {
return this.outgoingLinks.length > 1;
},
prevSplit: function() {
var distance = 1000;
var candidateDistance = 0;
var split = null;
var candidate = null;
var precedingElements = this.getPrecedingElements();
for (var i = 0; i < precedingElements.length; i++) {
var elem = precedingElements[i];
if (elem.isSplit()) {
return elem;
}
candidate = elem.prevSplit();
if (this.isJoin()) {
// if this is not a join, we have only one precedingElement.
candidateDistance = elem.backwardDistanceTo(candidate);
}
if (candidateDistance < distance) {
split = candidate;
distance = candidateDistance;
}
}
return split;
},
backwardDistanceTo: function(other) {
return this._backwardDistanceTo(other, []);
},
_backwardDistanceTo: function(other, historyElements) {
if (other == this) {
return 0;
}
if (historyElements.indexOf(this) != -1) {
return 1000;
}
var d = 1000;
var newHistory = [];
newHistory.push(this);
var precedingElements = this.getPrecedingElements();
for (var i = 0; i < precedingElements.length; i++) {
var el = precedingElements[i];
d = Math.min(d, el._backwardDistanceTo(other, newHistory));
}
return d == 1000 ? d : d + 1;
}
};
;
Edge = function() {
this.source = null;
this.target = null;
};
Edge.prototype = {
getSource: function() {
return this.source;
},
getTarget: function() {
return this.target;
},
reverseOutgoingAndIncoming: function() {
var index = 0;
var oldSource = this.source;
var oldTarget = this.target;
index = oldSource.outgoingLinks.indexOf(this);
oldSource.outgoingLinks.splice(index, 1);
index = oldTarget.incomingLinks.indexOf(this);
oldTarget.incomingLinks.splice(index, 1);
var newSource = oldTarget;
var newTarget = oldSource;
newSource.outgoingLinks.push(this);
newTarget.incomingLinks.push(this);
this.source = newSource;
this.target = newTarget;
}
};
;
TopologicalSorter = function(diagram) {
this.diagram = diagram;
this.prepareDataAndSort(true);
this.prepareDataAndSort(false);
};
TopologicalSorter.prototype = {
getSortedElements: function() {
return this.sortedElements;
},
prepareDataAndSort: function(shouldBackpatch) {
this.sortedElements = [];
this.elementsToSort = {};
this.backwardsEdges = [];
this.elementsToSortCount = 0;
this.addAllChildren();
this.topologicalSort();
if (shouldBackpatch === true) {
this.backpatchBackwardsEdges();
}
this.reverseBackwardsEdges();
},
addAllChildren: function() {
for (var nodeId in this.diagram.nodeMap) {
var node = this.diagram.nodeMap[nodeId];
this.elementsToSort[nodeId] = new SortableLayoutingElement(node);
this.elementsToSortCount++;
}
},
topologicalSort: function() {
var count = 0;
var oldCount = 0;
while (this.elementsToSortCount > 0) {
var freeElements = this.getFreeElements();
if (freeElements.length > 0) {
for (var i = 0; i < freeElements.length; i++) {
var freeElement = freeElements[i];
this.sortedElements.push(freeElement.node);
this.freeElementsFrom(freeElement);
delete this.elementsToSort[freeElement.node.id];
}
} else {
var entry = this.getLoopEntryPoint();
for (var i = 0; i < entry.incomingLinks.length; i++) {
var backId = entry.incomingLinks[i];
entry.reverseIncomingLinkFrom(backId);
var elem = this.elementsToSort[backId];
elem.reverseOutgoingLinkTo(entry.node.id);
this.backwardsEdges.push(new BackwardsEdge(backId, entry.node.id));
}
}
}
},
backpatchBackwardsEdges: function() {
var newBackwardsEdges = [];
for (var i = 0; i < this.backwardsEdges.length; i++) {
newBackwardsEdges.push(this.backwardsEdges[i]);
}
for (var i = 0; i < this.backwardsEdges.length; i++) {
var edge = this.backwardsEdges[i];
var sourceId = edge.getSource();
var targetId = edge.getTarget();
var sourceElement = this.diagram.nodeMap[sourceId];
while (!(sourceElement.isJoin() || sourceElement.isSplit())) {
var newSourceElement = sourceElement.getPrecedingElements()[0];
targetId = newSourceElement.id;
newBackwardsEdges.push(new BackwardsEdge(targetId, sourceId));
sourceElement = newSourceElement;
sourceId = targetId;
}
}
this.backwardsEdges = newBackwardsEdges;
},
reverseBackwardsEdges: function() {
var edgeMap = this.diagram.edgeMap;
for (var i = 0; i < this.backwardsEdges.length; i++) {
var backwardsEdge = this.backwardsEdges[i];
var sourceId = backwardsEdge.getSource();
var targetId = backwardsEdge.getTarget();
var sourceElement = this.diagram.nodeMap[sourceId];
var targetElement = this.diagram.nodeMap[targetId];
var edge = this.getEdge(edgeMap, sourceElement, targetElement);
backwardsEdge.setEdge(edge);
if (edge) {
// reverse edge outgoing and incoming
edge.reverseOutgoingAndIncoming();
}
}
},
getFreeElements: function() {
var freeElements = [];
for (var nodeId in this.elementsToSort) {
var elem = this.elementsToSort[nodeId];
if (elem.isFree()) {
freeElements.push(elem);
}
}
return freeElements;
},
freeElementsFrom: function(freeElement) {
for (var i = 0; i < freeElement.outgoingLinks.length; i++) {
var id = freeElement.outgoingLinks[i];
var targetElement = this.elementsToSort[id];
if (targetElement) {
targetElement.removeIncomingLinkFrom(freeElement.node.id);
}
}
this.elementsToSortCount--;
},
getLoopEntryPoint: function() {
for (var nodeId in this.elementsToSort) {
var candidate = this.elementsToSort[nodeId];
if (candidate.oldInCount > 1
&& candidate.oldInCount > candidate.incomingLinks.length) {
return candidate;
}
}
throw new Error('Could not find a valid loop entry point');
},
getEdge: function(edgeMap, sourceElement, targetElement) {
for (var i = 0; i < sourceElement.outgoingLinks.length; i++) {
var edge = sourceElement.outgoingLinks[i];
if (edge.getTarget().id == targetElement.id) {
return edge;
}
}
return null;
}
};
;
SortableLayoutingElement = function(node) {
this.node = node;
this.incomingLinks = [];
this.outgoingLinks = [];
for (var i = 0; i < node.incomingLinks.length; i++) {
this.incomingLinks.push(node.incomingLinks[i].source.id);
}
for (var i = 0; i < node.outgoingLinks.length; i++) {
this.outgoingLinks.push(node.outgoingLinks[i].target.id);
}
this.oldInCount = this.incomingLinks.length;
this.isJoin = node.isJoin();
};
SortableLayoutingElement.prototype = {
isFree: function() {
return this.incomingLinks.length == 0;
},
removeIncomingLinkFrom: function(sourceId) {
var index = this.incomingLinks.indexOf(sourceId);
this.incomingLinks.splice(index, 1);
},
reverseIncomingLinkFrom: function(id) {
this.removeIncomingLinkFrom(id);
this.outgoingLinks.push(id);
},
reverseOutgoingLinkTo: function(id) {
var index = this.outgoingLinks.indexOf(id);
this.outgoingLinks.splice(index, 1);
this.incomingLinks.push(id);
}
};
;
BackwardsEdge = function(source, target) {
this.source = source;
this.target = target;
};
BackwardsEdge.prototype = {
getEdge: function() {
return this.edge;
},
setEdge: function(edge) {
this.edge = edge;
},
getSource: function() {
return this.source;
},
getTarget: function() {
return this.target;
}
};
;
LeftToRightGridLayouter = function(diagram, sortedIds) {
this.diagram = diagram;
this.sortedIds = sortedIds;
};
LeftToRightGridLayouter.prototype = {
doLayout: function() {
this.grid = new Grid();
this.layoutElements();
this.calcGeometry(this.grid);
this.writeGeometry(this.grid);
this.diagram.updateModel();
},
layoutElements: function() {
for (var i = 0; i < this.sortedIds.length; i++) {
var sortedId = this.sortedIds[i];
var currentElement = this.diagram.nodeMap[sortedId];
var precedingElements = currentElement.getPrecedingElements();
var cellOfElement = this.placeElement(currentElement, precedingElements);
if (currentElement.isJoin() && precedingElements.length != 0) {
// there is an edge hitting us left, so lets forbid
// interleaving to use the left cell, if this is empty
cellOfElement.getPrevCell().setPackable(false);
}
if (currentElement.isSplit()) {
this.prelayoutSuccessors(currentElement, cellOfElement);
}
}
},
placeElement: function(currentElement, precedingElements) {
var newCell = null;
if (precedingElements.length == 0) {
this.grid.startCell.value = currentElement;
newCell = this.grid.startCell;
} else {
var leftCell = null;
var newCell = this.grid.getCellOfItem(currentElement);
if (currentElement.isJoin()) {
var splitFound = false;
var split = currentElement.prevSplit();
if (split != null) {
var splits = new PriorityQueue(currentElement);
splits.add(split);
for (var i = 0; i < precedingElements.length; i++) {
var elem = precedingElements[i];
split = elem.prevSplit();
if (split != null && !splits.contains(split)) {
splits.add(split);
//console.info(splits.items);
}
}
split = null;
// get split with most connections
var maxCon = 0;
for (var i = 0; i < splits.items.length; i++) {
var target = splits.items[i];
if (target == currentElement) {
continue;
}
// current connections
var curCon = 0;
for (var j = 0; j < precedingElements.length; j++) {
var elem = precedingElements[j];
if (elem.backwardDistanceTo(target) < 1000) {
curCon++;
}
}
if (curCon > maxCon) {
maxCon = curCon;
split = target;
}
}
splitFound = split != null;
}
// current cell position
var x = 0;
var yAcc = 0;
var yCnt = 0;
for (var i = 0; i < precedingElements.length; i++) {
var elem = precedingElements[i];
var tmp = this.grid.getCellOfItem(elem);
if (tmp == null) {
tmp = {
getColIndex: function() {
return 0;
}
};
} else {
yAcc += tmp.getRowIndex();
yCnt++;
}
x = Math.max(x, tmp.getColIndex());
}
// farthest to the right
if (splitFound) {
leftCell = this.grid.getCellOfItem(split).row.cells[x];
// set path to split unpackable
for (var c = leftCell; c.value != split; c = c.getPrevCell()) {
c.setPackable(false);
}
} else {
if (yCnt == 0) {
leftCell = this.grid.rows[0].above().cells[x];
} else {
leftCell = this.grid.rows[yAcc / yCnt].cells[x];
}
}
if (newCell != null && newCell.value == currentElement) {
newCell.value = null;
}
newCell = leftCell.after();
// set all incoming pathes unpackable
for (var i = 0; i < precedingElements.length; i++) {
var el = precedingElements[i];
var target = this.grid.getCellOfItem(el);
if (target == null) {
continue;
}
var start = target.row.cells[x + 1];
for (var c = start; c != target; c = c.getPrevCell()) {
c.setPackable(false);
}
}
} else if (newCell == null) {
// if not preLayouted
var preElem = precedingElements[0];
leftCell = this.grid.getCellOfItem(preElem);
newCell = leftCell.after();
}
if (newCell.isFilled() && newCell.value != currentElement) {
newCell.row.insertRowBeneath();
newCell = newCell.beneath();
}
newCell.value = currentElement;
newCell.getPrevCell().setPackable(false);
}
return newCell;
},
prelayoutSuccessors: function(currentElement, cellOfElement) {
var baseCell = cellOfElement.after();
var topCell = baseCell;
var followingElements = currentElement.getFollowingElements();
// heuristic for direct connection to join
var directJoin = null;
for (var i = 0; i < followingElements.length; i++) {
var possibleJoin = followingElements[i];
if (possibleJoin.isJoin()) {
directJoin = possibleJoin;
}
}
if (directJoin != null) {
// put in the middle
var index = followingElements.indexOf(directJoin);
// remove
followingElements.splice(index, 1);
var position = parseInt(followingElements.length / 2, 10);
// insert
followingElements.splice(position, 0, directJoin);
}
// normal preLayout following elements
var follow = parseInt(followingElements.length / 2, 10);
for (var i = 0; i < follow; i++) {
topCell.row.insertRowAbove();
baseCell.row.insertRowBeneath();
topCell = topCell.above();
}
for (var i = 0; i < followingElements.length; i++) {
var newElem = followingElements[i];
if (this.grid.getCellOfItem(newElem)) {
continue;
}
topCell.value = newElem;
topCell = topCell.beneath();
if (topCell == baseCell && followingElements.length % 2 == 0) {
topCell = topCell.beneath();
}
}
},
calcGeometry: function(grid) {
grid.pack();
var heightOfRow = [];
for (var i = 0; i < grid.rowCount; i++) {
heightOfRow.push(0);
}
var widthOfColumn = [];
for (var i = 0; i < grid.colCount; i++) {
widthOfColumn.push(0);
}
for (var i = 0; i < grid.rowCount; i++) {
var row = grid.rows[i];
for (var j = 0; j < grid.colCount; j++) {
var cell = row.cells[j];
if (cell.isFilled()) {
var elem = cell.value;
widthOfColumn[j] = Math.max(widthOfColumn[j], elem.w + 30);
heightOfRow[i] = Math.max(heightOfRow[i], elem.h + 30);
}
}
}
this.heightOfRow = heightOfRow;
this.widthOfColumn = widthOfColumn;
this.totalWidth = 0;
this.totalHeight = 0;
for (var i = 0; i < grid.colCount; i++) {
this.totalWidth += widthOfColumn[i];
}
for (var i = 0; i < grid.rowCount; i++) {
this.totalHeight += heightOfRow[i];
}
},
writeGeometry: function(grid) {
var x = 0;
var y = 0;
for (var i = 0; i < grid.rowCount; i++) {
var row = grid.rows[i];
var cellHeight = this.heightOfRow[i];
for (var j = 0; j < grid.colCount; j++) {
var cell = row.cells[j];
var cellWidth = this.widthOfColumn[j];
if (cell.isFilled()) {
var elem = cell.value;
var newX = x + cellWidth / 2 - elem.w / 2;
var newY = y + cellHeight / 2 - elem.h / 2;
elem.x = newX;
elem.y = newY;
}
x += cellWidth;
}
x = 0;
y += cellHeight;
}
}
};
;
Grid = function() {
var cell = new Cell();
var row = new Row();
row.grid = this;
row.addCell(cell);
this.rows = [row];
this.startCell = cell;
this.colCount = 1;
this.rowCount = this.rows.length;
};
Grid.prototype = {
addFirstRow: function() {
var row = new Row();
row.grid = this;
for (var i = 0; i < this.rolCount; i++) {
var cell = new Cell();
row.addCell(cell);
}
this.rows.unshift(row);
this.rowCount = this.rows.length;
},
addLastRow: function() {
var row = new Row();
row.grid = this;
for (var i = 0; i < this.rolCount; i++) {
row.addCell(new Cell());
}
this.rows.push(row);
this.rowCount = this.rows.length;
},
addLastCol: function() {
for (var i = 0; i < this.rowCount; i++) {
var row = this.rows[i];
row.addCell(new Cell());
}
this.colCount++;
},
getCellOfItem: function(elem) {
for (var i = 0; i < this.rowCount; i++) {
var row = this.rows[i];
for (var j = 0; j < this.colCount; j++) {
var cell = row.cells[j];
if (cell.value == elem) {
return cell;
}
}
}
return null;
},
pack: function() {
var changed = false;
do {
changed = false;
for (var i = 0; i < this.rows.length; i++) {
var row = this.rows[i];
changed |= row.tryInterleaveWith(row.getPrevRow());
}
for (var i = 0; i < this.rows.length; i++) {
var row = this.rows[i];
changed |= row.tryInterleaveWith(row.getNextRow());
}
} while (changed);
},
info: function() {
var value = '';
for (var i = 0; i < this.rows.length; i++) {
var row = this.rows[i];
for (var j = 0; j < row.cells.length; j++) {
var cell = row.cells[j];
var id = '[ ]';
if (cell.isFilled()) {
id = cell.value.id;
} else if (cell.packable === false) {
id = '[ p ]';
}
value += id;
}
value += '\n'
}
return value;
}
};
;
Cell = function() {
this.packable = true;
};
Cell.prototype = {
isFilled: function() {
return typeof this.value != 'undefined' && this.value != null;
},
isUnpackable: function() {
return this.isFilled() || (this.packable === false);
},
setPackable: function(packable) {
this.packable = packable;
},
getRowIndex: function() {
return this.row.getIndex();
},
getColIndex: function() {
for (var i = 0; i < this.row.cells.length; i++) {
if (this.row.cells[i] == this) {
return i;
}
}
},
after: function() {
var colIndex = this.getColIndex();
if (colIndex == this.row.cells.length - 1) {
this.grid.addLastCol();
}
return this.row.cells[colIndex + 1];
},
above: function() {
var rowIndex = this.getRowIndex();
var colIndex = this.getColIndex();
if (rowIndex == 0) {
this.row.insertRowAbove();
}
return this.grid.rows[rowIndex - 1].cells[colIndex];
},
beneath: function() {
var rowIndex = this.getRowIndex();
var colIndex = this.getColIndex();
if (rowIndex == this.grid.rowCount - 1) {
this.row.insertRowBeneath();
}
return this.grid.rows[rowIndex + 1].cells[colIndex];
},
getPrevCell: function() {
var index = this.getColIndex();
return this.row.cells[index - 1];
},
getNextCell: function() {
var index = this.getColIndex();
return this.row.cells[index + 1];
}
};
;
Row = function() {
this.cells = [];
};
Row.prototype = {
addCell: function(cell) {
cell.row = this;
cell.grid = this.grid;
this.cells.push(cell);
},
getIndex: function() {
for (var i = 0; i < this.grid.rows.length; i++) {
if (this.grid.rows[i] == this) {
return i;
}
}
},
insertRowBeneath: function() {
var row = new Row();
row.grid = this.grid;
for (var i = 0; i < this.grid.colCount; i++) {
row.addCell(new Cell());
}
var rowIndex = this.getIndex();
var rows = this.grid.rows;
if (rowIndex == rows.length - 1) {
rows.push(row);
} else {
rows.splice(rowIndex + 1, 0, row);
}
this.grid.rowCount = rows.length;
},
insertRowAbove: function() {
var row = new Row();
row.grid = this.grid;
for (var i = 0; i < this.grid.colCount; i++) {
row.addCell(new Cell());
}
var rowIndex = this.getIndex();
var rows = this.grid.rows;
if (rowIndex == 0) {
rows.unshift(row);
} else {
rows.splice(rowIndex, 0, row);
}
this.grid.rowCount = rows.length;
},
getPrevRow: function() {
var index = this.getIndex();
if (index > 0) {
return this.grid.rows[index - 1];
} else {
return null;
}
},
getNextRow: function() {
var index = this.getIndex();
if (index < this.grid.rows.length) {
return this.grid.rows[index + 1];
} else {
return null;
}
},
tryInterleaveWith: function(other) {
if (!this.isInterleaveWith(other)) {
return false;
}
for (var i = 0; i < this.cells.length; i++) {
var cell = this.cells[i];
var otherCell = other.cells[i];
if (cell.isFilled()) {
other.cells[i] = cell;
} else if (cell.isUnpackable()) {
otherCell.setPackable(false);
}
}
this._remove();
return true;
},
isInterleaveWith: function(other) {
if (other == null || other == this) {
return false;
} else if (other.getPrevRow() != this && other.getNextRow() != this) {
return false;
}
for (var i = 0; i < this.cells.length; i++) {
var cell = this.cells[i];
var otherCell = other.cells[i];
if (cell.isUnpackable() && otherCell.isUnpackable()) {
return false;
}
}
return true;
},
_remove: function() {
var index = this.getIndex();
this.grid.rows.splice(index, 1);
this.grid.rowCount--;
}
};
;
PriorityQueue = function(center) {
this.ce = center;
this.items = [];
};
PriorityQueue.prototype = {
add: function(element) {
this.items.push(element);
var len = this.items.length;
for (var i = 0; i < len; i++) {
for (var j = i; j < len; j++) {
var elem1 = this.items[i];
var elem2 = this.items[j];
if (this.compareTo(elem1, elem2) > 0) {
this.items[i] = elem2;
this.items[j] = elem1;
}
}
}
},
compareTo: function(elem1, elem2) {
return this.ce.backwardDistanceTo(elem1) - this.ce.backwardDistanceTo(elem2);
},
contains: function(element) {
return this.items.indexOf(element) != -1;
}
};
;
EdgeLayouter = function(grid, edge) {
this.grid = grid;
this.edge = edge;
edge.innerPoints = [];
this.calculateGlobals();
this.pickLayoutForEdge();
};
EdgeLayouter.prototype = {
calculateGlobals: function() {
this.source = this.edge.source;
this.target = this.edge.target;
this.sourceRelativeCenterX = this.source.w / 2;
this.sourceRelativeCenterY = this.source.h / 2;
this.targetRelativeCenterX = this.target.w / 2;
this.targetRelativeCenterY = this.target.h / 2;
this.sourceAbsoluteCenterX = this.source.x + this.sourceRelativeCenterX;
this.sourceAbsoluteCenterY = this.source.y + this.sourceRelativeCenterY;
this.targetAbsoluteCenterX = this.target.x + this.targetRelativeCenterX;
this.targetAbsoluteCenterY = this.target.y + this.targetRelativeCenterY;
this.sourceAbsoluteX = this.source.x;
this.sourceAbsoluteY = this.source.y;
this.sourceAbsoluteX2 = this.source.x + this.source.w;
this.sourceAbsoluteY2 = this.source.y + this.source.h;
this.targetAbsoluteX = this.target.x;
this.targetAbsoluteY = this.target.y;
this.targetAbsoluteX2 = this.target.x + this.target.w;
this.targetAbsoluteY2 = this.target.y + this.target.h;
this.sourceJoin = this.source.isJoin();
this.sourceSplit = this.source.isSplit();
this.targetJoin = this.target.isJoin();
this.targetSplit = this.target.isSplit();
this.backwards = this.sourceAbsoluteCenterX > this.targetAbsoluteCenterX;
},
pickLayoutForEdge: function() {
// sourceX == targetX, up and down
if (this.sourceAbsoluteCenterX == this.targetAbsoluteCenterX) {
this.setEdgeDirectCenter();
return;
} else if (this.sourceAbsoluteCenterY == this.targetAbsoluteCenterY) {
if (this.areCellsHorizontalFree()) {
this.setEdgeDirectCenter();
} else {
this.setEdgeAroundTheCorner(true);
}
return;
}
if (this.sourceAbsoluteCenterX <= this.targetAbsoluteCenterX
&& this.sourceAbsoluteCenterY <= this.targetAbsoluteCenterY) {
// target is right under
if (this.sourcejoin && this.sourceSplit) {
this.setEdgeStepRight();
return;
} else if (this.sourceSplit) {
this.setEdge90DegreeRightUnderAntiClockwise();
return;
} else if (this.targetJoin) {
this.setEdge90DegreeRightUnderClockwise();
return;
}
} else if (this.sourceAbsoluteCenterX <= this.targetAbsoluteCenterX
&& this.sourceAbsoluteCenterY > this.targetAbsoluteCenterY) {
// target is right above
if (this.sourcejoin && this.sourceSplit) {
this.setEdgeStepRight();
return;
} else if (this.sourceSplit) {
this.setEdge90DegreeRightAboveClockwise();
return;
} else if (this.targetJoin) {
this.setEdge90DegreeRightAboveAntiClockwise();
return;
}
}
if (this.sourceJoin && sourceSplit && (!this.backwards)) {
this.setEdgeStepRight();
return;
}
if (this.sourceJoin && sourceSplit) {
this.setEdgeAroundTheCorner(true);
return;
}
this.setEdgeDirectCenter();
},
areCellsHorizontalFree: function() {
var fromCell = null;
var toCell = null;
if (this.sourceAbsoluteCenterX < this.targetAbsoluteCenterX) {
fromCell = this.grid.getCellOfItem(this.source);
toCell = this.grid.getCellOfItem(this.target);
} else {
fromCell = this.grid.getCellOfItem(this.target);
toCell = this.grid.getCellOfItem(this.source);
}
fromCell = fromCell.getNextCell();
while (fromCell != toCell) {
if (fromCell == null || fromCell.isFilled()) {
return false;
}
fromCell = fromCell.getNextCell();
}
return true;
},
setEdgeDirectCenter: function() {
var boundsMinX = Math.min(this.sourceAbsoluteCenterX,
this.targetAbsoluteCenterX);
var boundsMinY = Math.min(this.sourceAbsoluteCenterY,
this.targetAbsoluteCenterY);
var boundsMaxX = Math.max(this.sourceAbsoluteCenterX,
this.targetAbsoluteCenterX);
var boundsMaxY = Math.max(this.sourceAbsoluteCenterY,
this.targetAbsoluteCenterY);
// this.edge.innerPoints = [];
},
setEdge90DegreeRightAboveClockwise: function() {
this.edge.innerPoints = [
[this.sourceAbsoluteCenterX, this.targetAbsoluteCenterY]
];
},
setEdge90DegreeRightAboveAntiClockwise: function() {
this.edge.innerPoints = [
[this.targetAbsoluteCenterX, this.sourceAbsoluteCenterY]
];
},
setEdge90DegreeRightUnderClockwise: function() {
this.edge.innerPoints = [
[this.targetAbsoluteCenterX, this.sourceAbsoluteCenterY]
];
},
setEdge90DegreeRightUnderAntiClockwise: function() {
this.edge.innerPoints = [
[this.sourceAbsoluteCenterX, this.targetAbsoluteCenterY]
];
},
setEdgeAroundTheCorner: function(down) {
var height = Math.max(this.source.h / 2, this.target.h / 2) + 20;
if (down) {
height *= -1;
}
this.edge.innerPoints = [
[this.sourceAbsoluteCenterX, this.sourceAbsoluteCenterY + height],
[this.targetAbsoluteCenterX, this.sourceAbsoluteCenterY + height]
];
}
};
Ext.ux.OneCombo = Ext.extend(Ext.form.ComboBox, {
initComponent: function() {
this.readOnly = true;
this.displayField = 'text';
this.valueField = 'text';
this.triggerAction = 'all';
this.mode = 'local';
this.emptyText = 'Please Select...';
this.store = new Ext.data.SimpleStore({
expandData: true,
fields: ['text']
});
this.store.loadData(this.data);
Ext.ux.OneCombo.superclass.initComponent.call(this);
}
});
Ext.reg('onecombo', Ext.ux.OneCombo);
Gef.ns("Gef.planner");
Gef.ns("Gef.planner.model");
Gef.ns("Gef.planner.figure");
Gef.ns("Gef.planner.editpart");
function registerClass(type, name, url, w, h){
function capitaliseFirstLetter(string)
{
return string.charAt(0).toUpperCase() + string.slice(1);
}
var preType = type;
Gef.planner.model[preType+"Model"] = Gef.extend(Gef.jbs.model.GenericImageModel, {
type: preType,
url: url,
constructor: function(conf) {
Gef.planner.model[preType+"Model"].superclass.constructor.call(this, conf);
this.w = w;
this.h = h;
}
});
Gef.planner.figure[preType+"Figure"] = Gef.extend(Gef.jbs.figure.GenericImageFigure, {
});
Gef.planner.editpart[preType+"EditPart"] = Gef.extend(Gef.jbs.editpart.GenericImageEditPart, {
_figureClassName: "Gef.planner.figure." + preType + "Figure"
});
Gef.jbs.JBSModelFactory.registerModel(type, "Gef.planner.model." + preType + "Model");
Gef.jbs.JBSEditPartFactory.registerEditPart(type, "Gef.planner.editpart." + preType + "EditPart");
}
var tpls = [
["exchange", "exchange", "images/stenciles/huagong/huagong1/exchange.png", 37, 27],
["fah", "fah", "images/stenciles/huagong/huagong1/fah.png",23,14],
["fav", "fav", "images/stenciles/huagong/huagong1/fav.png",14,23],
["guan", "guan", "images/stenciles/huagong/huagong1/guan.png",36,45],
["lu", "lu", "images/stenciles/huagong/huagong1/lu.png",157,240],
["meter", "meter", "images/stenciles/huagong/huagong1/meter.png",75,46],
["motor", "motor", "images/stenciles/huagong/huagong1/motor.png",43,41],
["motor2", "motor2", "images/stenciles/huagong/huagong1/motor2.png",43,41],
["pressure", "pressure", "images/stenciles/huagong/huagong1/pressure.png",35,30],
["wendu", "wendu", "images/stenciles/huagong/huagong1/wendu.png",35,30]
];
(function regClasses(arr){
for(var i=0;i';
} else {
var html = '';
}
for (var i = 0; i < array.length; i++) {
var item = array[i];
html += '
'
+ item.title + '
';
}
html += '
';
return html;
},
/**
* this.layout = 'accordion';
*/
configLayout: function(type) {
if (!type || type == 'plain') {
//
} else if (type && type == 'accordion') {
this.layout = 'accordion';
}
},
configItems: function(type) {
if (type && type == 'accordion') {
this.createItemsForAccordion();
} else if (!type || type == 'plain') {
this.createItemsForHtml();
}
},
createItemsForAccordion: function() {
this.id = '__gef_jbs_palette__';
this.items = [{
title: '基础图元',
iconCls: 'tb-activity',
autoScroll: true,
html: this.createHtml(makePaletteArray(tpls))
}, {
title: '高级图元',
iconCls: 'tb-activity',
autoScroll: true,
html: ''
}];
},
createItemsForHtml: function() {
this.autoScroll = true;
this.html = this.createHtml([
{name: 'select', image: 'select32', title: '选择'},
{name: 'transition', image: '32/flow_sequence', title: '连线'},
{name: 'start', image: '32/start_event_empty', title: '开始'},
{name: 'end', image: '32/end_event_terminate', title: '结束'},
{name: 'cancel', image: '32/end_event_cancel', title: '取消'},
{name: 'error', image: '32/end_event_error', title: '错误'},
{name: 'state', image: '32/task_wait', title: '等待'},
{name: 'task', image: '32/task_empty', title: '任务'},
{name: 'decision', image: '32/gateway_exclusive', title: '决策'},
{name: 'fork', image: '32/gateway_parallel', title: '并行'},
{name: 'join', image: '32/gateway_parallel', title: '汇聚'},
{name: 'java', image: '32/task_java', title: 'JAVA'},
{name: 'script', image: '32/task_java', title: '脚本'},
{name: 'hql', image: '32/task_hql', title: 'HQL'},
{name: 'sql', image: '32/task_sql', title: 'SQL'},
{name: 'mail', image: '32/task_empty', title: '邮件'},
{name: 'custom', image: '32/task_empty', title: '自定义'},
{name: 'subProcess', image: '32/task_empty', title: '子流程'},
{name: 'jms', image: '32/task_empty', title: 'JMS'},
{name: 'ruleDecision', image: '32/gateway_exclusive', title: '规则决策'},
{name: 'rules', image: '32/task_empty', title: '规则'},
{name: 'human', image: '32/task_empty', title: '人工节点'},
{name: 'auto', image: '32/task_empty', title: '自动节点'},
{name: 'counter-sign', image: '32/task_empty', title: '会签节点'}
], '__gef_jbs_palette__');
}
});
Ext.ux.TwoCombo = Ext.extend(Ext.form.ComboBox, {
initComponent: function() {
this.readOnly = true;
this.displayField = 'text';
this.valueField = 'value';
this.triggerAction = 'all';
this.mode = 'local';
this.emptyText = 'Please Select...';
this.store = new Ext.data.SimpleStore({
fields: ['value', 'text']
});
this.store.loadData(this.data);
Ext.ux.TwoCombo.superclass.initComponent.call(this);
}
});
Ext.reg('twocombo', Ext.ux.TwoCombo);