feat(BpmnTreeWalker): handle loose processes / only selected DI

This commit is contained in:
Nico Rehwaldt 2014-03-22 01:47:03 +01:00
parent d2e71b64b5
commit 7ccc9bf48e
1 changed files with 31 additions and 3 deletions

View File

@ -5,6 +5,9 @@ function BpmnTraverser(handler) {
var elementDiMap = {};
var elementGfxMap = {};
// list of containers already walked
var handledProcesses = [];
///// Helpers /////////////////////////////////
function contextual(fn, ctx) {
@ -19,8 +22,15 @@ function BpmnTraverser(handler) {
function visit(element, di, ctx) {
var gfx = elementGfxMap[element.id];
// avoid multiple rendering of elements
if (gfx) {
return gfx;
}
// call handler
var gfx = handler.element(element, di, ctx);
gfx = handler.element(element, di, ctx);
// and log returned result
elementGfxMap[element.id] = gfx;
@ -78,8 +88,6 @@ function BpmnTraverser(handler) {
////// Semantic handling //////////////////////
function handleDefinitions(definitions, diagram) {
buildDiMap(definitions);
// make sure we walk the correct bpmnElement
var diagrams = definitions.diagrams;
@ -99,6 +107,9 @@ function BpmnTraverser(handler) {
return;
}
// load DI from selected diagram only
handleDiagram(diagram);
var rootElement = diagram.plane.bpmnElement;
if (is(rootElement, 'bpmn:Process')) {
@ -106,11 +117,25 @@ function BpmnTraverser(handler) {
} else
if (is(rootElement, 'bpmn:Collaboration')) {
handleCollaboration(rootElement);
// force drawing of everything not yet drawn that is part of the target DI
handleUnhandledProcesses(definitions.rootElements);
} else {
throw new Error('unsupported root element for bpmndi:Diagram: ' + type.name);
}
}
function handleUnhandledProcesses(rootElements) {
// walk through all processes that have not yet been drawn and draw them
// (in case they contain lanes with DI information)
var processes = _.forEach(rootElements, function(e) {
return e.$type === 'bpmn:Process' && e.laneSets && handledProcesses.indexOf(e) !== -1;
});
processes.forEach(contextual(handleProcess));
}
function handleDataAssociation(association, context) {
visitIfDi(association, context);
}
@ -265,6 +290,9 @@ function BpmnTraverser(handler) {
handleIoSpecification(process.ioSpecification, context);
handleArtifacts(process.artifacts, context);
// log process handled
handledProcesses.push(process);
}
function handleMessageFlow(messageFlow, context) {