Showing
1 changed file
with
789 additions
and
1133 deletions
... | ... | @@ -9,8 +9,7 @@ window.uiTheme = ''; |
9 | 9 | * No CSS and resources available in embed mode. Parameters and docs: |
10 | 10 | * https://www.drawio.com/doc/faq/embed-html-options |
11 | 11 | */ |
12 | -GraphViewer = function(container, xmlNode, graphConfig) | |
13 | -{ | |
12 | +GraphViewer = function (container, xmlNode, graphConfig) { | |
14 | 13 | this.init(container, xmlNode, graphConfig); |
15 | 14 | }; |
16 | 15 | |
... | ... | @@ -119,8 +118,7 @@ GraphViewer.prototype.responsive = false; |
119 | 118 | /** |
120 | 119 | * Initializes the viewer. |
121 | 120 | */ |
122 | -GraphViewer.prototype.init = function(container, xmlNode, graphConfig) | |
123 | -{ | |
121 | +GraphViewer.prototype.init = function (container, xmlNode, graphConfig) { | |
124 | 122 | this.graphConfig = (graphConfig != null) ? graphConfig : {}; |
125 | 123 | this.autoFit = (this.graphConfig['auto-fit'] != null) ? |
126 | 124 | this.graphConfig['auto-fit'] : this.autoFit; |
... | ... | @@ -155,55 +153,46 @@ GraphViewer.prototype.init = function(container, xmlNode, graphConfig) |
155 | 153 | this.pageId = this.graphConfig.pageId; |
156 | 154 | this.editor = null; |
157 | 155 | var self = this; |
158 | - | |
159 | - if (this.graphConfig['toolbar-position'] == 'inline') | |
160 | - { | |
156 | + | |
157 | + if (this.graphConfig['toolbar-position'] == 'inline') { | |
161 | 158 | this.minHeight += this.toolbarHeight; |
162 | 159 | } |
163 | - | |
164 | - if (xmlNode != null) | |
165 | - { | |
160 | + | |
161 | + if (xmlNode != null) { | |
166 | 162 | this.xmlDocument = xmlNode.ownerDocument; |
167 | 163 | this.xmlNode = xmlNode; |
168 | 164 | this.xml = mxUtils.getXml(xmlNode); |
169 | 165 | |
170 | - if (container != null) | |
171 | - { | |
172 | - var render = mxUtils.bind(this, function() | |
173 | - { | |
166 | + if (container != null) { | |
167 | + var render = mxUtils.bind(this, function () { | |
174 | 168 | this.graph = new Graph(container); |
175 | 169 | this.graph.enableFlowAnimation = true; |
176 | 170 | this.graph.defaultPageBackgroundColor = 'transparent'; |
177 | 171 | this.graph.diagramBackgroundColor = 'transparent'; |
178 | 172 | this.graph.transparentBackground = false; |
179 | - | |
180 | - if (this.responsive && this.graph.dialect == mxConstants.DIALECT_SVG) | |
181 | - { | |
173 | + | |
174 | + if (this.responsive && this.graph.dialect == mxConstants.DIALECT_SVG) { | |
182 | 175 | var root = this.graph.view.getDrawPane().ownerSVGElement; |
183 | 176 | var canvas = this.graph.view.getCanvas(); |
184 | - | |
185 | - if (this.graphConfig.border != null) | |
186 | - { | |
177 | + | |
178 | + if (this.graphConfig.border != null) { | |
187 | 179 | root.style.padding = this.graphConfig.border + 'px'; |
188 | 180 | } |
189 | - else if (container.style.padding == '') | |
190 | - { | |
181 | + else if (container.style.padding == '') { | |
191 | 182 | root.style.padding = '8px'; |
192 | 183 | } |
193 | - | |
184 | + | |
194 | 185 | root.style.boxSizing = 'border-box'; |
195 | 186 | root.style.overflow = 'visible'; |
196 | - | |
197 | - this.graph.fit = function() | |
198 | - { | |
187 | + | |
188 | + this.graph.fit = function () { | |
199 | 189 | // Automatic |
200 | 190 | }; |
201 | - | |
202 | - this.graph.sizeDidChange = function() | |
203 | - { | |
191 | + | |
192 | + this.graph.sizeDidChange = function () { | |
204 | 193 | var bounds = this.view.graphBounds; |
205 | 194 | var tr = this.view.translate; |
206 | - | |
195 | + | |
207 | 196 | root.setAttribute('viewBox', |
208 | 197 | (bounds.x + tr.x - this.panDx) + ' ' + |
209 | 198 | (bounds.y + tr.y - this.panDy) + ' ' + |
... | ... | @@ -215,21 +204,18 @@ GraphViewer.prototype.init = function(container, xmlNode, graphConfig) |
215 | 204 | this.fireEvent(new mxEventObject(mxEvent.SIZE, 'bounds', bounds)); |
216 | 205 | }; |
217 | 206 | } |
218 | - | |
219 | - if (this.graphConfig.move) | |
220 | - { | |
221 | - this.graph.isMoveCellsEvent = function(evt) | |
222 | - { | |
207 | + | |
208 | + if (this.graphConfig.move) { | |
209 | + this.graph.isMoveCellsEvent = function (evt) { | |
223 | 210 | return true; |
224 | 211 | }; |
225 | 212 | } |
226 | - | |
213 | + | |
227 | 214 | // Adds lightbox and link handling for shapes |
228 | - if (this.lightboxClickEnabled) | |
229 | - { | |
215 | + if (this.lightboxClickEnabled) { | |
230 | 216 | container.style.cursor = 'pointer'; |
231 | 217 | } |
232 | - | |
218 | + | |
233 | 219 | // Hack for using EditorUi methods on the graph instance |
234 | 220 | this.editor = new Editor(true, null, null, this.graph); |
235 | 221 | this.editor.editBlankUrl = this.editBlankUrl; |
... | ... | @@ -238,113 +224,94 @@ GraphViewer.prototype.init = function(container, xmlNode, graphConfig) |
238 | 224 | this.graph.autoExtend = false; |
239 | 225 | this.graph.autoScroll = false; |
240 | 226 | this.graph.setEnabled(false); |
241 | - | |
242 | - if (this.graphConfig['toolbar-nohide'] == true) | |
243 | - { | |
227 | + | |
228 | + if (this.graphConfig['toolbar-nohide'] == true) { | |
244 | 229 | this.editor.defaultGraphOverflow = 'visible'; |
245 | 230 | } |
246 | - | |
231 | + | |
247 | 232 | //Extract graph model from html & svg formats |
248 | 233 | this.xmlNode = this.editor.extractGraphModel(this.xmlNode, true); |
249 | - | |
250 | - if (this.xmlNode != xmlNode) | |
251 | - { | |
234 | + | |
235 | + if (this.xmlNode != xmlNode) { | |
252 | 236 | this.xml = mxUtils.getXml(this.xmlNode); |
253 | 237 | this.xmlDocument = this.xmlNode.ownerDocument; |
254 | 238 | } |
255 | - | |
239 | + | |
256 | 240 | // Handles relative images |
257 | 241 | var self = this; |
258 | - | |
259 | - this.graph.getImageFromBundles = function(key) | |
260 | - { | |
242 | + | |
243 | + this.graph.getImageFromBundles = function (key) { | |
261 | 244 | return self.getImageUrl(key); |
262 | 245 | }; |
263 | - | |
264 | - if (mxClient.IS_SVG) | |
265 | - { | |
246 | + | |
247 | + if (mxClient.IS_SVG) { | |
266 | 248 | // LATER: Add shadow for labels in graph.container (eg. math, NO_FO), scaling |
267 | 249 | this.graph.addSvgShadow(this.graph.view.canvas.ownerSVGElement, null, true); |
268 | 250 | } |
269 | - | |
251 | + | |
270 | 252 | // Adds page placeholders |
271 | - if (this.xmlNode.nodeName == 'mxfile') | |
272 | - { | |
253 | + if (this.xmlNode.nodeName == 'mxfile') { | |
273 | 254 | var diagrams = this.xmlNode.getElementsByTagName('diagram'); |
274 | - | |
275 | - if (diagrams.length > 0) | |
276 | - { | |
255 | + | |
256 | + if (diagrams.length > 0) { | |
277 | 257 | //Find the page index if the pageId is provided |
278 | - if (this.pageId != null) | |
279 | - { | |
280 | - for (var i = 0; i < diagrams.length; i++) | |
281 | - { | |
282 | - if (this.pageId == diagrams[i].getAttribute('id')) | |
283 | - { | |
258 | + if (this.pageId != null) { | |
259 | + for (var i = 0; i < diagrams.length; i++) { | |
260 | + if (this.pageId == diagrams[i].getAttribute('id')) { | |
284 | 261 | this.currentPage = i; |
285 | 262 | break; |
286 | 263 | } |
287 | 264 | } |
288 | 265 | } |
289 | - | |
266 | + | |
290 | 267 | var graphGetGlobalVariable = this.graph.getGlobalVariable; |
291 | 268 | var self = this; |
292 | - | |
293 | - this.graph.getGlobalVariable = function(name) | |
294 | - { | |
269 | + | |
270 | + this.graph.getGlobalVariable = function (name) { | |
295 | 271 | var diagram = diagrams[self.currentPage]; |
296 | - | |
297 | - if (name == 'page') | |
298 | - { | |
272 | + | |
273 | + if (name == 'page') { | |
299 | 274 | return diagram.getAttribute('name') || 'Page-' + (self.currentPage + 1); |
300 | 275 | } |
301 | - else if (name == 'pagenumber') | |
302 | - { | |
276 | + else if (name == 'pagenumber') { | |
303 | 277 | return self.currentPage + 1; |
304 | 278 | } |
305 | - else if (name == 'pagecount') | |
306 | - { | |
279 | + else if (name == 'pagecount') { | |
307 | 280 | return diagrams.length; |
308 | 281 | } |
309 | - | |
282 | + | |
310 | 283 | return graphGetGlobalVariable.apply(this, arguments); |
311 | 284 | }; |
312 | 285 | } |
313 | 286 | } |
314 | - | |
287 | + | |
315 | 288 | this.diagrams = []; |
316 | 289 | var lastXmlNode = null; |
317 | - | |
318 | - this.selectPage = function(number) | |
319 | - { | |
320 | - if(this.handlingResize) | |
290 | + | |
291 | + this.selectPage = function (number) { | |
292 | + if (this.handlingResize) | |
321 | 293 | return; |
322 | - | |
294 | + | |
323 | 295 | this.currentPage = mxUtils.mod(number, this.diagrams.length); |
324 | 296 | this.updateGraphXml(Editor.parseDiagramNode(this.diagrams[this.currentPage])); |
325 | 297 | }; |
326 | - | |
327 | - this.selectPageById = function(id) | |
328 | - { | |
298 | + | |
299 | + this.selectPageById = function (id) { | |
329 | 300 | var index = this.getIndexById(id); |
330 | 301 | var found = index >= 0; |
331 | 302 | |
332 | - if (found) | |
333 | - { | |
303 | + if (found) { | |
334 | 304 | this.selectPage(index); |
335 | 305 | } |
336 | - | |
306 | + | |
337 | 307 | return found; |
338 | 308 | }; |
339 | - | |
340 | - var update = mxUtils.bind(this, function() | |
341 | - { | |
342 | - if (this.xmlNode == null || this.xmlNode.nodeName != 'mxfile') | |
343 | - { | |
309 | + | |
310 | + var update = mxUtils.bind(this, function () { | |
311 | + if (this.xmlNode == null || this.xmlNode.nodeName != 'mxfile') { | |
344 | 312 | this.diagrams = []; |
345 | 313 | } |
346 | - if (this.xmlNode != lastXmlNode) | |
347 | - { | |
314 | + if (this.xmlNode != lastXmlNode) { | |
348 | 315 | this.diagrams = this.xmlNode.getElementsByTagName('diagram'); |
349 | 316 | lastXmlNode = this.xmlNode; |
350 | 317 | } |
... | ... | @@ -352,23 +319,19 @@ GraphViewer.prototype.init = function(container, xmlNode, graphConfig) |
352 | 319 | |
353 | 320 | // Replaces background page reference with SVG |
354 | 321 | var graphSetBackgroundImage = this.graph.setBackgroundImage; |
355 | - | |
356 | - this.graph.setBackgroundImage = function(img) | |
357 | - { | |
358 | - if (img != null && Graph.isPageLink(img.src)) | |
359 | - { | |
322 | + | |
323 | + this.graph.setBackgroundImage = function (img) { | |
324 | + if (img != null && Graph.isPageLink(img.src)) { | |
360 | 325 | var src = img.src; |
361 | 326 | var comma = src.indexOf(','); |
362 | - | |
363 | - if (comma > 0) | |
364 | - { | |
327 | + | |
328 | + if (comma > 0) { | |
365 | 329 | var index = self.getIndexById(src.substring(comma + 1)); |
366 | - | |
367 | - if (index >= 0) | |
368 | - { | |
330 | + | |
331 | + if (index >= 0) { | |
369 | 332 | img = self.getImageForGraphModel( |
370 | 333 | Editor.parseDiagramNode( |
371 | - self.diagrams[index])); | |
334 | + self.diagrams[index])); | |
372 | 335 | img.originalSrc = src; |
373 | 336 | } |
374 | 337 | } |
... | ... | @@ -379,19 +342,17 @@ GraphViewer.prototype.init = function(container, xmlNode, graphConfig) |
379 | 342 | |
380 | 343 | // Overrides graph bounds to include background pages |
381 | 344 | var graphGetGraphBounds = this.graph.getGraphBounds; |
382 | - | |
383 | - this.graph.getGraphBounds = function(img) | |
384 | - { | |
345 | + | |
346 | + this.graph.getGraphBounds = function (img) { | |
385 | 347 | var bounds = graphGetGraphBounds.apply(this, arguments); |
386 | 348 | var img = this.backgroundImage; |
387 | 349 | |
388 | 350 | // Check img.originalSrc to ignore background |
389 | 351 | // images but not background pages |
390 | - if (img != null) | |
391 | - { | |
352 | + if (img != null) { | |
392 | 353 | var t = this.view.translate; |
393 | 354 | var s = this.view.scale; |
394 | - | |
355 | + | |
395 | 356 | bounds = mxRectangle.fromRectangle(bounds); |
396 | 357 | bounds.add(new mxRectangle( |
397 | 358 | (t.x + img.x) * s, (t.y + img.y) * s, |
... | ... | @@ -404,66 +365,57 @@ GraphViewer.prototype.init = function(container, xmlNode, graphConfig) |
404 | 365 | // LATER: Add event for setGraphXml |
405 | 366 | this.addListener('xmlNodeChanged', update); |
406 | 367 | update(); |
407 | - | |
368 | + | |
408 | 369 | // Passes current page via urlParams global variable |
409 | 370 | // to let the parser know which page we're using |
410 | 371 | urlParams['page'] = self.currentPage; |
411 | 372 | var visible = null; |
412 | 373 | |
413 | 374 | this.graph.getModel().beginUpdate(); |
414 | - try | |
415 | - { | |
375 | + try { | |
416 | 376 | // Required for correct parsing of fold parameter |
417 | 377 | urlParams['nav'] = (this.graphConfig.nav != false) ? '1' : '0'; |
418 | - | |
378 | + | |
419 | 379 | this.editor.setGraphXml(this.xmlNode); |
420 | 380 | this.graph.view.scale = this.graphConfig.zoom || 1; |
421 | 381 | visible = this.setLayersVisible(); |
422 | - | |
423 | - if (!this.responsive) | |
424 | - { | |
382 | + | |
383 | + if (!this.responsive) { | |
425 | 384 | this.graph.border = (this.graphConfig.border != null) ? this.graphConfig.border : 8; |
426 | 385 | } |
427 | 386 | } |
428 | - finally | |
429 | - { | |
387 | + finally { | |
430 | 388 | this.graph.getModel().endUpdate(); |
431 | 389 | } |
432 | - | |
390 | + | |
433 | 391 | // Adds left-button panning only if scrollbars are visible |
434 | - if (!this.responsive) | |
435 | - { | |
436 | - this.graph.panningHandler.isForcePanningEvent = function(me) | |
437 | - { | |
392 | + if (!this.responsive) { | |
393 | + this.graph.panningHandler.isForcePanningEvent = function (me) { | |
438 | 394 | return !mxEvent.isPopupTrigger(me.getEvent()) && |
439 | 395 | this.graph.container.style.overflow == 'auto'; |
440 | 396 | }; |
441 | - | |
442 | - this.graph.panningHandler.useLeftButtonForPanning = true; | |
397 | + | |
398 | + this.graph.panningHandler.useLeftButtonForPanning = true; | |
443 | 399 | this.graph.panningHandler.ignoreCell = true; |
444 | 400 | this.graph.panningHandler.usePopupTrigger = false; |
445 | 401 | this.graph.panningHandler.pinchEnabled = false; |
446 | 402 | } |
447 | - | |
403 | + | |
448 | 404 | this.graph.setPanning(false); |
449 | - | |
450 | - if (this.graphConfig.toolbar != null) | |
451 | - { | |
405 | + | |
406 | + if (this.graphConfig.toolbar != null) { | |
452 | 407 | this.addToolbar(); |
453 | 408 | } |
454 | - else if (this.graphConfig.title != null && this.showTitleAsTooltip) | |
455 | - { | |
409 | + else if (this.graphConfig.title != null && this.showTitleAsTooltip) { | |
456 | 410 | container.setAttribute('title', this.graphConfig.title); |
457 | 411 | } |
458 | - | |
459 | - if (!this.responsive) | |
460 | - { | |
412 | + | |
413 | + if (!this.responsive) { | |
461 | 414 | this.addSizeHandler(); |
462 | 415 | } |
463 | 416 | |
464 | 417 | // Crops to visible layers if no layers toolbar button |
465 | - if (this.showLayers(this.graph) && !this.forceCenter && (!this.layersEnabled || this.autoCrop)) | |
466 | - { | |
418 | + if (this.showLayers(this.graph) && !this.forceCenter && (!this.layersEnabled || this.autoCrop)) { | |
467 | 419 | this.crop(); |
468 | 420 | } |
469 | 421 | |
... | ... | @@ -473,73 +425,61 @@ GraphViewer.prototype.init = function(container, xmlNode, graphConfig) |
473 | 425 | translate: this.graph.view.translate.clone(), |
474 | 426 | scale: this.graph.view.scale |
475 | 427 | }; |
476 | - | |
477 | - if (visible != null) | |
478 | - { | |
428 | + | |
429 | + if (visible != null) { | |
479 | 430 | this.setLayersVisible(visible); |
480 | 431 | } |
481 | - | |
482 | - this.graph.customLinkClicked = function(href) | |
483 | - { | |
484 | - try | |
485 | - { | |
486 | - if (Graph.isPageLink(href)) | |
487 | - { | |
432 | + | |
433 | + this.graph.customLinkClicked = function (href) { | |
434 | + try { | |
435 | + if (Graph.isPageLink(href)) { | |
488 | 436 | var comma = href.indexOf(','); |
489 | - | |
490 | - if (!self.selectPageById(href.substring(comma + 1))) | |
491 | - { | |
437 | + | |
438 | + if (!self.selectPageById(href.substring(comma + 1))) { | |
492 | 439 | alert(mxResources.get('pageNotFound') || 'Page not found'); |
493 | 440 | } |
494 | 441 | } |
495 | - else | |
496 | - { | |
442 | + else { | |
497 | 443 | this.handleCustomLink(href); |
498 | 444 | } |
499 | 445 | } |
500 | - catch (e) | |
501 | - { | |
446 | + catch (e) { | |
502 | 447 | alert(e.message); |
503 | 448 | } |
504 | - | |
449 | + | |
505 | 450 | return true; |
506 | 451 | }; |
507 | - | |
452 | + | |
508 | 453 | // Updates origin after tree cell folding |
509 | 454 | var graphFoldTreeCell = this.graph.foldTreeCell; |
510 | - | |
511 | - this.graph.foldTreeCell = mxUtils.bind(this, function() | |
512 | - { | |
455 | + | |
456 | + this.graph.foldTreeCell = mxUtils.bind(this, function () { | |
513 | 457 | this.treeCellFolded = true; |
514 | - | |
458 | + | |
515 | 459 | return graphFoldTreeCell.apply(this.graph, arguments); |
516 | 460 | }); |
517 | - | |
461 | + | |
518 | 462 | this.fireEvent(new mxEventObject('render')); |
519 | 463 | }); |
520 | 464 | |
521 | 465 | var MutObs = window.MutationObserver || |
522 | 466 | window.WebKitMutationObserver || |
523 | 467 | window.MozMutationObserver; |
524 | - | |
525 | - if (this.checkVisibleState && container.offsetWidth == 0 && typeof MutObs !== 'undefined') | |
526 | - { | |
468 | + | |
469 | + if (this.checkVisibleState && container.offsetWidth == 0 && typeof MutObs !== 'undefined') { | |
527 | 470 | // Delayed rendering if inside hidden container and event available |
528 | 471 | var par = this.getObservableParent(container); |
529 | - | |
530 | - var observer = new MutObs(mxUtils.bind(this, function(mutation) | |
531 | - { | |
532 | - if (container.offsetWidth > 0) | |
533 | - { | |
472 | + | |
473 | + var observer = new MutObs(mxUtils.bind(this, function (mutation) { | |
474 | + if (container.offsetWidth > 0) { | |
534 | 475 | observer.disconnect(); |
535 | 476 | render(); |
536 | 477 | } |
537 | 478 | })); |
538 | - | |
539 | - observer.observe(par, {attributes: true}); | |
479 | + | |
480 | + observer.observe(par, { attributes: true }); | |
540 | 481 | } |
541 | - else | |
542 | - { | |
482 | + else { | |
543 | 483 | // Immediate rendering in all other cases |
544 | 484 | render(); |
545 | 485 | } |
... | ... | @@ -550,43 +490,37 @@ GraphViewer.prototype.init = function(container, xmlNode, graphConfig) |
550 | 490 | /** |
551 | 491 | * |
552 | 492 | */ |
553 | -GraphViewer.prototype.getObservableParent = function(container) | |
554 | -{ | |
493 | +GraphViewer.prototype.getObservableParent = function (container) { | |
555 | 494 | var node = container.parentNode; |
556 | - | |
495 | + | |
557 | 496 | while (node != document.body && node.parentNode != null && |
558 | - mxUtils.getCurrentStyle(node).display !== 'none') | |
559 | - { | |
497 | + mxUtils.getCurrentStyle(node).display !== 'none') { | |
560 | 498 | node = node.parentNode; |
561 | 499 | } |
562 | - | |
500 | + | |
563 | 501 | return node; |
564 | 502 | }; |
565 | 503 | |
566 | 504 | /** |
567 | 505 | * |
568 | 506 | */ |
569 | -GraphViewer.prototype.getImageUrl = function(url) | |
570 | -{ | |
507 | +GraphViewer.prototype.getImageUrl = function (url) { | |
571 | 508 | if (url != null && url.substring(0, 7) != 'http://' && |
572 | - url.substring(0, 8) != 'https://' && url.substring(0, 10) != 'data:image') | |
573 | - { | |
574 | - if (url.charAt(0) == '/') | |
575 | - { | |
509 | + url.substring(0, 8) != 'https://' && url.substring(0, 10) != 'data:image') { | |
510 | + if (url.charAt(0) == '/') { | |
576 | 511 | url = url.substring(1, url.length); |
577 | 512 | } |
578 | - | |
513 | + | |
579 | 514 | url = this.imageBaseUrl + url; |
580 | 515 | } |
581 | - | |
516 | + | |
582 | 517 | return url; |
583 | 518 | }; |
584 | 519 | |
585 | 520 | /** |
586 | 521 | * |
587 | 522 | */ |
588 | -GraphViewer.prototype.getImageForGraphModel = function(node) | |
589 | -{ | |
523 | +GraphViewer.prototype.getImageForGraphModel = function (node) { | |
590 | 524 | var graph = Graph.createOffscreenGraph(this.graph.getStylesheet()); |
591 | 525 | graph.getGlobalVariable = this.graph.getGlobalVariable; |
592 | 526 | document.body.appendChild(graph.container); |
... | ... | @@ -594,7 +528,7 @@ GraphViewer.prototype.getImageForGraphModel = function(node) |
594 | 528 | var codec = new mxCodec(node.ownerDocument); |
595 | 529 | var root = codec.decode(node).root; |
596 | 530 | graph.model.setRoot(root); |
597 | - | |
531 | + | |
598 | 532 | var svgRoot = graph.getSvg(); |
599 | 533 | var bounds = graph.getGraphBounds(); |
600 | 534 | document.body.removeChild(graph.container); |
... | ... | @@ -606,14 +540,10 @@ GraphViewer.prototype.getImageForGraphModel = function(node) |
606 | 540 | /** |
607 | 541 | * |
608 | 542 | */ |
609 | -GraphViewer.prototype.getIndexById = function(id) | |
610 | -{ | |
611 | - if (this.diagrams != null) | |
612 | - { | |
613 | - for (var i = 0; i < this.diagrams.length; i++) | |
614 | - { | |
615 | - if (this.diagrams[i].getAttribute('id') == id) | |
616 | - { | |
543 | +GraphViewer.prototype.getIndexById = function (id) { | |
544 | + if (this.diagrams != null) { | |
545 | + for (var i = 0; i < this.diagrams.length; i++) { | |
546 | + if (this.diagrams[i].getAttribute('id') == id) { | |
617 | 547 | return i; |
618 | 548 | } |
619 | 549 | } |
... | ... | @@ -625,15 +555,14 @@ GraphViewer.prototype.getIndexById = function(id) |
625 | 555 | /** |
626 | 556 | * |
627 | 557 | */ |
628 | -GraphViewer.prototype.setXmlNode = function(xmlNode) | |
629 | -{ | |
558 | +GraphViewer.prototype.setXmlNode = function (xmlNode) { | |
630 | 559 | //Extract graph model from html & svg formats |
631 | 560 | xmlNode = this.editor.extractGraphModel(xmlNode, true); |
632 | 561 | |
633 | 562 | this.xmlDocument = xmlNode.ownerDocument; |
634 | 563 | this.xml = mxUtils.getXml(xmlNode); |
635 | 564 | this.xmlNode = xmlNode; |
636 | - | |
565 | + | |
637 | 566 | this.updateGraphXml(xmlNode); |
638 | 567 | this.fireEvent(new mxEventObject('xmlNodeChanged')); |
639 | 568 | }; |
... | ... | @@ -641,23 +570,20 @@ GraphViewer.prototype.setXmlNode = function(xmlNode) |
641 | 570 | /** |
642 | 571 | * |
643 | 572 | */ |
644 | -GraphViewer.prototype.setFileNode = function(xmlNode) | |
645 | -{ | |
646 | - if (this.xmlNode == null) | |
647 | - { | |
573 | +GraphViewer.prototype.setFileNode = function (xmlNode) { | |
574 | + if (this.xmlNode == null) { | |
648 | 575 | this.xmlDocument = xmlNode.ownerDocument; |
649 | 576 | this.xml = mxUtils.getXml(xmlNode); |
650 | 577 | this.xmlNode = xmlNode; |
651 | 578 | } |
652 | - | |
579 | + | |
653 | 580 | this.setGraphXml(xmlNode); |
654 | 581 | }; |
655 | 582 | |
656 | 583 | /** |
657 | 584 | * |
658 | 585 | */ |
659 | -GraphViewer.prototype.updateGraphXml = function(xmlNode) | |
660 | -{ | |
586 | +GraphViewer.prototype.updateGraphXml = function (xmlNode) { | |
661 | 587 | this.setGraphXml(xmlNode); |
662 | 588 | this.fireEvent(new mxEventObject('graphChanged')); |
663 | 589 | }; |
... | ... | @@ -665,81 +591,68 @@ GraphViewer.prototype.updateGraphXml = function(xmlNode) |
665 | 591 | /** |
666 | 592 | * |
667 | 593 | */ |
668 | -GraphViewer.prototype.setLayersVisible = function(visible) | |
669 | -{ | |
594 | +GraphViewer.prototype.setLayersVisible = function (visible) { | |
670 | 595 | var allVisible = true; |
671 | - | |
672 | - if (!this.autoOrigin) | |
673 | - { | |
596 | + | |
597 | + if (!this.autoOrigin) { | |
674 | 598 | var result = []; |
675 | 599 | var model = this.graph.getModel(); |
676 | - | |
600 | + | |
677 | 601 | model.beginUpdate(); |
678 | - try | |
679 | - { | |
680 | - for (var i = 0; i < model.getChildCount(model.root); i++) | |
681 | - { | |
602 | + try { | |
603 | + for (var i = 0; i < model.getChildCount(model.root); i++) { | |
682 | 604 | var layer = model.getChildAt(model.root, i); |
683 | 605 | allVisible = allVisible && model.isVisible(layer); |
684 | 606 | result.push(model.isVisible(layer)); |
685 | 607 | model.setVisible(layer, (visible != null) ? visible[i] : true); |
686 | 608 | } |
687 | 609 | } |
688 | - finally | |
689 | - { | |
610 | + finally { | |
690 | 611 | model.endUpdate(); |
691 | 612 | } |
692 | 613 | } |
693 | - | |
614 | + | |
694 | 615 | return (allVisible) ? null : result; |
695 | 616 | }; |
696 | 617 | |
697 | 618 | /** |
698 | 619 | * |
699 | 620 | */ |
700 | -GraphViewer.prototype.setGraphXml = function(xmlNode) | |
701 | -{ | |
702 | - if (this.graph != null) | |
703 | - { | |
621 | +GraphViewer.prototype.setGraphXml = function (xmlNode) { | |
622 | + if (this.graph != null) { | |
704 | 623 | this.graph.view.translate = new mxPoint(); |
705 | 624 | this.graph.view.scale = 1; |
706 | 625 | var visible = null; |
707 | - | |
626 | + | |
708 | 627 | this.graph.getModel().beginUpdate(); |
709 | - try | |
710 | - { | |
628 | + try { | |
711 | 629 | this.graph.getModel().clear(); |
712 | 630 | this.editor.setGraphXml(xmlNode); |
713 | 631 | visible = this.setLayersVisible(true); |
714 | 632 | } |
715 | - finally | |
716 | - { | |
633 | + finally { | |
717 | 634 | this.graph.getModel().endUpdate(); |
718 | 635 | } |
719 | - | |
720 | - if (!this.responsive) | |
721 | - { | |
636 | + | |
637 | + if (!this.responsive) { | |
722 | 638 | // Restores initial CSS state |
723 | - if (this.widthIsEmpty) | |
724 | - { | |
639 | + if (this.widthIsEmpty) { | |
725 | 640 | this.graph.container.style.width = ''; |
726 | 641 | this.graph.container.style.height = ''; |
727 | 642 | } |
728 | - else | |
729 | - { | |
643 | + else { | |
730 | 644 | this.graph.container.style.width = this.initialWidth; |
731 | 645 | } |
732 | - | |
646 | + | |
733 | 647 | this.positionGraph(); |
734 | 648 | } |
735 | - | |
649 | + | |
736 | 650 | this.graph.initialViewState = { |
737 | 651 | translate: this.graph.view.translate.clone(), |
738 | 652 | scale: this.graph.view.scale |
739 | 653 | }; |
740 | - | |
741 | - if (visible) | |
742 | - { | |
654 | + | |
655 | + if (visible) { | |
743 | 656 | this.setLayersVisible(visible); |
744 | 657 | } |
745 | 658 | } |
... | ... | @@ -748,88 +661,72 @@ GraphViewer.prototype.setGraphXml = function(xmlNode) |
748 | 661 | /** |
749 | 662 | * |
750 | 663 | */ |
751 | -GraphViewer.prototype.addSizeHandler = function() | |
752 | -{ | |
664 | +GraphViewer.prototype.addSizeHandler = function () { | |
753 | 665 | var container = this.graph.container; |
754 | 666 | var bounds = this.graph.getGraphBounds(); |
755 | 667 | var updatingOverflow = false; |
756 | 668 | |
757 | - if (this.graphConfig['toolbar-nohide'] != true) | |
758 | - { | |
669 | + if (this.graphConfig['toolbar-nohide'] != true) { | |
759 | 670 | container.style.overflow = 'hidden'; |
760 | 671 | } |
761 | - else | |
762 | - { | |
672 | + else { | |
763 | 673 | container.style.overflow = 'visible'; |
764 | 674 | } |
765 | - | |
766 | - var updateOverflow = mxUtils.bind(this, function() | |
767 | - { | |
768 | - if (!updatingOverflow) | |
769 | - { | |
675 | + | |
676 | + var updateOverflow = mxUtils.bind(this, function () { | |
677 | + if (!updatingOverflow) { | |
770 | 678 | updatingOverflow = true; |
771 | 679 | var tmp = this.graph.getGraphBounds(); |
772 | - | |
773 | - if (this.graphConfig['toolbar-nohide'] != true) | |
774 | - { | |
680 | + | |
681 | + if (this.graphConfig['toolbar-nohide'] != true) { | |
775 | 682 | // Shows scrollbars if graph is larger than available width |
776 | - if (tmp.width + 2 * this.graph.border > container.offsetWidth - 2) | |
777 | - { | |
683 | + if (tmp.width + 2 * this.graph.border > container.offsetWidth - 2) { | |
778 | 684 | container.style.overflow = 'auto'; |
779 | 685 | } |
780 | - else | |
781 | - { | |
686 | + else { | |
782 | 687 | container.style.overflow = 'hidden'; |
783 | 688 | } |
784 | 689 | } |
785 | - else | |
786 | - { | |
690 | + else { | |
787 | 691 | container.style.overflow = 'visible'; |
788 | 692 | } |
789 | 693 | |
790 | - if (this.toolbar != null && this.graphConfig['toolbar-nohide'] != true) | |
791 | - { | |
694 | + if (this.toolbar != null && this.graphConfig['toolbar-nohide'] != true) { | |
792 | 695 | var r = container.getBoundingClientRect(); |
793 | - | |
696 | + | |
794 | 697 | // Workaround for position:relative set in ResizeSensor |
795 | 698 | var origin = mxUtils.getScrollOrigin(document.body) |
796 | 699 | var b = (document.body.style.position === 'relative') ? |
797 | 700 | document.body.getBoundingClientRect() : |
798 | - {left: -origin.x, top: -origin.y}; | |
799 | - r = {left: r.left - b.left, top: r.top - b.top, bottom: r.bottom - b.top, right: r.right - b.left}; | |
800 | - | |
701 | + { left: -origin.x, top: -origin.y }; | |
702 | + r = { left: r.left - b.left, top: r.top - b.top, bottom: r.bottom - b.top, right: r.right - b.left }; | |
703 | + | |
801 | 704 | this.toolbar.style.left = r.left + 'px'; |
802 | - | |
803 | - if (this.graphConfig['toolbar-position'] == 'bottom') | |
804 | - { | |
705 | + | |
706 | + if (this.graphConfig['toolbar-position'] == 'bottom') { | |
805 | 707 | this.toolbar.style.top = r.bottom - 1 + 'px'; |
806 | 708 | } |
807 | - else | |
808 | - { | |
809 | - if (this.graphConfig['toolbar-position'] != 'inline') | |
810 | - { | |
709 | + else { | |
710 | + if (this.graphConfig['toolbar-position'] != 'inline') { | |
811 | 711 | this.toolbar.style.width = Math.max(this.minToolbarWidth, container.offsetWidth) + 'px'; |
812 | 712 | this.toolbar.style.top = r.top + 1 + 'px'; |
813 | 713 | } |
814 | - else | |
815 | - { | |
714 | + else { | |
816 | 715 | this.toolbar.style.top = r.top + 'px'; |
817 | 716 | } |
818 | 717 | } |
819 | 718 | } |
820 | - else if (this.toolbar != null) | |
821 | - { | |
719 | + else if (this.toolbar != null) { | |
822 | 720 | this.toolbar.style.width = Math.max(this.minToolbarWidth, container.offsetWidth) + 'px'; |
823 | 721 | } |
824 | 722 | |
825 | 723 | // Updates origin after tree cell folding |
826 | - if (this.treeCellFolded) | |
827 | - { | |
724 | + if (this.treeCellFolded) { | |
828 | 725 | this.treeCellFolded = false; |
829 | 726 | this.positionGraph(this.graph.view.translate); |
830 | 727 | this.graph.initialViewState.translate = this.graph.view.translate.clone(); |
831 | 728 | } |
832 | - | |
729 | + | |
833 | 730 | updatingOverflow = false; |
834 | 731 | } |
835 | 732 | }); |
... | ... | @@ -837,35 +734,30 @@ GraphViewer.prototype.addSizeHandler = function() |
837 | 734 | var lastOffsetWidth = null; |
838 | 735 | var cachedOffsetWidth = null; |
839 | 736 | this.handlingResize = false; |
840 | - | |
737 | + | |
841 | 738 | // Installs function on instance |
842 | - this.fitGraph = mxUtils.bind(this, function(maxScale) | |
843 | - { | |
739 | + this.fitGraph = mxUtils.bind(this, function (maxScale) { | |
844 | 740 | var cachedOffsetWidth = container.offsetWidth; |
845 | - | |
846 | - if (cachedOffsetWidth != lastOffsetWidth && !this.handlingResize) | |
847 | - { | |
741 | + | |
742 | + if (cachedOffsetWidth != lastOffsetWidth && !this.handlingResize) { | |
848 | 743 | this.handlingResize = true; |
849 | - | |
744 | + | |
850 | 745 | // Hides scrollbars to force update of translate |
851 | - if (container.style.overflow == 'auto') | |
852 | - { | |
746 | + if (container.style.overflow == 'auto') { | |
853 | 747 | container.style.overflow = 'hidden'; |
854 | 748 | } |
855 | - | |
749 | + | |
856 | 750 | this.graph.maxFitScale = (maxScale != null) ? maxScale : (this.graphConfig.zoom || |
857 | 751 | ((this.allowZoomIn) ? null : 1)); |
858 | 752 | this.graph.fit(null, null, null, null, null, true); |
859 | 753 | |
860 | - if (this.center || !(this.graphConfig.resize != false || container.style.height == '')) | |
861 | - { | |
754 | + if (this.center || !(this.graphConfig.resize != false || container.style.height == '')) { | |
862 | 755 | this.graph.center(); |
863 | - } | |
864 | - | |
756 | + } | |
757 | + | |
865 | 758 | this.graph.maxFitScale = null; |
866 | - | |
867 | - if (this.graphConfig.resize != false || container.style.height == '') | |
868 | - { | |
759 | + | |
760 | + if (this.graphConfig.resize != false || container.style.height == '') { | |
869 | 761 | this.updateContainerHeight(container, Math.max(this.minHeight, |
870 | 762 | this.graph.getGraphBounds().height + |
871 | 763 | 2 * this.graph.border + 1)); |
... | ... | @@ -875,136 +767,112 @@ GraphViewer.prototype.addSizeHandler = function() |
875 | 767 | translate: this.graph.view.translate.clone(), |
876 | 768 | scale: this.graph.view.scale |
877 | 769 | }; |
878 | - | |
770 | + | |
879 | 771 | lastOffsetWidth = cachedOffsetWidth; |
880 | - | |
772 | + | |
881 | 773 | // Workaround for fit triggering scrollbars triggering doResize (infinite loop) |
882 | - window.setTimeout(mxUtils.bind(this, function() | |
883 | - { | |
774 | + window.setTimeout(mxUtils.bind(this, function () { | |
884 | 775 | this.handlingResize = false; |
885 | 776 | }), 0); |
886 | 777 | } |
887 | 778 | }); |
888 | 779 | |
889 | - if (GraphViewer.useResizeSensor) | |
890 | - { | |
891 | - if (document.documentMode <= 9) | |
892 | - { | |
780 | + if (GraphViewer.useResizeSensor) { | |
781 | + if (document.documentMode <= 9) { | |
893 | 782 | mxEvent.addListener(window, 'resize', updateOverflow); |
894 | 783 | this.graph.addListener('size', updateOverflow); |
895 | 784 | } |
896 | - else | |
897 | - { | |
785 | + else { | |
898 | 786 | new ResizeSensor(this.graph.container, updateOverflow); |
899 | 787 | } |
900 | 788 | } |
901 | - | |
902 | - if (this.graphConfig.resize || ((this.zoomEnabled || !this.autoFit) && this.graphConfig.resize != false)) | |
903 | - { | |
789 | + | |
790 | + if (this.graphConfig.resize || ((this.zoomEnabled || !this.autoFit) && this.graphConfig.resize != false)) { | |
904 | 791 | this.graph.minimumContainerSize = new mxRectangle(0, 0, this.minWidth, this.minHeight); |
905 | 792 | this.graph.resizeContainer = true; |
906 | 793 | } |
907 | - else | |
908 | - { | |
794 | + else { | |
909 | 795 | // Sets initial size for responsive diagram to stop at actual size |
910 | - if (this.widthIsEmpty && !(container.style.height != '' && this.autoFit)) | |
911 | - { | |
796 | + if (this.widthIsEmpty && !(container.style.height != '' && this.autoFit)) { | |
912 | 797 | this.updateContainerWidth(container, bounds.width + 2 * this.graph.border); |
913 | 798 | } |
914 | - | |
915 | - if (this.graphConfig.resize != false || container.style.height == '') | |
916 | - { | |
799 | + | |
800 | + if (this.graphConfig.resize != false || container.style.height == '') { | |
917 | 801 | this.updateContainerHeight(container, Math.max(this.minHeight, bounds.height + 2 * this.graph.border + 1)); |
918 | 802 | } |
919 | 803 | |
920 | - if (!this.zoomEnabled && this.autoFit) | |
921 | - { | |
804 | + if (!this.zoomEnabled && this.autoFit) { | |
922 | 805 | var lastOffsetWidth = null; |
923 | 806 | var scheduledResize = null; |
924 | 807 | var cachedOffsetWidth = null; |
925 | - | |
926 | - var doResize = mxUtils.bind(this, function() | |
927 | - { | |
808 | + | |
809 | + var doResize = mxUtils.bind(this, function () { | |
928 | 810 | window.clearTimeout(scheduledResize); |
929 | - | |
930 | - if (!this.handlingResize) | |
931 | - { | |
811 | + | |
812 | + if (!this.handlingResize) { | |
932 | 813 | scheduledResize = window.setTimeout(mxUtils.bind(this, this.fitGraph), 100); |
933 | 814 | } |
934 | 815 | }); |
935 | - | |
936 | - if (GraphViewer.useResizeSensor) | |
937 | - { | |
938 | - if (document.documentMode <= 9) | |
939 | - { | |
816 | + | |
817 | + if (GraphViewer.useResizeSensor) { | |
818 | + if (document.documentMode <= 9) { | |
940 | 819 | mxEvent.addListener(window, 'resize', doResize); |
941 | 820 | } |
942 | - else | |
943 | - { | |
821 | + else { | |
944 | 822 | new ResizeSensor(this.graph.container, doResize); |
945 | 823 | } |
946 | 824 | } |
947 | 825 | } |
948 | - else if (!(document.documentMode <= 9)) | |
949 | - { | |
826 | + else if (!(document.documentMode <= 9)) { | |
950 | 827 | this.graph.addListener('size', updateOverflow); |
951 | 828 | } |
952 | 829 | } |
953 | 830 | |
954 | - var positionGraph = mxUtils.bind(this, function(origin) | |
955 | - { | |
831 | + var positionGraph = mxUtils.bind(this, function (origin) { | |
956 | 832 | // Allocates maximum width while setting initial view state |
957 | 833 | var prev = container.style.minWidth; |
958 | - | |
959 | - if (this.widthIsEmpty) | |
960 | - { | |
834 | + | |
835 | + if (this.widthIsEmpty) { | |
961 | 836 | container.style.minWidth = '100%'; |
962 | 837 | } |
963 | - | |
838 | + | |
964 | 839 | var maxHeight = (this.graphConfig['max-height'] != null) ? this.graphConfig['max-height'] : |
965 | 840 | ((container.style.height != '' && this.autoFit) ? container.offsetHeight : undefined); |
966 | - | |
841 | + | |
967 | 842 | if (container.offsetWidth > 0 && origin == null && this.allowZoomOut && (this.allowZoomIn || |
968 | 843 | bounds.width + 2 * this.graph.border > container.offsetWidth || |
969 | - bounds.height + 2 * this.graph.border > maxHeight)) | |
970 | - { | |
844 | + bounds.height + 2 * this.graph.border > maxHeight)) { | |
971 | 845 | var maxScale = null; |
972 | 846 | |
973 | - if (maxHeight != null && bounds.height + 2 * this.graph.border > maxHeight - 2) | |
974 | - { | |
847 | + if (maxHeight != null && bounds.height + 2 * this.graph.border > maxHeight - 2) { | |
975 | 848 | maxScale = (maxHeight - 2 * this.graph.border - 2) / bounds.height; |
976 | 849 | } |
977 | 850 | |
978 | 851 | this.fitGraph(maxScale); |
979 | 852 | } |
980 | - else if (!this.widthIsEmpty && origin == null && !(this.graphConfig.resize != false || container.style.height == '')) | |
981 | - { | |
853 | + else if (!this.widthIsEmpty && origin == null && !(this.graphConfig.resize != false || container.style.height == '')) { | |
982 | 854 | this.graph.center((!this.widthIsEmpty || bounds.width < this.minWidth) && this.graphConfig.resize != true); |
983 | 855 | } |
984 | - else | |
985 | - { | |
856 | + else { | |
986 | 857 | origin = (origin != null) ? origin : new mxPoint(); |
987 | - | |
858 | + | |
988 | 859 | this.graph.view.setTranslate(Math.floor(this.graph.border - bounds.x / this.graph.view.scale) + origin.x, |
989 | 860 | Math.floor(this.graph.border - bounds.y / this.graph.view.scale) + origin.y); |
990 | 861 | lastOffsetWidth = container.offsetWidth; |
991 | 862 | } |
992 | - | |
863 | + | |
993 | 864 | container.style.minWidth = prev |
994 | 865 | }); |
995 | 866 | |
996 | - if (document.documentMode == 8) | |
997 | - { | |
867 | + if (document.documentMode == 8) { | |
998 | 868 | window.setTimeout(positionGraph, 0); |
999 | 869 | } |
1000 | - else | |
1001 | - { | |
870 | + else { | |
1002 | 871 | positionGraph(); |
1003 | 872 | } |
1004 | 873 | |
1005 | 874 | // Installs function on instance |
1006 | - this.positionGraph = function(origin) | |
1007 | - { | |
875 | + this.positionGraph = function (origin) { | |
1008 | 876 | bounds = this.graph.getGraphBounds(); |
1009 | 877 | lastOffsetWidth = null; |
1010 | 878 | positionGraph(origin); |
... | ... | @@ -1014,8 +882,7 @@ GraphViewer.prototype.addSizeHandler = function() |
1014 | 882 | /** |
1015 | 883 | * Moves the origin of the graph to the top, right corner. |
1016 | 884 | */ |
1017 | -GraphViewer.prototype.crop = function() | |
1018 | -{ | |
885 | +GraphViewer.prototype.crop = function () { | |
1019 | 886 | var graph = this.graph; |
1020 | 887 | var bounds = graph.getGraphBounds(); |
1021 | 888 | var border = graph.border; |
... | ... | @@ -1029,19 +896,16 @@ GraphViewer.prototype.crop = function() |
1029 | 896 | /** |
1030 | 897 | * |
1031 | 898 | */ |
1032 | -GraphViewer.prototype.updateContainerWidth = function(container, width) | |
1033 | -{ | |
899 | +GraphViewer.prototype.updateContainerWidth = function (container, width) { | |
1034 | 900 | container.style.width = width + 'px'; |
1035 | 901 | }; |
1036 | 902 | |
1037 | 903 | /** |
1038 | 904 | * |
1039 | 905 | */ |
1040 | -GraphViewer.prototype.updateContainerHeight = function(container, height) | |
1041 | -{ | |
906 | +GraphViewer.prototype.updateContainerHeight = function (container, height) { | |
1042 | 907 | if (this.forceCenter || this.zoomEnabled || !this.autoFit || document.compatMode == 'BackCompat' || |
1043 | - document.documentMode == 8) | |
1044 | - { | |
908 | + document.documentMode == 8) { | |
1045 | 909 | container.style.height = height + 'px'; |
1046 | 910 | } |
1047 | 911 | }; |
... | ... | @@ -1049,76 +913,62 @@ GraphViewer.prototype.updateContainerHeight = function(container, height) |
1049 | 913 | /** |
1050 | 914 | * Shows the |
1051 | 915 | */ |
1052 | -GraphViewer.prototype.showLayers = function(graph, sourceGraph) | |
1053 | -{ | |
916 | +GraphViewer.prototype.showLayers = function (graph, sourceGraph) { | |
1054 | 917 | var layers = this.graphConfig.layers; |
1055 | 918 | var idx = (layers != null && layers.length > 0) ? layers.split(' ') : []; |
1056 | 919 | var layerIds = this.graphConfig.layerIds; |
1057 | 920 | var hasLayerIds = layerIds != null && layerIds.length > 0; |
1058 | 921 | var result = false; |
1059 | - | |
1060 | - if (idx.length > 0 || hasLayerIds || sourceGraph != null) | |
1061 | - { | |
922 | + | |
923 | + if (idx.length > 0 || hasLayerIds || sourceGraph != null) { | |
1062 | 924 | var source = (sourceGraph != null) ? sourceGraph.getModel() : null; |
1063 | 925 | var model = graph.getModel(); |
1064 | 926 | model.beginUpdate(); |
1065 | - | |
1066 | - try | |
1067 | - { | |
927 | + | |
928 | + try { | |
1068 | 929 | var childCount = model.getChildCount(model.root); |
1069 | - | |
930 | + | |
1070 | 931 | // Shows specified layers (eg. 0 1 3) |
1071 | - if (source == null) | |
1072 | - { | |
932 | + if (source == null) { | |
1073 | 933 | var layersFound = false, visibleLayers = {}; |
1074 | - | |
1075 | - if (hasLayerIds) | |
1076 | - { | |
1077 | - for (var i = 0; i < layerIds.length; i++) | |
1078 | - { | |
934 | + | |
935 | + if (hasLayerIds) { | |
936 | + for (var i = 0; i < layerIds.length; i++) { | |
1079 | 937 | var layer = model.getCell(layerIds[i]); |
1080 | - | |
1081 | - if (layer != null) | |
1082 | - { | |
938 | + | |
939 | + if (layer != null) { | |
1083 | 940 | layersFound = true; |
1084 | 941 | visibleLayers[layer.id] = true; |
1085 | 942 | } |
1086 | 943 | } |
1087 | 944 | } |
1088 | - else | |
1089 | - { | |
1090 | - for (var i = 0; i < idx.length; i++) | |
1091 | - { | |
945 | + else { | |
946 | + for (var i = 0; i < idx.length; i++) { | |
1092 | 947 | var layer = model.getChildAt(model.root, parseInt(idx[i])); |
1093 | 948 | |
1094 | - if (layer != null) | |
1095 | - { | |
949 | + if (layer != null) { | |
1096 | 950 | layersFound = true; |
1097 | 951 | visibleLayers[layer.id] = true; |
1098 | 952 | } |
1099 | 953 | } |
1100 | 954 | } |
1101 | - | |
955 | + | |
1102 | 956 | //To prevent hiding all layers, only apply if the specified layers are found |
1103 | 957 | //This prevents incorrect settings from showing an empty viewer |
1104 | - for (var i = 0; layersFound && i < childCount; i++) | |
1105 | - { | |
958 | + for (var i = 0; layersFound && i < childCount; i++) { | |
1106 | 959 | var layer = model.getChildAt(model.root, i); |
1107 | 960 | model.setVisible(layer, visibleLayers[layer.id] || false); |
1108 | 961 | } |
1109 | 962 | } |
1110 | - else | |
1111 | - { | |
963 | + else { | |
1112 | 964 | // Match visible layers in source graph |
1113 | - for (var i = 0; i < childCount; i++) | |
1114 | - { | |
965 | + for (var i = 0; i < childCount; i++) { | |
1115 | 966 | model.setVisible(model.getChildAt(model.root, i), |
1116 | 967 | source.isVisible(source.getChildAt(source.root, i))); |
1117 | 968 | } |
1118 | 969 | } |
1119 | 970 | } |
1120 | - finally | |
1121 | - { | |
971 | + finally { | |
1122 | 972 | model.endUpdate(); |
1123 | 973 | } |
1124 | 974 | |
... | ... | @@ -1131,16 +981,13 @@ GraphViewer.prototype.showLayers = function(graph, sourceGraph) |
1131 | 981 | /** |
1132 | 982 | * |
1133 | 983 | */ |
1134 | -GraphViewer.prototype.addToolbar = function() | |
1135 | -{ | |
984 | +GraphViewer.prototype.addToolbar = function () { | |
1136 | 985 | var container = this.graph.container; |
1137 | - | |
1138 | - if (this.graphConfig['toolbar-position'] == 'bottom') | |
1139 | - { | |
986 | + | |
987 | + if (this.graphConfig['toolbar-position'] == 'bottom') { | |
1140 | 988 | container.style.marginBottom = this.toolbarHeight + 'px'; |
1141 | 989 | } |
1142 | - else if (this.graphConfig['toolbar-position'] != 'inline') | |
1143 | - { | |
990 | + else if (this.graphConfig['toolbar-position'] != 'inline') { | |
1144 | 991 | container.style.marginTop = this.toolbarHeight + 'px'; |
1145 | 992 | } |
1146 | 993 | |
... | ... | @@ -1155,145 +1002,122 @@ GraphViewer.prototype.addToolbar = function() |
1155 | 1002 | toolbar.style.backgroundColor = '#eee'; |
1156 | 1003 | toolbar.style.height = this.toolbarHeight + 'px'; |
1157 | 1004 | this.toolbar = toolbar; |
1158 | - | |
1159 | - if (this.graphConfig['toolbar-position'] == 'inline') | |
1160 | - { | |
1005 | + | |
1006 | + if (this.graphConfig['toolbar-position'] == 'inline') { | |
1161 | 1007 | mxUtils.setPrefixedStyle(toolbar.style, 'transition', 'opacity 100ms ease-in-out'); |
1162 | 1008 | mxUtils.setOpacity(toolbar, 30); |
1163 | - | |
1009 | + | |
1164 | 1010 | // Changes toolbar opacity on hover |
1165 | 1011 | var fadeThread = null; |
1166 | 1012 | var fadeThread2 = null; |
1167 | - | |
1168 | - var fadeOut = mxUtils.bind(this, function(delay) | |
1169 | - { | |
1170 | - if (fadeThread != null) | |
1171 | - { | |
1013 | + | |
1014 | + var fadeOut = mxUtils.bind(this, function (delay) { | |
1015 | + if (fadeThread != null) { | |
1172 | 1016 | window.clearTimeout(fadeThread); |
1173 | 1017 | fadeThead = null; |
1174 | 1018 | } |
1175 | - | |
1176 | - if (fadeThread2 != null) | |
1177 | - { | |
1019 | + | |
1020 | + if (fadeThread2 != null) { | |
1178 | 1021 | window.clearTimeout(fadeThread2); |
1179 | 1022 | fadeThead2 = null; |
1180 | 1023 | } |
1181 | - | |
1182 | - fadeThread = window.setTimeout(mxUtils.bind(this, function() | |
1183 | - { | |
1184 | - mxUtils.setOpacity(toolbar, 0); | |
1024 | + | |
1025 | + fadeThread = window.setTimeout(mxUtils.bind(this, function () { | |
1026 | + mxUtils.setOpacity(toolbar, 0); | |
1185 | 1027 | fadeThread = null; |
1186 | - | |
1187 | - fadeThread2 = window.setTimeout(mxUtils.bind(this, function() | |
1188 | - { | |
1028 | + | |
1029 | + fadeThread2 = window.setTimeout(mxUtils.bind(this, function () { | |
1189 | 1030 | toolbar.style.display = 'none'; |
1190 | 1031 | fadeThread2 = null; |
1191 | 1032 | }), 100); |
1192 | 1033 | }), delay || 200); |
1193 | 1034 | }); |
1194 | - | |
1195 | - var fadeIn = mxUtils.bind(this, function(opacity) | |
1196 | - { | |
1197 | - if (fadeThread != null) | |
1198 | - { | |
1035 | + | |
1036 | + var fadeIn = mxUtils.bind(this, function (opacity) { | |
1037 | + if (fadeThread != null) { | |
1199 | 1038 | window.clearTimeout(fadeThread); |
1200 | 1039 | fadeThead = null; |
1201 | 1040 | } |
1202 | - | |
1203 | - if (fadeThread2 != null) | |
1204 | - { | |
1041 | + | |
1042 | + if (fadeThread2 != null) { | |
1205 | 1043 | window.clearTimeout(fadeThread2); |
1206 | 1044 | fadeThead2 = null; |
1207 | 1045 | } |
1208 | - | |
1046 | + | |
1209 | 1047 | toolbar.style.display = ''; |
1210 | - mxUtils.setOpacity(toolbar, opacity || 30); | |
1048 | + mxUtils.setOpacity(toolbar, opacity || 30); | |
1211 | 1049 | }); |
1212 | - | |
1213 | - mxEvent.addListener(this.graph.container, (mxClient.IS_POINTER) ? 'pointermove' : 'mousemove', mxUtils.bind(this, function(evt) | |
1214 | - { | |
1215 | - if (!mxEvent.isTouchEvent(evt)) | |
1216 | - { | |
1050 | + | |
1051 | + mxEvent.addListener(this.graph.container, (mxClient.IS_POINTER) ? 'pointermove' : 'mousemove', mxUtils.bind(this, function (evt) { | |
1052 | + if (!mxEvent.isTouchEvent(evt)) { | |
1217 | 1053 | fadeIn(30); |
1218 | 1054 | fadeOut(); |
1219 | 1055 | } |
1220 | 1056 | })); |
1221 | - | |
1222 | - mxEvent.addListener(toolbar, (mxClient.IS_POINTER) ? 'pointermove' : 'mousemove', function(evt) | |
1223 | - { | |
1057 | + | |
1058 | + mxEvent.addListener(toolbar, (mxClient.IS_POINTER) ? 'pointermove' : 'mousemove', function (evt) { | |
1224 | 1059 | mxEvent.consume(evt); |
1225 | 1060 | }); |
1226 | - | |
1227 | - mxEvent.addListener(toolbar, 'mouseenter', mxUtils.bind(this, function(evt) | |
1228 | - { | |
1061 | + | |
1062 | + mxEvent.addListener(toolbar, 'mouseenter', mxUtils.bind(this, function (evt) { | |
1229 | 1063 | fadeIn(100); |
1230 | 1064 | })); |
1231 | 1065 | |
1232 | - mxEvent.addListener(toolbar, 'mousemove', mxUtils.bind(this, function(evt) | |
1233 | - { | |
1066 | + mxEvent.addListener(toolbar, 'mousemove', mxUtils.bind(this, function (evt) { | |
1234 | 1067 | fadeIn(100); |
1235 | 1068 | mxEvent.consume(evt); |
1236 | 1069 | })); |
1237 | 1070 | |
1238 | - mxEvent.addListener(toolbar, 'mouseleave', mxUtils.bind(this, function(evt) | |
1239 | - { | |
1240 | - if (!mxEvent.isTouchEvent(evt)) | |
1241 | - { | |
1071 | + mxEvent.addListener(toolbar, 'mouseleave', mxUtils.bind(this, function (evt) { | |
1072 | + if (!mxEvent.isTouchEvent(evt)) { | |
1242 | 1073 | fadeIn(30); |
1243 | 1074 | } |
1244 | 1075 | })); |
1245 | - | |
1076 | + | |
1246 | 1077 | // Shows/hides toolbar for touch devices |
1247 | 1078 | var graph = this.graph; |
1248 | 1079 | var tol = graph.getTolerance(); |
1249 | 1080 | |
1250 | 1081 | graph.addMouseListener( |
1251 | - { | |
1252 | - startX: 0, | |
1253 | - startY: 0, | |
1254 | - scrollLeft: 0, | |
1255 | - scrollTop: 0, | |
1256 | - mouseDown: function(sender, me) | |
1257 | - { | |
1258 | - this.startX = me.getGraphX(); | |
1259 | - this.startY = me.getGraphY(); | |
1260 | - this.scrollLeft = graph.container.scrollLeft; | |
1261 | - this.scrollTop = graph.container.scrollTop; | |
1262 | - }, | |
1263 | - mouseMove: function(sender, me) {}, | |
1264 | - mouseUp: function(sender, me) | |
1265 | - { | |
1266 | - if (mxEvent.isTouchEvent(me.getEvent())) | |
1267 | - { | |
1268 | - if ((Math.abs(this.scrollLeft - graph.container.scrollLeft) < tol && | |
1269 | - Math.abs(this.scrollTop - graph.container.scrollTop) < tol) && | |
1270 | - (Math.abs(this.startX - me.getGraphX()) < tol && | |
1271 | - Math.abs(this.startY - me.getGraphY()) < tol)) | |
1272 | - { | |
1273 | - if (parseFloat(toolbar.style.opacity || 0) > 0) | |
1274 | - { | |
1275 | - fadeOut(); | |
1276 | - } | |
1277 | - else | |
1278 | - { | |
1279 | - fadeIn(30); | |
1280 | - } | |
1082 | + { | |
1083 | + startX: 0, | |
1084 | + startY: 0, | |
1085 | + scrollLeft: 0, | |
1086 | + scrollTop: 0, | |
1087 | + mouseDown: function (sender, me) { | |
1088 | + this.startX = me.getGraphX(); | |
1089 | + this.startY = me.getGraphY(); | |
1090 | + this.scrollLeft = graph.container.scrollLeft; | |
1091 | + this.scrollTop = graph.container.scrollTop; | |
1092 | + }, | |
1093 | + mouseMove: function (sender, me) { }, | |
1094 | + mouseUp: function (sender, me) { | |
1095 | + if (mxEvent.isTouchEvent(me.getEvent())) { | |
1096 | + if ((Math.abs(this.scrollLeft - graph.container.scrollLeft) < tol && | |
1097 | + Math.abs(this.scrollTop - graph.container.scrollTop) < tol) && | |
1098 | + (Math.abs(this.startX - me.getGraphX()) < tol && | |
1099 | + Math.abs(this.startY - me.getGraphY()) < tol)) { | |
1100 | + if (parseFloat(toolbar.style.opacity || 0) > 0) { | |
1101 | + fadeOut(); | |
1102 | + } | |
1103 | + else { | |
1104 | + fadeIn(30); | |
1105 | + } | |
1106 | + } | |
1281 | 1107 | } |
1282 | - } | |
1283 | - } | |
1284 | - }); | |
1108 | + } | |
1109 | + }); | |
1285 | 1110 | } |
1286 | - | |
1111 | + | |
1287 | 1112 | var tokens = this.toolbarItems; |
1288 | 1113 | var buttonCount = 0; |
1289 | - | |
1290 | - var addButton = mxUtils.bind(this, function(fn, imgSrc, tip, enabled) | |
1291 | - { | |
1114 | + | |
1115 | + var addButton = mxUtils.bind(this, function (fn, imgSrc, tip, enabled) { | |
1292 | 1116 | var a = this.createToolbarButton(fn, imgSrc, tip, enabled); |
1293 | 1117 | toolbar.appendChild(a); |
1294 | - | |
1118 | + | |
1295 | 1119 | buttonCount++; |
1296 | - | |
1120 | + | |
1297 | 1121 | return a; |
1298 | 1122 | }); |
1299 | 1123 | |
... | ... | @@ -1301,20 +1125,17 @@ GraphViewer.prototype.addToolbar = function() |
1301 | 1125 | var tagsComponent = null; |
1302 | 1126 | var tagsDialog = null; |
1303 | 1127 | var pageInfo = null; |
1304 | - | |
1305 | - for (var i = 0; i < tokens.length; i++) | |
1306 | - { | |
1128 | + | |
1129 | + for (var i = 0; i < tokens.length; i++) { | |
1307 | 1130 | var token = tokens[i]; |
1308 | - | |
1309 | - if (token == 'pages') | |
1310 | - { | |
1131 | + | |
1132 | + if (token == 'pages') { | |
1311 | 1133 | pageInfo = container.ownerDocument.createElement('div'); |
1312 | 1134 | pageInfo.style.cssText = 'display:inline-block;position:relative;top:5px;padding:0 4px 0 4px;' + |
1313 | 1135 | 'vertical-align:top;font-family:Helvetica,Arial;font-size:12px;;cursor:default;' |
1314 | 1136 | mxUtils.setOpacity(pageInfo, 70); |
1315 | - | |
1316 | - var prevButton = addButton(mxUtils.bind(this, function() | |
1317 | - { | |
1137 | + | |
1138 | + var prevButton = addButton(mxUtils.bind(this, function () { | |
1318 | 1139 | this.selectPage(this.currentPage - 1); |
1319 | 1140 | }), Editor.previousImage, mxResources.get('previousPage') || 'Previous Page'); |
1320 | 1141 | |
... | ... | @@ -1323,79 +1144,63 @@ GraphViewer.prototype.addToolbar = function() |
1323 | 1144 | prevButton.style.paddingRight = '0px'; |
1324 | 1145 | toolbar.appendChild(pageInfo); |
1325 | 1146 | |
1326 | - var nextButton = addButton(mxUtils.bind(this, function() | |
1327 | - { | |
1147 | + var nextButton = addButton(mxUtils.bind(this, function () { | |
1328 | 1148 | this.selectPage(this.currentPage + 1); |
1329 | 1149 | }), Editor.nextImage, mxResources.get('nextPage') || 'Next Page'); |
1330 | - | |
1150 | + | |
1331 | 1151 | nextButton.style.paddingLeft = '0px'; |
1332 | 1152 | nextButton.style.paddingRight = '0px'; |
1333 | - | |
1153 | + | |
1334 | 1154 | var lastXmlNode = null; |
1335 | - | |
1336 | - var update = mxUtils.bind(this, function() | |
1337 | - { | |
1155 | + | |
1156 | + var update = mxUtils.bind(this, function () { | |
1338 | 1157 | pageInfo.innerText = ''; |
1339 | 1158 | mxUtils.write(pageInfo, (this.currentPage + 1) + ' / ' + this.diagrams.length); |
1340 | 1159 | pageInfo.style.display = (this.diagrams.length > 1) ? 'inline-block' : 'none'; |
1341 | 1160 | prevButton.style.display = pageInfo.style.display; |
1342 | 1161 | nextButton.style.display = pageInfo.style.display; |
1343 | 1162 | }); |
1344 | - | |
1163 | + | |
1345 | 1164 | // LATER: Add event for setGraphXml |
1346 | 1165 | this.addListener('graphChanged', update); |
1347 | 1166 | update(); |
1348 | 1167 | } |
1349 | - else if (token == 'zoom') | |
1350 | - { | |
1351 | - if (this.zoomEnabled) | |
1352 | - { | |
1353 | - addButton(mxUtils.bind(this, function() | |
1354 | - { | |
1168 | + else if (token == 'zoom') { | |
1169 | + if (this.zoomEnabled) { | |
1170 | + addButton(mxUtils.bind(this, function () { | |
1355 | 1171 | this.graph.zoomOut(); |
1356 | 1172 | }), Editor.zoomOutImage, mxResources.get('zoomOut') || 'Zoom Out'); |
1357 | 1173 | |
1358 | - addButton(mxUtils.bind(this, function() | |
1359 | - { | |
1174 | + addButton(mxUtils.bind(this, function () { | |
1360 | 1175 | this.graph.zoomIn(); |
1361 | 1176 | }), Editor.zoomInImage, mxResources.get('zoomIn') || 'Zoom In'); |
1362 | 1177 | |
1363 | - addButton(mxUtils.bind(this, function() | |
1364 | - { | |
1178 | + addButton(mxUtils.bind(this, function () { | |
1365 | 1179 | this.graph.view.scaleAndTranslate(this.graph.initialViewState.scale, |
1366 | 1180 | this.graph.initialViewState.translate.x, |
1367 | 1181 | this.graph.initialViewState.translate.y); |
1368 | 1182 | }), Editor.zoomFitImage, mxResources.get('fit') || 'Fit'); |
1369 | 1183 | } |
1370 | 1184 | } |
1371 | - else if (token == 'layers') | |
1372 | - { | |
1373 | - if (this.layersEnabled) | |
1374 | - { | |
1185 | + else if (token == 'layers') { | |
1186 | + if (this.layersEnabled) { | |
1375 | 1187 | var model = this.graph.getModel(); |
1376 | 1188 | |
1377 | - var layersButton = addButton(mxUtils.bind(this, function(evt) | |
1378 | - { | |
1379 | - if (layersDialog != null) | |
1380 | - { | |
1189 | + var layersButton = addButton(mxUtils.bind(this, function (evt) { | |
1190 | + if (layersDialog != null) { | |
1381 | 1191 | layersDialog.parentNode.removeChild(layersDialog); |
1382 | 1192 | layersDialog = null; |
1383 | 1193 | } |
1384 | - else | |
1385 | - { | |
1386 | - layersDialog = this.graph.createLayersDialog(mxUtils.bind(this, function() | |
1387 | - { | |
1388 | - if (this.autoCrop) | |
1389 | - { | |
1194 | + else { | |
1195 | + layersDialog = this.graph.createLayersDialog(mxUtils.bind(this, function () { | |
1196 | + if (this.autoCrop) { | |
1390 | 1197 | this.crop(); |
1391 | 1198 | } |
1392 | - else if (this.autoOrigin) | |
1393 | - { | |
1199 | + else if (this.autoOrigin) { | |
1394 | 1200 | var bounds = this.graph.getGraphBounds(); |
1395 | 1201 | var v = this.graph.view; |
1396 | - | |
1397 | - if (bounds.x < 0 || bounds.y < 0) | |
1398 | - { | |
1202 | + | |
1203 | + if (bounds.x < 0 || bounds.y < 0) { | |
1399 | 1204 | this.crop(); |
1400 | 1205 | this.graph.originalViewState = this.graph.initialViewState; |
1401 | 1206 | |
... | ... | @@ -1406,12 +1211,11 @@ GraphViewer.prototype.addToolbar = function() |
1406 | 1211 | } |
1407 | 1212 | else if (this.graph.originalViewState != null && |
1408 | 1213 | bounds.x / v.scale + this.graph.originalViewState.translate.x - v.translate.x > 0 && |
1409 | - bounds.y / v.scale + this.graph.originalViewState.translate.y - v.translate.y > 0) | |
1410 | - { | |
1214 | + bounds.y / v.scale + this.graph.originalViewState.translate.y - v.translate.y > 0) { | |
1411 | 1215 | v.setTranslate(this.graph.originalViewState.translate.x, |
1412 | 1216 | this.graph.originalViewState.translate.y); |
1413 | 1217 | this.graph.originalViewState = null; |
1414 | - | |
1218 | + | |
1415 | 1219 | this.graph.initialViewState = { |
1416 | 1220 | translate: v.translate.clone(), |
1417 | 1221 | scale: v.scale |
... | ... | @@ -1419,13 +1223,12 @@ GraphViewer.prototype.addToolbar = function() |
1419 | 1223 | } |
1420 | 1224 | } |
1421 | 1225 | })); |
1422 | - | |
1423 | - mxEvent.addListener(layersDialog, 'mouseleave', function() | |
1424 | - { | |
1226 | + | |
1227 | + mxEvent.addListener(layersDialog, 'mouseleave', function () { | |
1425 | 1228 | layersDialog.parentNode.removeChild(layersDialog); |
1426 | 1229 | layersDialog = null; |
1427 | 1230 | }); |
1428 | - | |
1231 | + | |
1429 | 1232 | var r = layersButton.getBoundingClientRect(); |
1430 | 1233 | |
1431 | 1234 | layersDialog.style.width = '140px'; |
... | ... | @@ -1441,29 +1244,23 @@ GraphViewer.prototype.addToolbar = function() |
1441 | 1244 | var origin = mxUtils.getDocumentScrollOrigin(document); |
1442 | 1245 | layersDialog.style.left = origin.x + r.left - 1 + 'px'; |
1443 | 1246 | layersDialog.style.top = origin.y + r.bottom - 2 + 'px'; |
1444 | - | |
1247 | + | |
1445 | 1248 | document.body.appendChild(layersDialog); |
1446 | 1249 | } |
1447 | 1250 | }), Editor.layersImage, mxResources.get('layers') || 'Layers'); |
1448 | - | |
1449 | - model.addListener(mxEvent.CHANGE, function() | |
1450 | - { | |
1251 | + | |
1252 | + model.addListener(mxEvent.CHANGE, function () { | |
1451 | 1253 | layersButton.style.display = (model.getChildCount(model.root) > 1) ? 'inline-block' : 'none'; |
1452 | 1254 | }); |
1453 | - | |
1255 | + | |
1454 | 1256 | layersButton.style.display = (model.getChildCount(model.root) > 1) ? 'inline-block' : 'none'; |
1455 | 1257 | } |
1456 | 1258 | } |
1457 | - else if (token == 'tags') | |
1458 | - { | |
1459 | - if (this.tagsEnabled) | |
1460 | - { | |
1461 | - var tagsButton = addButton(mxUtils.bind(this, function(evt) | |
1462 | - { | |
1463 | - if (tagsComponent == null) | |
1464 | - { | |
1465 | - tagsComponent = this.graph.createTagsDialog(mxUtils.bind(this, function() | |
1466 | - { | |
1259 | + else if (token == 'tags') { | |
1260 | + if (this.tagsEnabled) { | |
1261 | + var tagsButton = addButton(mxUtils.bind(this, function (evt) { | |
1262 | + if (tagsComponent == null) { | |
1263 | + tagsComponent = this.graph.createTagsDialog(mxUtils.bind(this, function () { | |
1467 | 1264 | return true; |
1468 | 1265 | })); |
1469 | 1266 | |
... | ... | @@ -1483,24 +1280,20 @@ GraphViewer.prototype.addToolbar = function() |
1483 | 1280 | mxUtils.setOpacity(tagsComponent.div, 80); |
1484 | 1281 | } |
1485 | 1282 | |
1486 | - if (tagsDialog != null) | |
1487 | - { | |
1283 | + if (tagsDialog != null) { | |
1488 | 1284 | tagsDialog.parentNode.removeChild(tagsDialog); |
1489 | 1285 | tagsDialog = null; |
1490 | 1286 | } |
1491 | - else | |
1492 | - { | |
1287 | + else { | |
1493 | 1288 | tagsDialog = tagsComponent.div; |
1494 | - | |
1495 | - mxEvent.addListener(tagsDialog, 'mouseleave', function() | |
1496 | - { | |
1497 | - if (tagsDialog != null) | |
1498 | - { | |
1289 | + | |
1290 | + mxEvent.addListener(tagsDialog, 'mouseleave', function () { | |
1291 | + if (tagsDialog != null) { | |
1499 | 1292 | tagsDialog.parentNode.removeChild(tagsDialog); |
1500 | 1293 | tagsDialog = null; |
1501 | 1294 | } |
1502 | 1295 | }); |
1503 | - | |
1296 | + | |
1504 | 1297 | var r = tagsButton.getBoundingClientRect(); |
1505 | 1298 | var origin = mxUtils.getDocumentScrollOrigin(document); |
1506 | 1299 | tagsDialog.style.left = origin.x + r.left - 1 + 'px'; |
... | ... | @@ -1510,159 +1303,131 @@ GraphViewer.prototype.addToolbar = function() |
1510 | 1303 | } |
1511 | 1304 | }), Editor.tagsImage, mxResources.get('tags') || 'Tags'); |
1512 | 1305 | |
1513 | - model.addListener(mxEvent.CHANGE, mxUtils.bind(this, function() | |
1514 | - { | |
1306 | + model.addListener(mxEvent.CHANGE, mxUtils.bind(this, function () { | |
1515 | 1307 | tagsButton.style.display = (this.graph.getAllTags().length > 0) ? 'inline-block' : 'none'; |
1516 | 1308 | })); |
1517 | - | |
1309 | + | |
1518 | 1310 | tagsButton.style.display = (this.graph.getAllTags().length > 0) ? 'inline-block' : 'none'; |
1519 | 1311 | } |
1520 | 1312 | } |
1521 | - else if (token == 'lightbox') | |
1522 | - { | |
1523 | - if (this.lightboxEnabled) | |
1524 | - { | |
1525 | - addButton(mxUtils.bind(this, function() | |
1526 | - { | |
1313 | + else if (token == 'lightbox') { | |
1314 | + if (this.lightboxEnabled) { | |
1315 | + addButton(mxUtils.bind(this, function () { | |
1527 | 1316 | this.showLightbox(); |
1528 | 1317 | }), Editor.fullscreenImage, (mxResources.get('fullscreen') || 'Fullscreen')); |
1529 | 1318 | } |
1530 | 1319 | } |
1531 | - else if (this.graphConfig['toolbar-buttons'] != null) | |
1532 | - { | |
1320 | + else if (this.graphConfig['toolbar-buttons'] != null) { | |
1533 | 1321 | var def = this.graphConfig['toolbar-buttons'][token]; |
1534 | - | |
1535 | - if (def != null) | |
1536 | - { | |
1537 | - def.elem = addButton((def.enabled == null || def.enabled) ? def.handler : function() {}, | |
1322 | + | |
1323 | + if (def != null) { | |
1324 | + def.elem = addButton((def.enabled == null || def.enabled) ? def.handler : function () { }, | |
1538 | 1325 | def.image, def.title, def.enabled); |
1539 | 1326 | } |
1540 | 1327 | } |
1541 | 1328 | } |
1542 | - | |
1543 | - if (this.graph.minimumContainerSize != null) | |
1544 | - { | |
1329 | + | |
1330 | + if (this.graph.minimumContainerSize != null) { | |
1545 | 1331 | this.graph.minimumContainerSize.width = buttonCount * 34; |
1546 | 1332 | } |
1547 | - | |
1548 | - if (this.graphConfig.title != null) | |
1549 | - { | |
1333 | + | |
1334 | + if (this.graphConfig.title != null) { | |
1550 | 1335 | var filename = container.ownerDocument.createElement('div'); |
1551 | 1336 | filename.style.cssText = 'display:inline-block;position:relative;padding:3px 6px 0 6px;' + |
1552 | 1337 | 'vertical-align:top;font-family:Helvetica,Arial;font-size:12px;top:4px;cursor:default;' |
1553 | 1338 | filename.setAttribute('title', this.graphConfig.title); |
1554 | 1339 | mxUtils.write(filename, this.graphConfig.title); |
1555 | 1340 | mxUtils.setOpacity(filename, 70); |
1556 | - | |
1341 | + | |
1557 | 1342 | toolbar.appendChild(filename); |
1558 | 1343 | this.filename = filename; |
1559 | 1344 | } |
1560 | - | |
1345 | + | |
1561 | 1346 | this.minToolbarWidth = buttonCount * 34; |
1562 | 1347 | var prevBorder = container.style.border; |
1563 | - | |
1564 | - var enter = mxUtils.bind(this, function() | |
1565 | - { | |
1348 | + | |
1349 | + var enter = mxUtils.bind(this, function () { | |
1566 | 1350 | toolbar.style.width = (this.graphConfig['toolbar-position'] == 'inline') ? 'auto' : |
1567 | 1351 | Math.max(this.minToolbarWidth, container.offsetWidth) + 'px'; |
1568 | 1352 | toolbar.style.border = '1px solid #d0d0d0'; |
1569 | 1353 | |
1570 | - if (this.graphConfig['toolbar-nohide'] != true) | |
1571 | - { | |
1354 | + if (this.graphConfig['toolbar-nohide'] != true) { | |
1572 | 1355 | var r = container.getBoundingClientRect(); |
1573 | - | |
1356 | + | |
1574 | 1357 | // Workaround for position:relative set in ResizeSensor |
1575 | 1358 | var origin = mxUtils.getScrollOrigin(document.body) |
1576 | 1359 | var b = (document.body.style.position === 'relative') ? document.body.getBoundingClientRect() : |
1577 | - {left: -origin.x, top: -origin.y}; | |
1578 | - r = {left: r.left - b.left, top: r.top - b.top, bottom: r.bottom - b.top, right: r.right - b.left}; | |
1579 | - | |
1360 | + { left: -origin.x, top: -origin.y }; | |
1361 | + r = { left: r.left - b.left, top: r.top - b.top, bottom: r.bottom - b.top, right: r.right - b.left }; | |
1362 | + | |
1580 | 1363 | toolbar.style.left = r.left + 'px'; |
1581 | 1364 | |
1582 | - if (this.graphConfig['toolbar-position'] == 'bottom') | |
1583 | - { | |
1365 | + if (this.graphConfig['toolbar-position'] == 'bottom') { | |
1584 | 1366 | toolbar.style.top = r.bottom - 1 + 'px'; |
1585 | 1367 | } |
1586 | - else | |
1587 | - { | |
1588 | - if (this.graphConfig['toolbar-position'] != 'inline') | |
1589 | - { | |
1368 | + else { | |
1369 | + if (this.graphConfig['toolbar-position'] != 'inline') { | |
1590 | 1370 | toolbar.style.marginTop = -this.toolbarHeight + 'px'; |
1591 | 1371 | toolbar.style.top = r.top + 1 + 'px'; |
1592 | 1372 | } |
1593 | - else | |
1594 | - { | |
1373 | + else { | |
1595 | 1374 | toolbar.style.top = r.top + 'px'; |
1596 | 1375 | } |
1597 | 1376 | } |
1598 | - | |
1599 | - if (prevBorder == '1px solid transparent') | |
1600 | - { | |
1377 | + | |
1378 | + if (prevBorder == '1px solid transparent') { | |
1601 | 1379 | container.style.border = '1px solid #d0d0d0'; |
1602 | 1380 | } |
1603 | - | |
1381 | + | |
1604 | 1382 | document.body.appendChild(toolbar); |
1605 | 1383 | |
1606 | - var hideToolbar = mxUtils.bind(this, function() | |
1607 | - { | |
1608 | - if (toolbar.parentNode != null) | |
1609 | - { | |
1384 | + var hideToolbar = mxUtils.bind(this, function () { | |
1385 | + if (toolbar.parentNode != null) { | |
1610 | 1386 | toolbar.parentNode.removeChild(toolbar); |
1611 | 1387 | } |
1612 | - | |
1613 | - if (layersDialog != null) | |
1614 | - { | |
1388 | + | |
1389 | + if (layersDialog != null) { | |
1615 | 1390 | layersDialog.parentNode.removeChild(layersDialog); |
1616 | 1391 | layersDialog = null; |
1617 | 1392 | } |
1618 | - | |
1393 | + | |
1619 | 1394 | container.style.border = prevBorder; |
1620 | 1395 | }); |
1621 | - | |
1622 | - mxEvent.addListener(document, 'mousemove', function(evt) | |
1623 | - { | |
1396 | + | |
1397 | + mxEvent.addListener(document, 'mousemove', function (evt) { | |
1624 | 1398 | var source = mxEvent.getSource(evt); |
1625 | - | |
1626 | - while (source != null) | |
1627 | - { | |
1628 | - if (source == container || source == toolbar || source == layersDialog) | |
1629 | - { | |
1399 | + | |
1400 | + while (source != null) { | |
1401 | + if (source == container || source == toolbar || source == layersDialog) { | |
1630 | 1402 | return; |
1631 | 1403 | } |
1632 | - | |
1404 | + | |
1633 | 1405 | source = source.parentNode; |
1634 | 1406 | } |
1635 | - | |
1407 | + | |
1636 | 1408 | hideToolbar(); |
1637 | 1409 | }); |
1638 | - | |
1639 | - mxEvent.addListener(document.body, 'mouseleave', function(evt) | |
1640 | - { | |
1410 | + | |
1411 | + mxEvent.addListener(document.body, 'mouseleave', function (evt) { | |
1641 | 1412 | hideToolbar(); |
1642 | 1413 | }); |
1643 | 1414 | } |
1644 | - else | |
1645 | - { | |
1415 | + else { | |
1646 | 1416 | toolbar.style.top = -this.toolbarHeight + 'px'; |
1647 | 1417 | container.appendChild(toolbar); |
1648 | 1418 | } |
1649 | 1419 | }); |
1650 | - | |
1651 | - if (this.graphConfig['toolbar-nohide'] != true) | |
1652 | - { | |
1420 | + | |
1421 | + if (this.graphConfig['toolbar-nohide'] != true) { | |
1653 | 1422 | mxEvent.addListener(container, 'mouseenter', enter); |
1654 | 1423 | } |
1655 | - else | |
1656 | - { | |
1424 | + else { | |
1657 | 1425 | enter(); |
1658 | 1426 | } |
1659 | - | |
1660 | - if (this.responsive && typeof ResizeObserver !== 'undefined') | |
1661 | - { | |
1662 | - new ResizeObserver(function() | |
1663 | - { | |
1664 | - if (toolbar.parentNode != null) | |
1665 | - { | |
1427 | + | |
1428 | + if (this.responsive && typeof ResizeObserver !== 'undefined') { | |
1429 | + new ResizeObserver(function () { | |
1430 | + if (toolbar.parentNode != null) { | |
1666 | 1431 | enter(); |
1667 | 1432 | } |
1668 | 1433 | }).observe(container) |
... | ... | @@ -1672,60 +1437,51 @@ GraphViewer.prototype.addToolbar = function() |
1672 | 1437 | /** |
1673 | 1438 | * |
1674 | 1439 | */ |
1675 | -GraphViewer.prototype.createToolbarButton = function(fn, imgSrc, tip, enabled) | |
1676 | -{ | |
1440 | +GraphViewer.prototype.createToolbarButton = function (fn, imgSrc, tip, enabled) { | |
1677 | 1441 | var a = document.createElement('div'); |
1678 | 1442 | a.style.borderRight = '1px solid #d0d0d0'; |
1679 | 1443 | a.style.padding = '3px 6px 3px 6px'; |
1680 | 1444 | mxEvent.addListener(a, 'click', fn); |
1681 | 1445 | |
1682 | - if (tip != null) | |
1683 | - { | |
1446 | + if (tip != null) { | |
1684 | 1447 | a.setAttribute('title', tip); |
1685 | 1448 | } |
1686 | - | |
1449 | + | |
1687 | 1450 | a.style.display = 'inline-block'; |
1688 | 1451 | var img = document.createElement('img'); |
1689 | 1452 | img.setAttribute('border', '0'); |
1690 | 1453 | img.setAttribute('src', imgSrc); |
1691 | 1454 | img.style.width = '18px'; |
1692 | 1455 | |
1693 | - if (enabled == null || enabled) | |
1694 | - { | |
1695 | - mxEvent.addListener(a, 'mouseenter', function() | |
1696 | - { | |
1456 | + if (enabled == null || enabled) { | |
1457 | + mxEvent.addListener(a, 'mouseenter', function () { | |
1697 | 1458 | a.style.backgroundColor = '#ddd'; |
1698 | 1459 | }); |
1699 | - | |
1700 | - mxEvent.addListener(a, 'mouseleave', function() | |
1701 | - { | |
1460 | + | |
1461 | + mxEvent.addListener(a, 'mouseleave', function () { | |
1702 | 1462 | a.style.backgroundColor = '#eee'; |
1703 | 1463 | }); |
1704 | 1464 | |
1705 | 1465 | mxUtils.setOpacity(img, 60); |
1706 | 1466 | a.style.cursor = 'pointer'; |
1707 | 1467 | } |
1708 | - else | |
1709 | - { | |
1468 | + else { | |
1710 | 1469 | mxUtils.setOpacity(a, 30); |
1711 | 1470 | } |
1712 | - | |
1471 | + | |
1713 | 1472 | a.appendChild(img); |
1714 | 1473 | |
1715 | 1474 | return a; |
1716 | 1475 | }; |
1717 | 1476 | |
1718 | -GraphViewer.prototype.disableButton = function(token) | |
1719 | -{ | |
1720 | - var def = this.graphConfig['toolbar-buttons']? this.graphConfig['toolbar-buttons'][token] : null; | |
1721 | - | |
1722 | - if (def != null) | |
1723 | - { | |
1477 | +GraphViewer.prototype.disableButton = function (token) { | |
1478 | + var def = this.graphConfig['toolbar-buttons'] ? this.graphConfig['toolbar-buttons'][token] : null; | |
1479 | + | |
1480 | + if (def != null) { | |
1724 | 1481 | mxUtils.setOpacity(def.elem, 30); |
1725 | 1482 | mxEvent.removeListener(def.elem, 'click', def.handler); |
1726 | 1483 | //Workaround to stop highlighting the disabled button |
1727 | - mxEvent.addListener(def.elem, 'mouseenter', function() | |
1728 | - { | |
1484 | + mxEvent.addListener(def.elem, 'mouseenter', function () { | |
1729 | 1485 | def.elem.style.backgroundColor = '#eee'; |
1730 | 1486 | }); |
1731 | 1487 | } |
... | ... | @@ -1734,58 +1490,46 @@ GraphViewer.prototype.disableButton = function(token) |
1734 | 1490 | /** |
1735 | 1491 | * Adds event handler for links and lightbox. |
1736 | 1492 | */ |
1737 | -GraphViewer.prototype.addClickHandler = function(graph, ui) | |
1738 | -{ | |
1493 | +GraphViewer.prototype.addClickHandler = function (graph, ui) { | |
1739 | 1494 | graph.linkPolicy = this.graphConfig.target || graph.linkPolicy; |
1740 | 1495 | |
1741 | - graph.addClickHandler(this.graphConfig.highlight, mxUtils.bind(this, function(evt, href) | |
1742 | - { | |
1743 | - if (href == null) | |
1744 | - { | |
1496 | + graph.addClickHandler(this.graphConfig.highlight, mxUtils.bind(this, function (evt, href) { | |
1497 | + if (href == null) { | |
1745 | 1498 | var source = mxEvent.getSource(evt); |
1746 | - | |
1747 | - while (source != graph.container && source != null && href == null) | |
1748 | - { | |
1749 | - if (source.nodeName.toLowerCase() == 'a') | |
1750 | - { | |
1499 | + | |
1500 | + while (source != graph.container && source != null && href == null) { | |
1501 | + if (source.nodeName.toLowerCase() == 'a') { | |
1751 | 1502 | href = source.getAttribute('href'); |
1752 | 1503 | } |
1753 | - | |
1504 | + | |
1754 | 1505 | source = source.parentNode; |
1755 | 1506 | } |
1756 | 1507 | } |
1757 | - | |
1758 | - if (ui != null) | |
1759 | - { | |
1760 | - if (href == null || graph.isCustomLink(href)) | |
1761 | - { | |
1508 | + | |
1509 | + if (ui != null) { | |
1510 | + if (href == null || graph.isCustomLink(href)) { | |
1762 | 1511 | mxEvent.consume(evt); |
1763 | 1512 | } |
1764 | 1513 | else if (!graph.isExternalProtocol(href) && |
1765 | - !graph.isBlankLink(href)) | |
1766 | - { | |
1514 | + !graph.isBlankLink(href)) { | |
1767 | 1515 | // Hides lightbox if any links are clicked |
1768 | 1516 | // Async handling needed for anchors to work |
1769 | - window.setTimeout(function() | |
1770 | - { | |
1517 | + window.setTimeout(function () { | |
1771 | 1518 | ui.destroy(); |
1772 | 1519 | }, 0); |
1773 | 1520 | } |
1774 | 1521 | } |
1775 | 1522 | else if (href != null && ui == null && graph.isCustomLink(href) && |
1776 | 1523 | (mxEvent.isTouchEvent(evt) || !mxEvent.isPopupTrigger(evt)) && |
1777 | - graph.customLinkClicked(href)) | |
1778 | - { | |
1524 | + graph.customLinkClicked(href)) { | |
1779 | 1525 | // Workaround for text selection in Firefox on Windows |
1780 | 1526 | mxUtils.clearSelection(); |
1781 | 1527 | mxEvent.consume(evt); |
1782 | 1528 | } |
1783 | - }), mxUtils.bind(this, function(evt) | |
1784 | - { | |
1529 | + }), mxUtils.bind(this, function (evt) { | |
1785 | 1530 | if (ui == null && this.lightboxClickEnabled && |
1786 | 1531 | (!mxEvent.isTouchEvent(evt) || |
1787 | - this.toolbarItems.length == 0)) | |
1788 | - { | |
1532 | + this.toolbarItems.length == 0)) { | |
1789 | 1533 | this.showLightbox(); |
1790 | 1534 | } |
1791 | 1535 | })); |
... | ... | @@ -1794,90 +1538,72 @@ GraphViewer.prototype.addClickHandler = function(graph, ui) |
1794 | 1538 | /** |
1795 | 1539 | * Adds the given array of stencils to avoid dynamic loading of shapes. |
1796 | 1540 | */ |
1797 | -GraphViewer.prototype.showLightbox = function(editable, closable, target) | |
1798 | -{ | |
1799 | - if (this.graphConfig.lightbox == 'open' || window.self !== window.top) | |
1800 | - { | |
1801 | - if (this.lightboxWindow != null && !this.lightboxWindow.closed) | |
1802 | - { | |
1541 | +GraphViewer.prototype.showLightbox = function (editable, closable, target) { | |
1542 | + if (this.graphConfig.lightbox == 'open' || window.self !== window.top) { | |
1543 | + if (this.lightboxWindow != null && !this.lightboxWindow.closed) { | |
1803 | 1544 | this.lightboxWindow.focus(); |
1804 | 1545 | } |
1805 | - else | |
1806 | - { | |
1546 | + else { | |
1807 | 1547 | editable = (editable != null) ? editable : |
1808 | 1548 | ((this.graphConfig.editable != null) ? |
1809 | 1549 | this.graphConfig.editable : true); |
1810 | 1550 | closable = (closable != null) ? closable : true; |
1811 | 1551 | target = (target != null) ? target : 'blank'; |
1812 | - | |
1813 | - var param = {'client': 1, 'target': target}; | |
1814 | - | |
1815 | - if (editable) | |
1816 | - { | |
1552 | + | |
1553 | + var param = { 'client': 1, 'target': target }; | |
1554 | + | |
1555 | + if (editable) { | |
1817 | 1556 | param.edit = this.graphConfig.edit || '_blank'; |
1818 | 1557 | } |
1819 | - | |
1820 | - if (closable) | |
1821 | - { | |
1822 | - param.close = 1; | |
1558 | + | |
1559 | + if (closable) { | |
1560 | + param.close = 1; | |
1823 | 1561 | } |
1824 | 1562 | |
1825 | - if (this.layersEnabled) | |
1826 | - { | |
1827 | - param.layers = 1; | |
1563 | + if (this.layersEnabled) { | |
1564 | + param.layers = 1; | |
1828 | 1565 | } |
1829 | - | |
1830 | - if (this.tagsEnabled) | |
1831 | - { | |
1832 | - param.tags = {}; | |
1566 | + | |
1567 | + if (this.tagsEnabled) { | |
1568 | + param.tags = {}; | |
1833 | 1569 | } |
1834 | 1570 | |
1835 | - if (this.graphConfig != null && this.graphConfig.nav != false) | |
1836 | - { | |
1571 | + if (this.graphConfig != null && this.graphConfig.nav != false) { | |
1837 | 1572 | param.nav = 1; |
1838 | 1573 | } |
1839 | - | |
1840 | - if (this.graphConfig != null && this.graphConfig.highlight != null) | |
1841 | - { | |
1574 | + | |
1575 | + if (this.graphConfig != null && this.graphConfig.highlight != null) { | |
1842 | 1576 | param.highlight = this.graphConfig.highlight.substring(1); |
1843 | 1577 | } |
1844 | - | |
1845 | - if (this.currentPage != null && this.currentPage > 0) | |
1846 | - { | |
1578 | + | |
1579 | + if (this.currentPage != null && this.currentPage > 0) { | |
1847 | 1580 | param.page = this.currentPage; |
1848 | 1581 | } |
1849 | 1582 | |
1850 | - if (typeof window.postMessage !== 'undefined' && (document.documentMode == null || document.documentMode >= 10)) | |
1851 | - { | |
1852 | - if (this.lightboxWindow == null) | |
1853 | - { | |
1854 | - mxEvent.addListener(window, 'message', mxUtils.bind(this, function(evt) | |
1855 | - { | |
1856 | - if (evt.data == 'ready' && evt.source == this.lightboxWindow) | |
1857 | - { | |
1583 | + if (typeof window.postMessage !== 'undefined' && (document.documentMode == null || document.documentMode >= 10)) { | |
1584 | + if (this.lightboxWindow == null) { | |
1585 | + mxEvent.addListener(window, 'message', mxUtils.bind(this, function (evt) { | |
1586 | + if (evt.data == 'ready' && evt.source == this.lightboxWindow) { | |
1858 | 1587 | this.lightboxWindow.postMessage(this.xml, '*'); |
1859 | 1588 | } |
1860 | - })); | |
1589 | + })); | |
1861 | 1590 | } |
1862 | 1591 | } |
1863 | - else | |
1864 | - { | |
1592 | + else { | |
1865 | 1593 | // Data is pulled from global variable after tab loads |
1866 | 1594 | param.data = encodeURIComponent(this.xml); |
1867 | 1595 | } |
1868 | - | |
1869 | - if (urlParams['dev'] == '1') | |
1870 | - { | |
1596 | + | |
1597 | + if (urlParams['dev'] == '1') { | |
1871 | 1598 | param.dev = '1'; |
1872 | 1599 | } |
1873 | - | |
1874 | - this.lightboxWindow = window.open(((urlParams['dev'] != '1') ? | |
1875 | - EditorUi.lightboxHost : 'https://test.draw.io') + | |
1876 | - '/#P' + encodeURIComponent(JSON.stringify(param))); | |
1600 | + | |
1601 | + this.lightboxWindow = window.open(((urlParams['dev'] != '1') ? | |
1602 | + EditorUi.lightboxHost : 'https://test.draw.io') + | |
1603 | + '/#P' + encodeURIComponent(JSON.stringify(param))); | |
1877 | 1604 | } |
1878 | 1605 | } |
1879 | - else | |
1880 | - { | |
1606 | + else { | |
1881 | 1607 | this.showLocalLightbox(); |
1882 | 1608 | } |
1883 | 1609 | }; |
... | ... | @@ -1885,168 +1611,148 @@ GraphViewer.prototype.showLightbox = function(editable, closable, target) |
1885 | 1611 | /** |
1886 | 1612 | * Adds the given array of stencils to avoid dynamic loading of shapes. |
1887 | 1613 | */ |
1888 | -GraphViewer.prototype.showLocalLightbox = function(container) | |
1889 | -{ | |
1614 | +GraphViewer.prototype.showLocalLightbox = function (container) { | |
1890 | 1615 | var backdrop = document.createElement('div'); |
1891 | 1616 | |
1892 | 1617 | backdrop.style.cssText = 'position:fixed;top:0;left:0;bottom:0;right:0;'; |
1893 | 1618 | backdrop.style.zIndex = this.lightboxZIndex; |
1894 | 1619 | backdrop.style.backgroundColor = '#000000'; |
1895 | 1620 | mxUtils.setOpacity(backdrop, 70); |
1896 | - | |
1621 | + | |
1897 | 1622 | document.body.appendChild(backdrop); |
1898 | - | |
1623 | + | |
1899 | 1624 | var closeImg = document.createElement('img'); |
1900 | 1625 | closeImg.setAttribute('border', '0'); |
1901 | 1626 | closeImg.setAttribute('src', Editor.closeBlackImage); |
1902 | 1627 | closeImg.style.cssText = 'position:fixed;top:32px;right:32px;'; |
1903 | 1628 | closeImg.style.cursor = 'pointer'; |
1904 | - | |
1905 | - mxEvent.addListener(closeImg, 'click', function() | |
1906 | - { | |
1629 | + | |
1630 | + mxEvent.addListener(closeImg, 'click', function () { | |
1907 | 1631 | ui.destroy(); |
1908 | 1632 | }); |
1909 | - | |
1633 | + | |
1910 | 1634 | // LATER: Make possible to assign after instance was created |
1911 | 1635 | urlParams['pages'] = '1'; |
1912 | 1636 | urlParams['page'] = this.currentPage; |
1913 | 1637 | urlParams['page-id'] = this.graphConfig.pageId; |
1914 | 1638 | urlParams['layer-ids'] = (this.graphConfig.layerIds != null && this.graphConfig.layerIds.length > 0) |
1915 | - ? this.graphConfig.layerIds.join(' ') : null; | |
1639 | + ? this.graphConfig.layerIds.join(' ') : null; | |
1916 | 1640 | urlParams['nav'] = (this.graphConfig.nav != false) ? '1' : '0'; |
1917 | 1641 | urlParams['layers'] = (this.layersEnabled) ? '1' : '0'; |
1918 | 1642 | |
1919 | - if (this.tagsEnabled) | |
1920 | - { | |
1643 | + if (this.tagsEnabled) { | |
1921 | 1644 | urlParams['tags'] = '{}'; |
1922 | 1645 | } |
1923 | 1646 | |
1924 | - if (container != null) | |
1925 | - { | |
1926 | - try | |
1927 | - { | |
1647 | + if (container != null) { | |
1648 | + try { | |
1928 | 1649 | var toolbarConfig = JSON.parse(decodeURIComponent(urlParams['toolbar-config'] || '{}')); |
1929 | 1650 | toolbarConfig.noCloseBtn = true; |
1930 | 1651 | urlParams['toolbar-config'] = encodeURIComponent(JSON.stringify(toolbarConfig)); |
1931 | 1652 | } |
1932 | - catch (e) {} | |
1653 | + catch (e) { } | |
1933 | 1654 | } |
1934 | 1655 | |
1935 | 1656 | // PostMessage not working and Permission denied for opened access in IE9- |
1936 | - if (document.documentMode == null || document.documentMode >= 10) | |
1937 | - { | |
1657 | + if (document.documentMode == null || document.documentMode >= 10) { | |
1938 | 1658 | Editor.prototype.editButtonLink = this.graphConfig.edit; |
1939 | 1659 | Editor.prototype.editButtonFunc = this.graphConfig.editFunc; |
1940 | 1660 | } |
1941 | - | |
1942 | - EditorUi.prototype.updateActionStates = function() {}; | |
1943 | - EditorUi.prototype.addBeforeUnloadListener = function() {}; | |
1944 | - EditorUi.prototype.addChromelessClickHandler = function() {}; | |
1945 | - | |
1661 | + | |
1662 | + EditorUi.prototype.updateActionStates = function () { }; | |
1663 | + EditorUi.prototype.addBeforeUnloadListener = function () { }; | |
1664 | + EditorUi.prototype.addChromelessClickHandler = function () { }; | |
1665 | + | |
1946 | 1666 | // Workaround for lost reference with same ID is to change |
1947 | 1667 | // ID which must be done before calling EditorUi constructor |
1948 | 1668 | var previousShadowId = Graph.prototype.shadowId; |
1949 | 1669 | Graph.prototype.shadowId = 'lightboxDropShadow'; |
1950 | - | |
1670 | + | |
1951 | 1671 | var ui = new EditorUi(new Editor(true), document.createElement('div'), true); |
1952 | 1672 | ui.editor.editBlankUrl = this.editBlankUrl; |
1953 | - | |
1673 | + | |
1954 | 1674 | // Overrides instance variable and restores prototype state |
1955 | 1675 | ui.editor.graph.shadowId = 'lightboxDropShadow'; |
1956 | 1676 | Graph.prototype.shadowId = previousShadowId; |
1957 | 1677 | |
1958 | 1678 | // Disables refresh |
1959 | - ui.refresh = function() {}; | |
1960 | - | |
1679 | + ui.refresh = function () { }; | |
1680 | + | |
1961 | 1681 | // Handles escape keystroke |
1962 | - var keydownHandler = mxUtils.bind(this, function(evt) | |
1963 | - { | |
1964 | - if (evt.keyCode == 27 /* Escape */) | |
1965 | - { | |
1682 | + var keydownHandler = mxUtils.bind(this, function (evt) { | |
1683 | + if (evt.keyCode == 27 /* Escape */) { | |
1966 | 1684 | ui.destroy(); |
1967 | 1685 | } |
1968 | 1686 | }); |
1969 | 1687 | |
1970 | 1688 | var overflow = this.initialOverflow; |
1971 | 1689 | var destroy = ui.destroy; |
1972 | - | |
1973 | - ui.destroy = function() | |
1974 | - { | |
1975 | - if (container == null) | |
1976 | - { | |
1690 | + | |
1691 | + ui.destroy = function () { | |
1692 | + if (container == null) { | |
1977 | 1693 | mxEvent.removeListener(document.documentElement, 'keydown', keydownHandler); |
1978 | 1694 | document.body.removeChild(backdrop); |
1979 | 1695 | document.body.removeChild(closeImg); |
1980 | 1696 | document.body.style.overflow = overflow; |
1981 | 1697 | GraphViewer.resizeSensorEnabled = true; |
1982 | - | |
1698 | + | |
1983 | 1699 | destroy.apply(this, arguments); |
1984 | 1700 | } |
1985 | 1701 | }; |
1986 | - | |
1702 | + | |
1987 | 1703 | var graph = ui.editor.graph; |
1988 | 1704 | var lightbox = graph.container; |
1989 | 1705 | lightbox.style.overflow = 'hidden'; |
1990 | - | |
1991 | - if (this.lightboxChrome && container == null) | |
1992 | - { | |
1706 | + | |
1707 | + if (this.lightboxChrome && container == null) { | |
1993 | 1708 | lightbox.style.border = '1px solid #c0c0c0'; |
1994 | 1709 | lightbox.style.margin = '40px'; |
1995 | 1710 | |
1996 | 1711 | // Installs the keystroke listener in the target |
1997 | 1712 | mxEvent.addListener(document.documentElement, 'keydown', keydownHandler); |
1998 | 1713 | } |
1999 | - else | |
2000 | - { | |
1714 | + else { | |
2001 | 1715 | backdrop.style.display = 'none'; |
2002 | 1716 | closeImg.style.display = 'none'; |
2003 | 1717 | } |
2004 | - | |
1718 | + | |
2005 | 1719 | // Handles relative images |
2006 | 1720 | var self = this; |
2007 | - | |
2008 | - graph.getImageFromBundles = function(key) | |
2009 | - { | |
1721 | + | |
1722 | + graph.getImageFromBundles = function (key) { | |
2010 | 1723 | return self.getImageUrl(key); |
2011 | 1724 | }; |
2012 | - | |
1725 | + | |
2013 | 1726 | // Handles relative images in print output and temporary graphs |
2014 | 1727 | var uiCreateTemporaryGraph = ui.createTemporaryGraph; |
2015 | - | |
2016 | - ui.createTemporaryGraph = function() | |
2017 | - { | |
1728 | + | |
1729 | + ui.createTemporaryGraph = function () { | |
2018 | 1730 | var newGraph = uiCreateTemporaryGraph.apply(this, arguments); |
2019 | - | |
2020 | - newGraph.getImageFromBundles = function(key) | |
2021 | - { | |
1731 | + | |
1732 | + newGraph.getImageFromBundles = function (key) { | |
2022 | 1733 | return self.getImageUrl(key); |
2023 | 1734 | }; |
2024 | - | |
1735 | + | |
2025 | 1736 | return newGraph; |
2026 | 1737 | }; |
2027 | - | |
2028 | - if (this.graphConfig.move) | |
2029 | - { | |
2030 | - graph.isMoveCellsEvent = function(evt) | |
2031 | - { | |
1738 | + | |
1739 | + if (this.graphConfig.move) { | |
1740 | + graph.isMoveCellsEvent = function (evt) { | |
2032 | 1741 | return true; |
2033 | 1742 | }; |
2034 | 1743 | } |
2035 | - | |
1744 | + | |
2036 | 1745 | mxUtils.setPrefixedStyle(lightbox.style, 'border-radius', '4px'); |
2037 | 1746 | lightbox.style.position = 'fixed'; |
2038 | - | |
1747 | + | |
2039 | 1748 | GraphViewer.resizeSensorEnabled = false; |
2040 | 1749 | document.body.style.overflow = 'hidden'; |
2041 | 1750 | this.addClickHandler(graph, ui); |
2042 | 1751 | |
2043 | - window.setTimeout(mxUtils.bind(this, function() | |
2044 | - { | |
2045 | - try | |
2046 | - { | |
1752 | + window.setTimeout(mxUtils.bind(this, function () { | |
1753 | + try { | |
2047 | 1754 | // Click on backdrop closes lightbox |
2048 | - mxEvent.addListener(backdrop, 'click', function() | |
2049 | - { | |
1755 | + mxEvent.addListener(backdrop, 'click', function () { | |
2050 | 1756 | ui.destroy(); |
2051 | 1757 | }); |
2052 | 1758 | |
... | ... | @@ -2055,39 +1761,34 @@ GraphViewer.prototype.showLocalLightbox = function(container) |
2055 | 1761 | lightbox.style.zIndex = this.lightboxZIndex; |
2056 | 1762 | closeImg.style.zIndex = this.lightboxZIndex; |
2057 | 1763 | |
2058 | - if (container != null) | |
2059 | - { | |
1764 | + if (container != null) { | |
2060 | 1765 | container.innerHTML = ''; |
2061 | 1766 | container.appendChild(lightbox); |
2062 | 1767 | } |
2063 | - else | |
2064 | - { | |
1768 | + else { | |
2065 | 1769 | document.body.appendChild(lightbox); |
2066 | 1770 | document.body.appendChild(closeImg); |
2067 | 1771 | } |
2068 | - | |
1772 | + | |
2069 | 1773 | ui.setFileData(this.xml); |
2070 | - | |
1774 | + | |
2071 | 1775 | mxUtils.setPrefixedStyle(lightbox.style, 'transform', 'rotateY(0deg)'); |
2072 | 1776 | ui.chromelessToolbar.style.bottom = 60 + 'px'; |
2073 | 1777 | ui.chromelessToolbar.style.zIndex = this.lightboxZIndex; |
2074 | - | |
1778 | + | |
2075 | 1779 | // Workaround for clipping in IE11- |
2076 | 1780 | (container || document.body).appendChild(ui.chromelessToolbar); |
2077 | - | |
2078 | - ui.getEditBlankXml = mxUtils.bind(this, function() | |
2079 | - { | |
1781 | + | |
1782 | + ui.getEditBlankXml = mxUtils.bind(this, function () { | |
2080 | 1783 | return this.xml; |
2081 | 1784 | }); |
2082 | - | |
1785 | + | |
2083 | 1786 | ui.lightboxFit(); |
2084 | 1787 | ui.chromelessResize(); |
2085 | 1788 | this.showLayers(graph, this.graph); |
2086 | 1789 | } |
2087 | - catch (e) | |
2088 | - { | |
2089 | - ui.handleError(e, null, function() | |
2090 | - { | |
1790 | + catch (e) { | |
1791 | + ui.handleError(e, null, function () { | |
2091 | 1792 | ui.destroy(); |
2092 | 1793 | }); |
2093 | 1794 | } |
... | ... | @@ -2099,8 +1800,7 @@ GraphViewer.prototype.showLocalLightbox = function(container) |
2099 | 1800 | /** |
2100 | 1801 | * Removes the dialog from the DOM. |
2101 | 1802 | */ |
2102 | -Dialog.prototype.getDocumentSize = function() | |
2103 | -{ | |
1803 | +Dialog.prototype.getDocumentSize = function () { | |
2104 | 1804 | var vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0) |
2105 | 1805 | var vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0) |
2106 | 1806 | |
... | ... | @@ -2110,17 +1810,14 @@ Dialog.prototype.getDocumentSize = function() |
2110 | 1810 | /** |
2111 | 1811 | * |
2112 | 1812 | */ |
2113 | -GraphViewer.prototype.updateTitle = function(title) | |
2114 | -{ | |
1813 | +GraphViewer.prototype.updateTitle = function (title) { | |
2115 | 1814 | title = title || ''; |
2116 | - | |
2117 | - if (this.showTitleAsTooltip && this.graph != null && this.graph.container != null) | |
2118 | - { | |
1815 | + | |
1816 | + if (this.showTitleAsTooltip && this.graph != null && this.graph.container != null) { | |
2119 | 1817 | this.graph.container.setAttribute('title', title); |
2120 | - } | |
2121 | - | |
2122 | - if (this.filename != null) | |
2123 | - { | |
1818 | + } | |
1819 | + | |
1820 | + if (this.filename != null) { | |
2124 | 1821 | this.filename.innerText = ''; |
2125 | 1822 | mxUtils.write(this.filename, title); |
2126 | 1823 | this.filename.setAttribute('title', title); |
... | ... | @@ -2130,21 +1827,16 @@ GraphViewer.prototype.updateTitle = function(title) |
2130 | 1827 | /** |
2131 | 1828 | * |
2132 | 1829 | */ |
2133 | -GraphViewer.processElements = function(classname) | |
2134 | -{ | |
2135 | - mxUtils.forEach(GraphViewer.getElementsByClassName(classname || 'mxgraph'), function(div) | |
2136 | - { | |
2137 | - try | |
2138 | - { | |
1830 | +GraphViewer.processElements = function (classname) { | |
1831 | + mxUtils.forEach(GraphViewer.getElementsByClassName(classname || 'mxgraph'), function (div) { | |
1832 | + try { | |
2139 | 1833 | div.innerText = ''; |
2140 | 1834 | GraphViewer.createViewerForElement(div); |
2141 | 1835 | } |
2142 | - catch (e) | |
2143 | - { | |
1836 | + catch (e) { | |
2144 | 1837 | div.innerText = e.message; |
2145 | - | |
2146 | - if (window.console != null) | |
2147 | - { | |
1838 | + | |
1839 | + if (window.console != null) { | |
2148 | 1840 | console.error(e); |
2149 | 1841 | } |
2150 | 1842 | } |
... | ... | @@ -2154,37 +1846,30 @@ GraphViewer.processElements = function(classname) |
2154 | 1846 | /** |
2155 | 1847 | * Adds the given array of stencils to avoid dynamic loading of shapes. |
2156 | 1848 | */ |
2157 | -GraphViewer.getElementsByClassName = function(classname) | |
2158 | -{ | |
2159 | - if (document.getElementsByClassName) | |
2160 | - { | |
1849 | +GraphViewer.getElementsByClassName = function (classname) { | |
1850 | + if (document.getElementsByClassName) { | |
2161 | 1851 | var divs = document.getElementsByClassName(classname); |
2162 | - | |
1852 | + | |
2163 | 1853 | // Workaround for changing divs while processing |
2164 | 1854 | var result = []; |
2165 | - | |
2166 | - for (var i = 0; i < divs.length; i++) | |
2167 | - { | |
1855 | + | |
1856 | + for (var i = 0; i < divs.length; i++) { | |
2168 | 1857 | result.push(divs[i]); |
2169 | 1858 | } |
2170 | - | |
1859 | + | |
2171 | 1860 | return result; |
2172 | 1861 | } |
2173 | - else | |
2174 | - { | |
1862 | + else { | |
2175 | 1863 | var tmp = document.getElementsByTagName('*'); |
2176 | 1864 | var divs = []; |
2177 | - | |
2178 | - for (var i = 0; i < tmp.length; i++) | |
2179 | - { | |
1865 | + | |
1866 | + for (var i = 0; i < tmp.length; i++) { | |
2180 | 1867 | var cls = tmp[i].className; |
2181 | 1868 | |
2182 | - if (cls != null && cls.length > 0) | |
2183 | - { | |
1869 | + if (cls != null && cls.length > 0) { | |
2184 | 1870 | var tokens = cls.split(' '); |
2185 | - | |
2186 | - if (mxUtils.indexOf(tokens, classname) >= 0) | |
2187 | - { | |
1871 | + | |
1872 | + if (mxUtils.indexOf(tokens, classname) >= 0) { | |
2188 | 1873 | divs.push(tmp[i]); |
2189 | 1874 | } |
2190 | 1875 | } |
... | ... | @@ -2197,67 +1882,53 @@ GraphViewer.getElementsByClassName = function(classname) |
2197 | 1882 | /** |
2198 | 1883 | * Adds the given array of stencils to avoid dynamic loading of shapes. |
2199 | 1884 | */ |
2200 | -GraphViewer.createViewerForElement = function(element, callback) | |
2201 | -{ | |
1885 | +GraphViewer.createViewerForElement = function (element, callback) { | |
2202 | 1886 | var data = element.getAttribute('data-mxgraph'); |
2203 | - | |
2204 | - if (data != null) | |
2205 | - { | |
1887 | + | |
1888 | + if (data != null) { | |
2206 | 1889 | var config = JSON.parse(data); |
2207 | - | |
2208 | - var createViewer = function(xml) | |
2209 | - { | |
1890 | + | |
1891 | + var createViewer = function (xml) { | |
2210 | 1892 | var xmlDoc = mxUtils.parseXml(xml); |
2211 | 1893 | var viewer = new GraphViewer(element, xmlDoc.documentElement, config); |
2212 | - | |
2213 | - if (callback != null) | |
2214 | - { | |
1894 | + | |
1895 | + if (callback != null) { | |
2215 | 1896 | callback(viewer); |
2216 | 1897 | } |
2217 | 1898 | }; |
2218 | 1899 | |
2219 | - if (config.url != null) | |
2220 | - { | |
2221 | - GraphViewer.getUrl(config.url, function(xml) | |
2222 | - { | |
1900 | + if (config.url != null) { | |
1901 | + GraphViewer.getUrl(config.url, function (xml) { | |
2223 | 1902 | createViewer(xml); |
2224 | 1903 | }); |
2225 | 1904 | } |
2226 | - else | |
2227 | - { | |
1905 | + else { | |
2228 | 1906 | createViewer(config.xml); |
2229 | 1907 | } |
2230 | 1908 | } |
2231 | 1909 | }; |
2232 | 1910 | |
2233 | -GraphViewer.logAncestorFrames = function() | |
2234 | -{ | |
2235 | - try | |
2236 | - { | |
1911 | +GraphViewer.logAncestorFrames = function () { | |
1912 | + try { | |
2237 | 1913 | if (window.location.ancestorOrigins && window.location.hostname && |
2238 | - window.location.ancestorOrigins.length && window.location.ancestorOrigins.length > 0) | |
2239 | - { | |
1914 | + window.location.ancestorOrigins.length && window.location.ancestorOrigins.length > 0) { | |
2240 | 1915 | var hostname = window.location.hostname; |
2241 | 1916 | |
2242 | - if (hostname && hostname.length > 1 && hostname.charAt(hostname.length - 1) == '/') | |
2243 | - { | |
1917 | + if (hostname && hostname.length > 1 && hostname.charAt(hostname.length - 1) == '/') { | |
2244 | 1918 | hostname = hostname.substring(0, hostname.length - 1) |
2245 | 1919 | } |
2246 | 1920 | |
2247 | 1921 | var message = ''; |
2248 | 1922 | |
2249 | - for (var i = 0; i < window.location.ancestorOrigins.length; i++) | |
2250 | - { | |
1923 | + for (var i = 0; i < window.location.ancestorOrigins.length; i++) { | |
2251 | 1924 | message += ' -> ' + window.location.ancestorOrigins[i]; |
2252 | 1925 | } |
2253 | 1926 | |
2254 | 1927 | if (hostname.endsWith('.draw.io') && window.location.ancestorOrigins.length == 1 && |
2255 | - window.location.ancestorOrigins[0] && window.location.ancestorOrigins[0].endsWith('.atlassian.net')) | |
2256 | - { | |
1928 | + window.location.ancestorOrigins[0] && window.location.ancestorOrigins[0].endsWith('.atlassian.net')) { | |
2257 | 1929 | // do not log *.draw.io domains embedded directly into atlassian.net |
2258 | 1930 | } |
2259 | - else if (window.location.ancestorOrigins.length > 0) | |
2260 | - { | |
1931 | + else if (window.location.ancestorOrigins.length > 0) { | |
2261 | 1932 | var img = new Image(); |
2262 | 1933 | img.src = 'https://log.diagrams.net/images/1x1.png?src=ViewerAncestorFrames' + |
2263 | 1934 | ((typeof window.EditorUi !== 'undefined') ? '&v=' + encodeURIComponent(EditorUi.VERSION) : '') + |
... | ... | @@ -2265,8 +1936,7 @@ GraphViewer.logAncestorFrames = function() |
2265 | 1936 | } |
2266 | 1937 | } |
2267 | 1938 | } |
2268 | - catch (e) | |
2269 | - { | |
1939 | + catch (e) { | |
2270 | 1940 | // ignore |
2271 | 1941 | } |
2272 | 1942 | }; |
... | ... | @@ -2274,10 +1944,8 @@ GraphViewer.logAncestorFrames = function() |
2274 | 1944 | /** |
2275 | 1945 | * Adds event if grid size is changed. |
2276 | 1946 | */ |
2277 | -GraphViewer.initCss = function() | |
2278 | -{ | |
2279 | - try | |
2280 | - { | |
1947 | +GraphViewer.initCss = function () { | |
1948 | + try { | |
2281 | 1949 | var style = document.createElement('style') |
2282 | 1950 | style.type = 'text/css'; |
2283 | 1951 | style.innerHTML = ['div.mxTooltip {', |
... | ... | @@ -2350,8 +2018,7 @@ GraphViewer.initCss = function() |
2350 | 2018 | // Log the ansestor frames |
2351 | 2019 | GraphViewer.logAncestorFrames(); |
2352 | 2020 | } |
2353 | - catch (e) | |
2354 | - { | |
2021 | + catch (e) { | |
2355 | 2022 | // ignore |
2356 | 2023 | } |
2357 | 2024 | }; |
... | ... | @@ -2364,25 +2031,21 @@ GraphViewer.cachedUrls = {}; |
2364 | 2031 | /** |
2365 | 2032 | * Workaround for unsupported CORS in IE9 XHR |
2366 | 2033 | */ |
2367 | -GraphViewer.getUrl = function(url, onload, onerror) | |
2368 | -{ | |
2369 | - if (GraphViewer.cachedUrls[url] != null) | |
2370 | - { | |
2034 | +GraphViewer.getUrl = function (url, onload, onerror) { | |
2035 | + if (GraphViewer.cachedUrls[url] != null) { | |
2371 | 2036 | onload(GraphViewer.cachedUrls[url]); |
2372 | 2037 | } |
2373 | - else | |
2374 | - { | |
2038 | + else { | |
2375 | 2039 | var xhr = (navigator.userAgent != null && navigator.userAgent.indexOf('MSIE 9') > 0) ? |
2376 | 2040 | new XDomainRequest() : new XMLHttpRequest(); |
2377 | 2041 | xhr.open('GET', url); |
2378 | - | |
2379 | - xhr.onload = function() | |
2380 | - { | |
2381 | - onload((xhr.getText != null) ? xhr.getText() : xhr.responseText); | |
2042 | + | |
2043 | + xhr.onload = function () { | |
2044 | + onload((xhr.getText != null) ? xhr.getText() : xhr.responseText); | |
2382 | 2045 | }; |
2383 | - | |
2384 | - xhr.onerror = onerror; | |
2385 | - xhr.send(); | |
2046 | + | |
2047 | + xhr.onerror = onerror; | |
2048 | + xhr.send(); | |
2386 | 2049 | } |
2387 | 2050 | }; |
2388 | 2051 | |
... | ... | @@ -2407,53 +2070,46 @@ GraphViewer.useResizeSensor = true; |
2407 | 2070 | * directory of this distribution and at |
2408 | 2071 | * https://github.com/marcj/css-element-queries/blob/master/LICENSE. |
2409 | 2072 | */ |
2410 | -(function() { | |
2411 | - | |
2412 | - // Only used for the dirty checking, so the event callback count is limted to max 1 call per fps per sensor. | |
2413 | - // In combination with the event based resize sensor this saves cpu time, because the sensor is too fast and | |
2414 | - // would generate too many unnecessary events. | |
2415 | - var requestAnimationFrame = window.requestAnimationFrame || | |
2416 | - window.mozRequestAnimationFrame || | |
2417 | - window.webkitRequestAnimationFrame || | |
2418 | - function (fn) { | |
2419 | - return window.setTimeout(fn, 20); | |
2420 | - }; | |
2421 | - | |
2422 | - /** | |
2423 | - * Class for dimension change detection. | |
2424 | - * | |
2425 | - * @param {Element|Element[]|Elements|jQuery} element | |
2426 | - * @param {Function} callback | |
2427 | - * | |
2428 | - * @constructor | |
2429 | - */ | |
2430 | - var ResizeSensor = function(element, fn) { | |
2431 | - | |
2432 | - var callback = function() | |
2433 | - { | |
2434 | - if (GraphViewer.resizeSensorEnabled) | |
2435 | - { | |
2436 | - fn(); | |
2437 | - } | |
2438 | - }; | |
2073 | +(function () { | |
2074 | + | |
2075 | + // Only used for the dirty checking, so the event callback count is limted to max 1 call per fps per sensor. | |
2076 | + // In combination with the event based resize sensor this saves cpu time, because the sensor is too fast and | |
2077 | + // would generate too many unnecessary events. | |
2078 | + var requestAnimationFrame = window.requestAnimationFrame || | |
2079 | + window.mozRequestAnimationFrame || | |
2080 | + window.webkitRequestAnimationFrame || | |
2081 | + function (fn) { | |
2082 | + return window.setTimeout(fn, 20); | |
2083 | + }; | |
2084 | + | |
2085 | + /** | |
2086 | + * Class for dimension change detection. | |
2087 | + * | |
2088 | + * @param {Element|Element[]|Elements|jQuery} element | |
2089 | + * @param {Function} callback | |
2090 | + * | |
2091 | + * @constructor | |
2092 | + */ | |
2093 | + var ResizeSensor = function (element, fn) { | |
2094 | + | |
2095 | + var callback = function () { | |
2096 | + if (GraphViewer.resizeSensorEnabled) { | |
2097 | + fn(); | |
2098 | + } | |
2099 | + }; | |
2439 | 2100 | |
2440 | 2101 | // Uses ResizeObserver, if available |
2441 | - if (GraphViewer.useResizeObserver && typeof ResizeObserver !== 'undefined') | |
2442 | - { | |
2102 | + if (GraphViewer.useResizeObserver && typeof ResizeObserver !== 'undefined') { | |
2443 | 2103 | var callbackThread = null; |
2444 | 2104 | var active = false; |
2445 | 2105 | |
2446 | - new ResizeObserver(function() | |
2447 | - { | |
2448 | - if (!active) | |
2449 | - { | |
2450 | - if (callbackThread != null) | |
2451 | - { | |
2106 | + new ResizeObserver(function () { | |
2107 | + if (!active) { | |
2108 | + if (callbackThread != null) { | |
2452 | 2109 | window.clearTimeout(callbackThread); |
2453 | 2110 | } |
2454 | 2111 | |
2455 | - callbackThread = window.setTimeout(function() | |
2456 | - { | |
2112 | + callbackThread = window.setTimeout(function () { | |
2457 | 2113 | active = true; |
2458 | 2114 | callback(); |
2459 | 2115 | callbackThread = null; |
... | ... | @@ -2464,165 +2120,165 @@ GraphViewer.useResizeSensor = true; |
2464 | 2120 | |
2465 | 2121 | return |
2466 | 2122 | } |
2467 | - | |
2468 | - /** | |
2469 | - * | |
2470 | - * @constructor | |
2471 | - */ | |
2472 | - function EventQueue() { | |
2473 | - this.q = []; | |
2474 | - this.add = function(ev) { | |
2475 | - this.q.push(ev); | |
2476 | - }; | |
2477 | - | |
2478 | - var i, j; | |
2479 | - this.call = function() { | |
2480 | - for (i = 0, j = this.q.length; i < j; i++) { | |
2481 | - this.q[i].call(); | |
2482 | - } | |
2483 | - }; | |
2484 | - } | |
2485 | - | |
2486 | - /** | |
2487 | - * @param {HTMLElement} element | |
2488 | - * @param {String} prop | |
2489 | - * @returns {String|Number} | |
2490 | - */ | |
2491 | - function getComputedStyle(element, prop) { | |
2492 | - if (element.currentStyle) { | |
2493 | - return element.currentStyle[prop]; | |
2494 | - } else if (window.getComputedStyle) { | |
2495 | - return window.getComputedStyle(element, null).getPropertyValue(prop); | |
2496 | - } else { | |
2497 | - return element.style[prop]; | |
2498 | - } | |
2499 | - } | |
2500 | - | |
2501 | - /** | |
2502 | - * | |
2503 | - * @param {HTMLElement} element | |
2504 | - * @param {Function} resized | |
2505 | - */ | |
2506 | - function attachResizeEvent(element, resized) { | |
2507 | - if (!element.resizedAttached) { | |
2508 | - element.resizedAttached = new EventQueue(); | |
2509 | - element.resizedAttached.add(resized); | |
2510 | - } else if (element.resizedAttached) { | |
2511 | - element.resizedAttached.add(resized); | |
2512 | - return; | |
2513 | - } | |
2514 | - | |
2515 | - element.resizeSensor = document.createElement('div'); | |
2516 | - element.resizeSensor.className = 'resize-sensor'; | |
2517 | - var style = 'position: absolute; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden;'; | |
2518 | - var styleChild = 'position: absolute; left: 0; top: 0; transition: 0s;'; | |
2519 | - | |
2520 | - element.resizeSensor.style.cssText = style; | |
2521 | - element.resizeSensor.innerHTML = | |
2522 | - '<div class="resize-sensor-expand" style="' + style + '">' + | |
2523 | - '<div style="' + styleChild + '"></div>' + | |
2524 | - '</div>' + | |
2525 | - '<div class="resize-sensor-shrink" style="' + style + '">' + | |
2526 | - '<div style="' + styleChild + ' width: 200%; height: 200%"></div>' + | |
2527 | - '</div>'; | |
2528 | - element.appendChild(element.resizeSensor); | |
2529 | - | |
2530 | - // FIXME: Should not change element style | |
2531 | - if (getComputedStyle(element, 'position') == 'static') { | |
2532 | - element.style.position = 'relative'; | |
2533 | - } | |
2534 | - | |
2535 | - var expand = element.resizeSensor.childNodes[0]; | |
2536 | - var expandChild = expand.childNodes[0]; | |
2537 | - var shrink = element.resizeSensor.childNodes[1]; | |
2538 | - | |
2539 | - var reset = function() { | |
2540 | - expandChild.style.width = 100000 + 'px'; | |
2541 | - expandChild.style.height = 100000 + 'px'; | |
2542 | - | |
2543 | - expand.scrollLeft = 100000; | |
2544 | - expand.scrollTop = 100000; | |
2545 | - | |
2546 | - shrink.scrollLeft = 100000; | |
2547 | - shrink.scrollTop = 100000; | |
2548 | - }; | |
2549 | - | |
2550 | - reset(); | |
2551 | - var dirty = false; | |
2552 | - | |
2553 | - var dirtyChecking = function(){ | |
2554 | - if (!element.resizedAttached) return; | |
2555 | - | |
2556 | - if (dirty) { | |
2557 | - element.resizedAttached.call(); | |
2558 | - dirty = false; | |
2559 | - } | |
2560 | - | |
2561 | - requestAnimationFrame(dirtyChecking); | |
2562 | - }; | |
2563 | - | |
2564 | - requestAnimationFrame(dirtyChecking); | |
2565 | - var lastWidth, lastHeight; | |
2566 | - var cachedWidth, cachedHeight; //useful to not query offsetWidth twice | |
2567 | - | |
2568 | - var onScroll = function() { | |
2569 | - if ((cachedWidth = element.offsetWidth) != lastWidth || (cachedHeight = element.offsetHeight) != lastHeight) { | |
2570 | - dirty = true; | |
2571 | - | |
2572 | - lastWidth = cachedWidth; | |
2573 | - lastHeight = cachedHeight; | |
2574 | - } | |
2575 | - reset(); | |
2576 | - }; | |
2577 | - | |
2578 | - var addEvent = function(el, name, cb) { | |
2579 | - if (el.attachEvent) { | |
2580 | - el.attachEvent('on' + name, cb); | |
2581 | - } else { | |
2582 | - el.addEventListener(name, cb); | |
2583 | - } | |
2584 | - }; | |
2585 | - | |
2586 | - addEvent(expand, 'scroll', onScroll); | |
2587 | - addEvent(shrink, 'scroll', onScroll); | |
2588 | - } | |
2589 | - | |
2590 | - var elementType = Object.prototype.toString.call(element); | |
2591 | - var isCollectionTyped = ('[object Array]' === elementType | |
2592 | - || ('[object NodeList]' === elementType) | |
2593 | - || ('[object HTMLCollection]' === elementType) | |
2594 | - || ('undefined' !== typeof jQuery && element instanceof jQuery) //jquery | |
2595 | - || ('undefined' !== typeof Elements && element instanceof Elements) //mootools | |
2596 | - ); | |
2597 | - | |
2598 | - if (isCollectionTyped) { | |
2599 | - var i = 0, j = element.length; | |
2600 | - for (; i < j; i++) { | |
2601 | - attachResizeEvent(element[i], callback); | |
2602 | - } | |
2603 | - } else { | |
2604 | - attachResizeEvent(element, callback); | |
2605 | - } | |
2606 | - | |
2607 | - this.detach = function() { | |
2608 | - if (isCollectionTyped) { | |
2609 | - var i = 0, j = element.length; | |
2610 | - for (; i < j; i++) { | |
2611 | - ResizeSensor.detach(element[i]); | |
2612 | - } | |
2613 | - } else { | |
2614 | - ResizeSensor.detach(element); | |
2615 | - } | |
2616 | - }; | |
2617 | - }; | |
2618 | - | |
2619 | - ResizeSensor.detach = function(element) { | |
2620 | - if (element.resizeSensor) { | |
2621 | - element.removeChild(element.resizeSensor); | |
2622 | - delete element.resizeSensor; | |
2623 | - delete element.resizedAttached; | |
2624 | - } | |
2625 | - }; | |
2626 | - | |
2627 | - window.ResizeSensor = ResizeSensor; | |
2123 | + | |
2124 | + /** | |
2125 | + * | |
2126 | + * @constructor | |
2127 | + */ | |
2128 | + function EventQueue() { | |
2129 | + this.q = []; | |
2130 | + this.add = function (ev) { | |
2131 | + this.q.push(ev); | |
2132 | + }; | |
2133 | + | |
2134 | + var i, j; | |
2135 | + this.call = function () { | |
2136 | + for (i = 0, j = this.q.length; i < j; i++) { | |
2137 | + this.q[i].call(); | |
2138 | + } | |
2139 | + }; | |
2140 | + } | |
2141 | + | |
2142 | + /** | |
2143 | + * @param {HTMLElement} element | |
2144 | + * @param {String} prop | |
2145 | + * @returns {String|Number} | |
2146 | + */ | |
2147 | + function getComputedStyle(element, prop) { | |
2148 | + if (element.currentStyle) { | |
2149 | + return element.currentStyle[prop]; | |
2150 | + } else if (window.getComputedStyle) { | |
2151 | + return window.getComputedStyle(element, null).getPropertyValue(prop); | |
2152 | + } else { | |
2153 | + return element.style[prop]; | |
2154 | + } | |
2155 | + } | |
2156 | + | |
2157 | + /** | |
2158 | + * | |
2159 | + * @param {HTMLElement} element | |
2160 | + * @param {Function} resized | |
2161 | + */ | |
2162 | + function attachResizeEvent(element, resized) { | |
2163 | + if (!element.resizedAttached) { | |
2164 | + element.resizedAttached = new EventQueue(); | |
2165 | + element.resizedAttached.add(resized); | |
2166 | + } else if (element.resizedAttached) { | |
2167 | + element.resizedAttached.add(resized); | |
2168 | + return; | |
2169 | + } | |
2170 | + | |
2171 | + element.resizeSensor = document.createElement('div'); | |
2172 | + element.resizeSensor.className = 'resize-sensor'; | |
2173 | + var style = 'position: absolute; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden;'; | |
2174 | + var styleChild = 'position: absolute; left: 0; top: 0; transition: 0s;'; | |
2175 | + | |
2176 | + element.resizeSensor.style.cssText = style; | |
2177 | + element.resizeSensor.innerHTML = | |
2178 | + '<div class="resize-sensor-expand" style="' + style + '">' + | |
2179 | + '<div style="' + styleChild + '"></div>' + | |
2180 | + '</div>' + | |
2181 | + '<div class="resize-sensor-shrink" style="' + style + '">' + | |
2182 | + '<div style="' + styleChild + ' width: 200%; height: 200%"></div>' + | |
2183 | + '</div>'; | |
2184 | + element.appendChild(element.resizeSensor); | |
2185 | + | |
2186 | + // FIXME: Should not change element style | |
2187 | + if (getComputedStyle(element, 'position') == 'static') { | |
2188 | + element.style.position = 'relative'; | |
2189 | + } | |
2190 | + | |
2191 | + var expand = element.resizeSensor.childNodes[0]; | |
2192 | + var expandChild = expand.childNodes[0]; | |
2193 | + var shrink = element.resizeSensor.childNodes[1]; | |
2194 | + | |
2195 | + var reset = function () { | |
2196 | + expandChild.style.width = 100000 + 'px'; | |
2197 | + expandChild.style.height = 100000 + 'px'; | |
2198 | + | |
2199 | + expand.scrollLeft = 100000; | |
2200 | + expand.scrollTop = 100000; | |
2201 | + | |
2202 | + shrink.scrollLeft = 100000; | |
2203 | + shrink.scrollTop = 100000; | |
2204 | + }; | |
2205 | + | |
2206 | + reset(); | |
2207 | + var dirty = false; | |
2208 | + | |
2209 | + var dirtyChecking = function () { | |
2210 | + if (!element.resizedAttached) return; | |
2211 | + | |
2212 | + if (dirty) { | |
2213 | + element.resizedAttached.call(); | |
2214 | + dirty = false; | |
2215 | + } | |
2216 | + | |
2217 | + requestAnimationFrame(dirtyChecking); | |
2218 | + }; | |
2219 | + | |
2220 | + requestAnimationFrame(dirtyChecking); | |
2221 | + var lastWidth, lastHeight; | |
2222 | + var cachedWidth, cachedHeight; //useful to not query offsetWidth twice | |
2223 | + | |
2224 | + var onScroll = function () { | |
2225 | + if ((cachedWidth = element.offsetWidth) != lastWidth || (cachedHeight = element.offsetHeight) != lastHeight) { | |
2226 | + dirty = true; | |
2227 | + | |
2228 | + lastWidth = cachedWidth; | |
2229 | + lastHeight = cachedHeight; | |
2230 | + } | |
2231 | + reset(); | |
2232 | + }; | |
2233 | + | |
2234 | + var addEvent = function (el, name, cb) { | |
2235 | + if (el.attachEvent) { | |
2236 | + el.attachEvent('on' + name, cb); | |
2237 | + } else { | |
2238 | + el.addEventListener(name, cb); | |
2239 | + } | |
2240 | + }; | |
2241 | + | |
2242 | + addEvent(expand, 'scroll', onScroll); | |
2243 | + addEvent(shrink, 'scroll', onScroll); | |
2244 | + } | |
2245 | + | |
2246 | + var elementType = Object.prototype.toString.call(element); | |
2247 | + var isCollectionTyped = ('[object Array]' === elementType | |
2248 | + || ('[object NodeList]' === elementType) | |
2249 | + || ('[object HTMLCollection]' === elementType) | |
2250 | + || ('undefined' !== typeof jQuery && element instanceof jQuery) //jquery | |
2251 | + || ('undefined' !== typeof Elements && element instanceof Elements) //mootools | |
2252 | + ); | |
2253 | + | |
2254 | + if (isCollectionTyped) { | |
2255 | + var i = 0, j = element.length; | |
2256 | + for (; i < j; i++) { | |
2257 | + attachResizeEvent(element[i], callback); | |
2258 | + } | |
2259 | + } else { | |
2260 | + attachResizeEvent(element, callback); | |
2261 | + } | |
2262 | + | |
2263 | + this.detach = function () { | |
2264 | + if (isCollectionTyped) { | |
2265 | + var i = 0, j = element.length; | |
2266 | + for (; i < j; i++) { | |
2267 | + ResizeSensor.detach(element[i]); | |
2268 | + } | |
2269 | + } else { | |
2270 | + ResizeSensor.detach(element); | |
2271 | + } | |
2272 | + }; | |
2273 | + }; | |
2274 | + | |
2275 | + ResizeSensor.detach = function (element) { | |
2276 | + if (element.resizeSensor) { | |
2277 | + element.removeChild(element.resizeSensor); | |
2278 | + delete element.resizeSensor; | |
2279 | + delete element.resizedAttached; | |
2280 | + } | |
2281 | + }; | |
2282 | + | |
2283 | + window.ResizeSensor = ResizeSensor; | |
2628 | 2284 | })(); | ... | ... |