|
@@ -40,17 +40,6 @@
|
|
|
if (xmlDoc.documentElement.nodeName == 'mxfile')
|
|
|
{
|
|
|
diagrams = xmlDoc.documentElement.getElementsByTagName('diagram');
|
|
|
-
|
|
|
- if (diagrams.length > 0)
|
|
|
- {
|
|
|
- from = Math.max(0, Math.min(parseInt(data.from) || from, diagrams.length - 1));
|
|
|
- var diagramNode = diagrams[from];
|
|
|
-
|
|
|
- if (diagramNode != null)
|
|
|
- {
|
|
|
- xmlDoc = mxUtils.parseXml(graph.decompress(mxUtils.getTextContent(diagramNode)));
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -72,163 +61,13 @@
|
|
|
|
|
|
return graphGetGlobalVariable.apply(this, arguments);
|
|
|
};
|
|
|
-
|
|
|
- // Enables math typesetting
|
|
|
- var math = xmlDoc.documentElement.getAttribute('math') == '1';
|
|
|
-
|
|
|
- if (math)
|
|
|
- {
|
|
|
- mxClient.NO_FO = true;
|
|
|
- }
|
|
|
-
|
|
|
- // Configure graph
|
|
|
- graph.foldingEnabled = false;
|
|
|
- graph.setEnabled(false);
|
|
|
-
|
|
|
- // Sets background image
|
|
|
- var bgImg = xmlDoc.documentElement.getAttribute('backgroundImage');
|
|
|
-
|
|
|
- if (bgImg != null)
|
|
|
- {
|
|
|
- bgImg = JSON.parse(bgImg);
|
|
|
- graph.setBackgroundImage(new mxImage(bgImg.src, bgImg.width, bgImg.height));
|
|
|
- }
|
|
|
-
|
|
|
- // Parses XML into graph
|
|
|
- var codec = new mxCodec(xmlDoc);
|
|
|
- codec.decode(xmlDoc.documentElement, graph.getModel());
|
|
|
-
|
|
|
- // Loads background color
|
|
|
- var bg = (data.bg != null && data.bg.length > 0) ? data.bg : xmlDoc.documentElement.getAttribute('background');
|
|
|
-
|
|
|
- // Normalizes values for transparent backgrounds
|
|
|
- if (bg == 'none' || bg == '')
|
|
|
- {
|
|
|
- bg = null;
|
|
|
- }
|
|
|
-
|
|
|
- // Checks if export format supports transparent backgrounds
|
|
|
- if (bg == null && data.format != 'gif' && data.format != 'png')
|
|
|
- {
|
|
|
- bg = '#ffffff';
|
|
|
- }
|
|
|
-
|
|
|
- // Sets background color on page
|
|
|
- if (bg != null)
|
|
|
- {
|
|
|
- document.body.style.backgroundColor = bg;
|
|
|
- }
|
|
|
-
|
|
|
- // Sets initial value for PDF page background
|
|
|
- graph.pdfPageVisible = false;
|
|
|
-
|
|
|
- // Handles PDF output where the output should match the page format if the page is visible
|
|
|
- if (data.format == 'pdf' && xmlDoc.documentElement.getAttribute('page') == '1' && data.w == 0 && data.h == 0)
|
|
|
- {
|
|
|
- var pw = xmlDoc.documentElement.getAttribute('pageWidth');
|
|
|
- var ph = xmlDoc.documentElement.getAttribute('pageHeight');
|
|
|
- graph.pdfPageVisible = true;
|
|
|
-
|
|
|
- if (pw != null && ph != null)
|
|
|
- {
|
|
|
- graph.pageFormat = new mxRectangle(0, 0, parseFloat(pw), parseFloat(ph));
|
|
|
- }
|
|
|
-
|
|
|
- var ps = xmlDoc.documentElement.getAttribute('pageScale');
|
|
|
-
|
|
|
- if (ps != null)
|
|
|
- {
|
|
|
- graph.pageScale = ps;
|
|
|
- }
|
|
|
-
|
|
|
- graph.getPageSize = function()
|
|
|
- {
|
|
|
- return new mxRectangle(0, 0, this.pageFormat.width * this.pageScale,
|
|
|
- this.pageFormat.height * this.pageScale);
|
|
|
- };
|
|
|
-
|
|
|
- graph.getPageLayout = function()
|
|
|
- {
|
|
|
- var size = this.getPageSize();
|
|
|
- var bounds = this.getGraphBounds();
|
|
|
-
|
|
|
- if (bounds.width == 0 || bounds.height == 0)
|
|
|
- {
|
|
|
- return new mxRectangle(0, 0, 1, 1);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // Computes untransformed graph bounds
|
|
|
- var x = Math.ceil(bounds.x / this.view.scale - this.view.translate.x);
|
|
|
- var y = Math.ceil(bounds.y / this.view.scale - this.view.translate.y);
|
|
|
- var w = Math.floor(bounds.width / this.view.scale);
|
|
|
- var h = Math.floor(bounds.height / this.view.scale);
|
|
|
-
|
|
|
- var x0 = Math.floor(x / size.width);
|
|
|
- var y0 = Math.floor(y / size.height);
|
|
|
- var w0 = Math.ceil((x + w) / size.width) - x0;
|
|
|
- var h0 = Math.ceil((y + h) / size.height) - y0;
|
|
|
-
|
|
|
- return new mxRectangle(x0, y0, w0, h0);
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- // Fits the number of background pages to the graph
|
|
|
- graph.view.getBackgroundPageBounds = function()
|
|
|
- {
|
|
|
- var layout = this.graph.getPageLayout();
|
|
|
- var page = this.graph.getPageSize();
|
|
|
-
|
|
|
- return new mxRectangle(this.scale * (this.translate.x + layout.x * page.width),
|
|
|
- this.scale * (this.translate.y + layout.y * page.height),
|
|
|
- this.scale * layout.width * page.width,
|
|
|
- this.scale * layout.height * page.height);
|
|
|
- };
|
|
|
- }
|
|
|
-
|
|
|
- if (!graph.pdfPageVisible)
|
|
|
- {
|
|
|
- var b = graph.getGraphBounds();
|
|
|
-
|
|
|
- // Floor is needed to keep rendering crisp
|
|
|
- if (data.w > 0 && data.h > 0)
|
|
|
- {
|
|
|
- var s = Math.min(data.w / b.width, data.h / b.height);
|
|
|
- graph.view.scaleAndTranslate(s,
|
|
|
- Math.floor(data.border / s - b.x),
|
|
|
- Math.floor(data.border / s - b.y));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- graph.view.scaleAndTranslate(data.scale, Math.floor(data.border - b.x),
|
|
|
- Math.floor(data.border - b.y));
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // Disables border for PDF page export
|
|
|
- data.border = 0;
|
|
|
-
|
|
|
- // Moves to first page in page layout
|
|
|
- var layout = graph.getPageLayout();
|
|
|
- var page = graph.getPageSize();
|
|
|
- var dx = layout.x * page.width;
|
|
|
- var dy = layout.y * page.height;
|
|
|
-
|
|
|
- if (dx != 0 || dy != 0)
|
|
|
- {
|
|
|
- graph.view.setTranslate(Math.floor(-dx), Math.floor(-dy));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // Gets the diagram bounds and sets the document size
|
|
|
- var bounds = (graph.pdfPageVisible) ? graph.view.getBackgroundPageBounds() : graph.getGraphBounds();
|
|
|
- bounds.width = Math.ceil(bounds.width + data.border);
|
|
|
- bounds.height = Math.ceil(bounds.height + data.border);
|
|
|
|
|
|
+ var preview = null;
|
|
|
+ var waitCounter = 1;
|
|
|
+ var bounds;
|
|
|
// Waits for all images to finish loading
|
|
|
var cache = new Object();
|
|
|
- var waitCounter = 1;
|
|
|
+ var math = false;
|
|
|
|
|
|
// Decrements waitCounter and invokes callback when finished
|
|
|
function decrementWaitCounter()
|
|
@@ -267,10 +106,6 @@
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- // Includes images in SVG and HTML labels
|
|
|
- waitForImages('image', 'xlink:href');
|
|
|
- waitForImages('img', 'src');
|
|
|
-
|
|
|
// Waits for MathJax.Hub to become available to register
|
|
|
// wait counter callback asynchronously after math render
|
|
|
var editorDoMathJaxRender = Editor.doMathJaxRender;
|
|
@@ -298,77 +133,271 @@
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- // Converts the graph to a vertical sequence of pages for PDF export
|
|
|
- if (graph.pdfPageVisible)
|
|
|
+ function renderPage()
|
|
|
{
|
|
|
- var pf = graph.pageFormat || mxConstants.PAGE_FORMAT_A4_PORTRAIT;
|
|
|
- var scale = 1 / graph.pageScale;
|
|
|
- var autoOrigin = false;
|
|
|
- var border = 0;
|
|
|
-
|
|
|
- // Negative coordinates are cropped or shifted if page visible
|
|
|
- var gb = graph.getGraphBounds();
|
|
|
- var x0 = 0;
|
|
|
- var y0 = 0;
|
|
|
-
|
|
|
- // Applies print scale
|
|
|
- pf = mxRectangle.fromRectangle(pf);
|
|
|
- pf.width = Math.ceil(pf.width);
|
|
|
- pf.height = Math.ceil(pf.height);
|
|
|
|
|
|
- // Starts at first visible page
|
|
|
- var layout = graph.getPageLayout();
|
|
|
- x0 -= layout.x * pf.width;
|
|
|
- y0 -= layout.y * pf.height;
|
|
|
+ // Enables math typesetting
|
|
|
+ math |= xmlDoc.documentElement.getAttribute('math') == '1';
|
|
|
|
|
|
- var preview = new mxPrintPreview(graph, scale, pf, border, x0, y0);
|
|
|
- preview.printBackgroundImage = true;
|
|
|
- preview.autoOrigin = autoOrigin;
|
|
|
- preview.backgroundColor = bg;
|
|
|
-
|
|
|
- // Renders print output into this document and removes the graph container
|
|
|
- preview.open(null, window);
|
|
|
- graph.container.parentNode.removeChild(graph.container);
|
|
|
-
|
|
|
- // Adds shadow
|
|
|
- // NOTE: Shadow rasterizes output
|
|
|
- /*if (mxClient.IS_SVG && xmlDoc.documentElement.getAttribute('shadow') == '1')
|
|
|
+ if (math)
|
|
|
+ {
|
|
|
+ mxClient.NO_FO = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Configure graph
|
|
|
+ graph.foldingEnabled = false;
|
|
|
+ graph.setEnabled(false);
|
|
|
+
|
|
|
+ // Sets background image
|
|
|
+ var bgImg = xmlDoc.documentElement.getAttribute('backgroundImage');
|
|
|
+
|
|
|
+ if (bgImg != null)
|
|
|
+ {
|
|
|
+ bgImg = JSON.parse(bgImg);
|
|
|
+ graph.setBackgroundImage(new mxImage(bgImg.src, bgImg.width, bgImg.height));
|
|
|
+ }
|
|
|
+
|
|
|
+ // Parses XML into graph
|
|
|
+ var codec = new mxCodec(xmlDoc);
|
|
|
+ codec.decode(xmlDoc.documentElement, graph.getModel());
|
|
|
+
|
|
|
+ // Loads background color
|
|
|
+ var bg = (data.bg != null && data.bg.length > 0) ? data.bg : xmlDoc.documentElement.getAttribute('background');
|
|
|
+
|
|
|
+ // Normalizes values for transparent backgrounds
|
|
|
+ if (bg == 'none' || bg == '')
|
|
|
{
|
|
|
- var svgs = document.getElementsByTagName('svg');
|
|
|
+ bg = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Checks if export format supports transparent backgrounds
|
|
|
+ if (bg == null && data.format != 'gif' && data.format != 'png')
|
|
|
+ {
|
|
|
+ bg = '#ffffff';
|
|
|
+ }
|
|
|
+
|
|
|
+ // Sets background color on page
|
|
|
+ if (bg != null)
|
|
|
+ {
|
|
|
+ document.body.style.backgroundColor = bg;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Sets initial value for PDF page background
|
|
|
+ graph.pdfPageVisible = false;
|
|
|
+
|
|
|
+ // Handles PDF output where the output should match the page format if the page is visible
|
|
|
+ if (data.format == 'pdf' && xmlDoc.documentElement.getAttribute('page') == '1' && data.w == 0 && data.h == 0)
|
|
|
+ {
|
|
|
+ var pw = xmlDoc.documentElement.getAttribute('pageWidth');
|
|
|
+ var ph = xmlDoc.documentElement.getAttribute('pageHeight');
|
|
|
+ graph.pdfPageVisible = true;
|
|
|
|
|
|
- for (var i = 0; i < svgs.length; i++)
|
|
|
+ if (pw != null && ph != null)
|
|
|
{
|
|
|
- var svg = svgs[i];
|
|
|
-
|
|
|
- var filter = graph.addSvgShadow(svg, null, true);
|
|
|
- filter.setAttribute('id', 'shadow-' + i);
|
|
|
- svg.appendChild(filter);
|
|
|
- svg.setAttribute('filter', 'url(#' + 'shadow-' + i + ')');
|
|
|
+ graph.pageFormat = new mxRectangle(0, 0, parseFloat(pw), parseFloat(ph));
|
|
|
+ }
|
|
|
+
|
|
|
+ var ps = xmlDoc.documentElement.getAttribute('pageScale');
|
|
|
+
|
|
|
+ if (ps != null)
|
|
|
+ {
|
|
|
+ graph.pageScale = ps;
|
|
|
}
|
|
|
|
|
|
- border = 7;
|
|
|
- }*/
|
|
|
+ graph.getPageSize = function()
|
|
|
+ {
|
|
|
+ return new mxRectangle(0, 0, this.pageFormat.width * this.pageScale,
|
|
|
+ this.pageFormat.height * this.pageScale);
|
|
|
+ };
|
|
|
+
|
|
|
+ graph.getPageLayout = function()
|
|
|
+ {
|
|
|
+ var size = this.getPageSize();
|
|
|
+ var bounds = this.getGraphBounds();
|
|
|
+
|
|
|
+ if (bounds.width == 0 || bounds.height == 0)
|
|
|
+ {
|
|
|
+ return new mxRectangle(0, 0, 1, 1);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // Computes untransformed graph bounds
|
|
|
+ var x = Math.ceil(bounds.x / this.view.scale - this.view.translate.x);
|
|
|
+ var y = Math.ceil(bounds.y / this.view.scale - this.view.translate.y);
|
|
|
+ var w = Math.floor(bounds.width / this.view.scale);
|
|
|
+ var h = Math.floor(bounds.height / this.view.scale);
|
|
|
+
|
|
|
+ var x0 = Math.floor(x / size.width);
|
|
|
+ var y0 = Math.floor(y / size.height);
|
|
|
+ var w0 = Math.ceil((x + w) / size.width) - x0;
|
|
|
+ var h0 = Math.ceil((y + h) / size.height) - y0;
|
|
|
+
|
|
|
+ return new mxRectangle(x0, y0, w0, h0);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // Fits the number of background pages to the graph
|
|
|
+ graph.view.getBackgroundPageBounds = function()
|
|
|
+ {
|
|
|
+ var layout = this.graph.getPageLayout();
|
|
|
+ var page = this.graph.getPageSize();
|
|
|
+
|
|
|
+ return new mxRectangle(this.scale * (this.translate.x + layout.x * page.width),
|
|
|
+ this.scale * (this.translate.y + layout.y * page.height),
|
|
|
+ this.scale * layout.width * page.width,
|
|
|
+ this.scale * layout.height * page.height);
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!graph.pdfPageVisible)
|
|
|
+ {
|
|
|
+ var b = graph.getGraphBounds();
|
|
|
+
|
|
|
+ // Floor is needed to keep rendering crisp
|
|
|
+ if (data.w > 0 && data.h > 0)
|
|
|
+ {
|
|
|
+ var s = Math.min(data.w / b.width, data.h / b.height);
|
|
|
+ graph.view.scaleAndTranslate(s,
|
|
|
+ Math.floor(data.border / s - b.x),
|
|
|
+ Math.floor(data.border / s - b.y));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ graph.view.scaleAndTranslate(data.scale, Math.floor(data.border - b.x),
|
|
|
+ Math.floor(data.border - b.y));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // Disables border for PDF page export
|
|
|
+ data.border = 0;
|
|
|
+
|
|
|
+ // Moves to first page in page layout
|
|
|
+ var layout = graph.getPageLayout();
|
|
|
+ var page = graph.getPageSize();
|
|
|
+ var dx = layout.x * page.width;
|
|
|
+ var dy = layout.y * page.height;
|
|
|
+
|
|
|
+ if (dx != 0 || dy != 0)
|
|
|
+ {
|
|
|
+ graph.view.setTranslate(Math.floor(-dx), Math.floor(-dy));
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- bounds = new mxRectangle(0, 0, pf.width, pf.height);
|
|
|
- renderMath(document.body);
|
|
|
+ // Gets the diagram bounds and sets the document size
|
|
|
+ bounds = (graph.pdfPageVisible) ? graph.view.getBackgroundPageBounds() : graph.getGraphBounds();
|
|
|
+ bounds.width = Math.ceil(bounds.width + data.border);
|
|
|
+ bounds.height = Math.ceil(bounds.height + data.border);
|
|
|
+
|
|
|
+ // Converts the graph to a vertical sequence of pages for PDF export
|
|
|
+ if (graph.pdfPageVisible)
|
|
|
+ {
|
|
|
+ var pf = graph.pageFormat || mxConstants.PAGE_FORMAT_A4_PORTRAIT;
|
|
|
+ var scale = 1 / graph.pageScale;
|
|
|
+ var autoOrigin = false;
|
|
|
+ var border = 0;
|
|
|
+
|
|
|
+ // Negative coordinates are cropped or shifted if page visible
|
|
|
+ var gb = graph.getGraphBounds();
|
|
|
+ var x0 = 0;
|
|
|
+ var y0 = 0;
|
|
|
+
|
|
|
+ // Applies print scale
|
|
|
+ pf = mxRectangle.fromRectangle(pf);
|
|
|
+ pf.width = Math.ceil(pf.width);
|
|
|
+ pf.height = Math.ceil(pf.height);
|
|
|
+
|
|
|
+ // Starts at first visible page
|
|
|
+ var layout = graph.getPageLayout();
|
|
|
+ x0 -= layout.x * pf.width;
|
|
|
+ y0 -= layout.y * pf.height;
|
|
|
+
|
|
|
+ if (preview == null) {
|
|
|
+ preview = new mxPrintPreview(graph, scale, pf, border, x0, y0);
|
|
|
+ preview.printBackgroundImage = true;
|
|
|
+ preview.autoOrigin = autoOrigin;
|
|
|
+ preview.backgroundColor = bg;
|
|
|
+ // Renders print output into this document and removes the graph container
|
|
|
+ preview.open(null, window);
|
|
|
+ graph.container.parentNode.removeChild(graph.container);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ preview.backgroundColor = bg;
|
|
|
+ preview.autoOrigin = autoOrigin;
|
|
|
+ preview.appendGraph(graph, scale, x0, y0);
|
|
|
+ }
|
|
|
+ // Adds shadow
|
|
|
+ // NOTE: Shadow rasterizes output
|
|
|
+ /*if (mxClient.IS_SVG && xmlDoc.documentElement.getAttribute('shadow') == '1')
|
|
|
+ {
|
|
|
+ var svgs = document.getElementsByTagName('svg');
|
|
|
+
|
|
|
+ for (var i = 0; i < svgs.length; i++)
|
|
|
+ {
|
|
|
+ var svg = svgs[i];
|
|
|
+
|
|
|
+ var filter = graph.addSvgShadow(svg, null, true);
|
|
|
+ filter.setAttribute('id', 'shadow-' + i);
|
|
|
+ svg.appendChild(filter);
|
|
|
+ svg.setAttribute('filter', 'url(#' + 'shadow-' + i + ')');
|
|
|
+ }
|
|
|
+
|
|
|
+ border = 7;
|
|
|
+ }*/
|
|
|
+
|
|
|
+ bounds = new mxRectangle(0, 0, pf.width, pf.height);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // Adds shadow
|
|
|
+ // NOTE: PDF shadow rasterizes output so it's disabled
|
|
|
+ if (data.format != 'pdf' && mxClient.IS_SVG && xmlDoc.documentElement.getAttribute('shadow') == '1')
|
|
|
+ {
|
|
|
+ graph.addSvgShadow(graph.view.canvas.ownerSVGElement, null, true);
|
|
|
+ graph.setShadowVisible(true);
|
|
|
+ bounds.width += 7;
|
|
|
+ bounds.height += 7;
|
|
|
+ }
|
|
|
+
|
|
|
+ document.body.style.width = Math.ceil(bounds.x + bounds.width) + 'px';
|
|
|
+ document.body.style.height = Math.ceil(bounds.y + bounds.height) + 'px';
|
|
|
+ }
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ if (diagrams != null && diagrams.length > 0)
|
|
|
{
|
|
|
- // Adds shadow
|
|
|
- // NOTE: PDF shadow rasterizes output so it's disabled
|
|
|
- if (data.format != 'pdf' && mxClient.IS_SVG && xmlDoc.documentElement.getAttribute('shadow') == '1')
|
|
|
+ var to = diagrams.length - 1;
|
|
|
+
|
|
|
+ //Parameters to and all pages should not be sent with formats other than PDF with page view enabled
|
|
|
+ if (!data.allPages)
|
|
|
{
|
|
|
- graph.addSvgShadow(graph.view.canvas.ownerSVGElement, null, true);
|
|
|
- graph.setShadowVisible(true);
|
|
|
- bounds.width += 7;
|
|
|
- bounds.height += 7;
|
|
|
+ from = Math.max(0, Math.min(parseInt(data.from) || from, diagrams.length - 1));
|
|
|
+ to = parseInt(data.to);
|
|
|
+ //If to is not defined, use from (so one page), otherwise, to is restricted to the range from "from" to diagrams.length - 1
|
|
|
+ to = isNaN(to)? from : Math.max(from, Math.min(to, diagrams.length - 1));
|
|
|
}
|
|
|
-
|
|
|
- renderMath(graph.container);
|
|
|
- document.body.style.width = Math.ceil(bounds.x + bounds.width) + 'px';
|
|
|
- document.body.style.height = Math.ceil(bounds.y + bounds.height) + 'px';
|
|
|
+
|
|
|
+ for (var i = from; i <= to; i++)
|
|
|
+ {
|
|
|
+ if (diagrams[i] != null)
|
|
|
+ {
|
|
|
+ xmlDoc = mxUtils.parseXml(graph.decompress(mxUtils.getTextContent(diagrams[i])));
|
|
|
+ graph.getModel().clear();
|
|
|
+ from = i;
|
|
|
+ renderPage();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ renderPage();
|
|
|
}
|
|
|
|
|
|
+ // Includes images in SVG and HTML labels
|
|
|
+ waitForImages('image', 'xlink:href');
|
|
|
+ waitForImages('img', 'src');
|
|
|
+ renderMath(document.body);
|
|
|
// Immediate return if not waiting for any content
|
|
|
decrementWaitCounter();
|
|
|
};
|