415 lines
8.0 KiB
JavaScript
415 lines
8.0 KiB
JavaScript
/**
|
|
* Copyright (c) 2006-2015, JGraph Ltd
|
|
* Copyright (c) 2006-2015, Gaudenz Alder
|
|
*/
|
|
var mxLog =
|
|
{
|
|
/**
|
|
* Class: mxLog
|
|
*
|
|
* A singleton class that implements a simple console.
|
|
*
|
|
* Variable: consoleName
|
|
*
|
|
* Specifies the name of the console window. Default is 'Console'.
|
|
*/
|
|
consoleName: 'Console',
|
|
|
|
/**
|
|
* Variable: TRACE
|
|
*
|
|
* Specified if the output for <enter> and <leave> should be visible in the
|
|
* console. Default is false.
|
|
*/
|
|
TRACE: false,
|
|
|
|
/**
|
|
* Variable: DEBUG
|
|
*
|
|
* Specifies if the output for <debug> should be visible in the console.
|
|
* Default is true.
|
|
*/
|
|
DEBUG: true,
|
|
|
|
/**
|
|
* Variable: WARN
|
|
*
|
|
* Specifies if the output for <warn> should be visible in the console.
|
|
* Default is true.
|
|
*/
|
|
WARN: true,
|
|
|
|
/**
|
|
* Variable: buffer
|
|
*
|
|
* Buffer for pre-initialized content.
|
|
*/
|
|
buffer: '',
|
|
|
|
/**
|
|
* Function: init
|
|
*
|
|
* Initializes the DOM node for the console. This requires document.body to
|
|
* point to a non-null value. This is called from within <setVisible> if the
|
|
* log has not yet been initialized.
|
|
*/
|
|
init: function()
|
|
{
|
|
if (mxLog.window == null && document.body != null)
|
|
{
|
|
var title = mxLog.consoleName + ' - mxGraph ' + mxClient.VERSION;
|
|
|
|
// Creates a table that maintains the layout
|
|
var table = document.createElement('table');
|
|
table.setAttribute('width', '100%');
|
|
table.setAttribute('height', '100%');
|
|
|
|
var tbody = document.createElement('tbody');
|
|
var tr = document.createElement('tr');
|
|
var td = document.createElement('td');
|
|
td.style.verticalAlign = 'top';
|
|
|
|
// Adds the actual console as a textarea
|
|
mxLog.textarea = document.createElement('textarea');
|
|
mxLog.textarea.setAttribute('wrap', 'off');
|
|
mxLog.textarea.setAttribute('readOnly', 'true');
|
|
mxLog.textarea.style.height = '100%';
|
|
mxLog.textarea.style.resize = 'none';
|
|
mxLog.textarea.value = mxLog.buffer;
|
|
|
|
// Workaround for wrong width in standards mode
|
|
if (mxClient.IS_NS && document.compatMode != 'BackCompat')
|
|
{
|
|
mxLog.textarea.style.width = '99%';
|
|
}
|
|
else
|
|
{
|
|
mxLog.textarea.style.width = '100%';
|
|
}
|
|
|
|
td.appendChild(mxLog.textarea);
|
|
tr.appendChild(td);
|
|
tbody.appendChild(tr);
|
|
|
|
// Creates the container div
|
|
tr = document.createElement('tr');
|
|
mxLog.td = document.createElement('td');
|
|
mxLog.td.style.verticalAlign = 'top';
|
|
mxLog.td.setAttribute('height', '30px');
|
|
|
|
tr.appendChild(mxLog.td);
|
|
tbody.appendChild(tr);
|
|
table.appendChild(tbody);
|
|
|
|
// Adds various debugging buttons
|
|
mxLog.addButton('Info', function (evt)
|
|
{
|
|
mxLog.info();
|
|
});
|
|
|
|
mxLog.addButton('DOM', function (evt)
|
|
{
|
|
var content = mxUtils.getInnerHtml(document.body);
|
|
mxLog.debug(content);
|
|
});
|
|
|
|
mxLog.addButton('Trace', function (evt)
|
|
{
|
|
mxLog.TRACE = !mxLog.TRACE;
|
|
|
|
if (mxLog.TRACE)
|
|
{
|
|
mxLog.debug('Tracing enabled');
|
|
}
|
|
else
|
|
{
|
|
mxLog.debug('Tracing disabled');
|
|
}
|
|
});
|
|
|
|
mxLog.addButton('Copy', function (evt)
|
|
{
|
|
try
|
|
{
|
|
mxUtils.copy(mxLog.textarea.value);
|
|
}
|
|
catch (err)
|
|
{
|
|
mxUtils.alert(err);
|
|
}
|
|
});
|
|
|
|
mxLog.addButton('Show', function (evt)
|
|
{
|
|
try
|
|
{
|
|
mxUtils.popup(mxLog.textarea.value);
|
|
}
|
|
catch (err)
|
|
{
|
|
mxUtils.alert(err);
|
|
}
|
|
});
|
|
|
|
mxLog.addButton('Clear', function (evt)
|
|
{
|
|
mxLog.textarea.value = '';
|
|
});
|
|
|
|
// Cross-browser code to get window size
|
|
var h = 0;
|
|
var w = 0;
|
|
|
|
if (typeof(window.innerWidth) === 'number')
|
|
{
|
|
h = window.innerHeight;
|
|
w = window.innerWidth;
|
|
}
|
|
else
|
|
{
|
|
h = (document.documentElement.clientHeight || document.body.clientHeight);
|
|
w = document.body.clientWidth;
|
|
}
|
|
|
|
mxLog.window = new mxWindow(title, table, Math.max(0, w - 320), Math.max(0, h - 210), 300, 160);
|
|
mxLog.window.setMaximizable(true);
|
|
mxLog.window.setScrollable(false);
|
|
mxLog.window.setResizable(true);
|
|
mxLog.window.setClosable(true);
|
|
mxLog.window.destroyOnClose = false;
|
|
|
|
// Workaround for ignored textarea height in various setups
|
|
if (((mxClient.IS_NS || mxClient.IS_IE) && !mxClient.IS_GC &&
|
|
!mxClient.IS_SF && document.compatMode != 'BackCompat') ||
|
|
document.documentMode == 11)
|
|
{
|
|
var elt = mxLog.window.getElement();
|
|
|
|
var resizeHandler = function(sender, evt)
|
|
{
|
|
mxLog.textarea.style.height = Math.max(0, elt.offsetHeight - 70) + 'px';
|
|
};
|
|
|
|
mxLog.window.addListener(mxEvent.RESIZE_END, resizeHandler);
|
|
mxLog.window.addListener(mxEvent.MAXIMIZE, resizeHandler);
|
|
mxLog.window.addListener(mxEvent.NORMALIZE, resizeHandler);
|
|
|
|
mxLog.textarea.style.height = '92px';
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Function: info
|
|
*
|
|
* Writes the current navigator information to the console.
|
|
*/
|
|
info: function()
|
|
{
|
|
mxLog.writeln(mxUtils.toString(navigator));
|
|
},
|
|
|
|
/**
|
|
* Function: addButton
|
|
*
|
|
* Adds a button to the console using the given label and function.
|
|
*/
|
|
addButton: function(lab, funct)
|
|
{
|
|
var button = document.createElement('button');
|
|
mxUtils.write(button, lab);
|
|
mxEvent.addListener(button, 'click', funct);
|
|
mxLog.td.appendChild(button);
|
|
},
|
|
|
|
/**
|
|
* Function: isVisible
|
|
*
|
|
* Returns true if the console is visible.
|
|
*/
|
|
isVisible: function()
|
|
{
|
|
if (mxLog.window != null)
|
|
{
|
|
return mxLog.window.isVisible();
|
|
}
|
|
|
|
return false;
|
|
},
|
|
|
|
|
|
/**
|
|
* Function: show
|
|
*
|
|
* Shows the console.
|
|
*/
|
|
show: function()
|
|
{
|
|
mxLog.setVisible(true);
|
|
},
|
|
|
|
/**
|
|
* Function: setVisible
|
|
*
|
|
* Shows or hides the console.
|
|
*/
|
|
setVisible: function(visible)
|
|
{
|
|
if (mxLog.window == null)
|
|
{
|
|
mxLog.init();
|
|
}
|
|
|
|
if (mxLog.window != null)
|
|
{
|
|
mxLog.window.setVisible(visible);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Function: enter
|
|
*
|
|
* Writes the specified string to the console
|
|
* if <TRACE> is true and returns the current
|
|
* time in milliseconds.
|
|
*
|
|
* Example:
|
|
*
|
|
* (code)
|
|
* mxLog.show();
|
|
* var t0 = mxLog.enter('Hello');
|
|
* // Do something
|
|
* mxLog.leave('World!', t0);
|
|
* (end)
|
|
*/
|
|
enter: function(string)
|
|
{
|
|
if (mxLog.TRACE)
|
|
{
|
|
mxLog.writeln('Entering '+string);
|
|
|
|
return new Date().getTime();
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Function: leave
|
|
*
|
|
* Writes the specified string to the console
|
|
* if <TRACE> is true and computes the difference
|
|
* between the current time and t0 in milliseconds.
|
|
* See <enter> for an example.
|
|
*/
|
|
leave: function(string, t0)
|
|
{
|
|
if (mxLog.TRACE)
|
|
{
|
|
var dt = (t0 != 0) ? ' ('+(new Date().getTime() - t0)+' ms)' : '';
|
|
mxLog.writeln('Leaving '+string+dt);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Function: debug
|
|
*
|
|
* Adds all arguments to the console if <DEBUG> is enabled.
|
|
*
|
|
* Example:
|
|
*
|
|
* (code)
|
|
* mxLog.show();
|
|
* mxLog.debug('Hello, World!');
|
|
* (end)
|
|
*/
|
|
debug: function()
|
|
{
|
|
if (mxLog.DEBUG)
|
|
{
|
|
mxLog.writeln.apply(this, arguments);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Function: warn
|
|
*
|
|
* Adds all arguments to the console if <WARN> is enabled.
|
|
*
|
|
* Example:
|
|
*
|
|
* (code)
|
|
* mxLog.show();
|
|
* mxLog.warn('Hello, World!');
|
|
* (end)
|
|
*/
|
|
warn: function()
|
|
{
|
|
if (mxLog.WARN)
|
|
{
|
|
mxLog.writeln.apply(this, arguments);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Function: write
|
|
*
|
|
* Adds the specified strings to the console.
|
|
*/
|
|
write: function()
|
|
{
|
|
var string = '';
|
|
|
|
for (var i = 0; i < arguments.length; i++)
|
|
{
|
|
string += arguments[i];
|
|
|
|
if (i < arguments.length - 1)
|
|
{
|
|
string += ' ';
|
|
}
|
|
}
|
|
|
|
if (mxLog.textarea != null)
|
|
{
|
|
mxLog.textarea.value = mxLog.textarea.value + string;
|
|
|
|
// Workaround for no update in Presto 2.5.22 (Opera 10.5)
|
|
if (navigator.userAgent != null &&
|
|
navigator.userAgent.indexOf('Presto/2.5') >= 0)
|
|
{
|
|
mxLog.textarea.style.visibility = 'hidden';
|
|
mxLog.textarea.style.visibility = 'visible';
|
|
}
|
|
|
|
mxLog.textarea.scrollTop = mxLog.textarea.scrollHeight;
|
|
}
|
|
else
|
|
{
|
|
mxLog.buffer += string;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Function: writeln
|
|
*
|
|
* Adds the specified strings to the console, appending a linefeed at the
|
|
* end of each string.
|
|
*/
|
|
writeln: function()
|
|
{
|
|
var string = '';
|
|
|
|
for (var i = 0; i < arguments.length; i++)
|
|
{
|
|
string += arguments[i];
|
|
|
|
if (i < arguments.length - 1)
|
|
{
|
|
string += ' ';
|
|
}
|
|
}
|
|
|
|
mxLog.write(string + '\n');
|
|
}
|
|
|
|
};
|