Manages layout of panels surrounding the editor area, and size of the editor area (but not its contents).
Updates panel sizes when the window is resized. Maintains the max resizing limits for panels, based on currently available window size.
Events:
workspaceUpdateLayout
When workspace size changes for any reason (including panel show/hide panel resize, or the window resize).
The 2nd arg is the available workspace height.
The 3rd arg is a refreshHint flag for internal use (passed in to recomputeLayout)
The "#editor-holder": has only one visible child, the current CodeMirror instance (or the no-editor placeholder)
var $editorHolder;
Unit test only: allow passing in mock DOM notes, e.g. for use with SpecRunnerUtils.createMockEditor()
function _setMockDOM($mockWindowContent, $mockEditorHolder) {
$windowContent = $mockWindowContent;
$editorHolder = $mockEditorHolder;
}
Calculates the available height for the full-size Editor (or the no-editor placeholder), accounting for the current size of all visible panels, toolbar, & status bar.
function calcAvailableHeight() {
var availableHt = $windowContent.height();
$editorHolder.siblings().each(function (i, elem) {
var $elem = $(elem);
if ($elem.css("display") !== "none" && $elem.css("position") !== "absolute") {
availableHt -= $elem.outerHeight();
}
});
// Clip value to 0 (it could be negative if a panel wants more space than we have)
return Math.max(availableHt, 0);
}
Creates a new resizable panel beneath the editor area and above the status bar footer. Panel is initially invisible. The panel's size & visibility are automatically saved & restored as a view-state preference.
function createBottomPanel(id, $panel, minSize) {
$panel.insertBefore("#status-bar");
$panel.hide();
updateResizeLimits(); // initialize panel's max size
panelIDMap[id] = new Panel($panel, minSize);
panelIDMap[id].panelID = id;
return panelIDMap[id];
}
Returns an array of all panel ID's
function getAllPanelIDs() {
var property, panelIDs = [];
for (property in panelIDMap) {
if (panelIDMap.hasOwnProperty(property)) {
panelIDs.push(property);
}
}
return panelIDs;
}
Gets the Panel interface for the given ID. Can return undefined if no panel with the ID is found.
function getPanelForID(panelID) {
return panelIDMap[panelID];
}
Trigger editor area resize whenever the window is resized
function handleWindowResize() {
// These are not initialized in Jasmine Spec Runner window until a test
// is run that creates a mock document.
if (!$windowContent || !$editorHolder) {
return;
}
// FIXME (issue #4564) Workaround https://github.com/codemirror/CodeMirror/issues/1787
triggerUpdateLayout();
if (!windowResizing) {
windowResizing = true;
// We don't need any fancy debouncing here - we just need to react before the user can start
// resizing any panels at the new window size. So just listen for first mousemove once the
// window resize releases mouse capture.
$(window.document).one("mousemove", function () {
windowResizing = false;
updateResizeLimits();
});
}
}
Trigger editor area resize whenever the given panel is shown/hidden/resized @param {!jQueryObject} $panel the jquery object in which to attach event handlers
function listenToResize($panel) {
// Update editor height when shown/hidden, & continuously as panel is resized
$panel.on("panelCollapsed panelExpanded panelResizeUpdate", function () {
triggerUpdateLayout();
});
// Update max size of sibling panels when shown/hidden, & at *end* of resize gesture
$panel.on("panelCollapsed panelExpanded panelResizeEnd", function () {
updateResizeLimits();
});
}
Called when an external widget has appeared and needs some of the space occupied by the mainview manager
function recomputeLayout(refreshHint) {
triggerUpdateLayout(refreshHint);
updateResizeLimits();
}
Calculates a new size for editor-holder and resizes it accordingly, then and dispatches the "workspaceUpdateLayout" event. (The editors within are resized by EditorManager, in response to that event).
function triggerUpdateLayout(refreshHint) {
// Find how much space is left for the editor
var editorAreaHeight = calcAvailableHeight();
$editorHolder.height(editorAreaHeight); // affects size of "not-editor" placeholder as well
// Resize editor to fill the space
exports.trigger(EVENT_WORKSPACE_UPDATE_LAYOUT, editorAreaHeight, refreshHint);
}
Updates panel resize limits to disallow making panels big enough to shrink editor area below 0
function updateResizeLimits() {
var editorAreaHeight = $editorHolder.height();
$editorHolder.siblings().each(function (i, elem) {
var $elem = $(elem);
if ($elem.css("display") === "none") {
$elem.data("maxsize", editorAreaHeight);
} else {
$elem.data("maxsize", editorAreaHeight + $elem.outerHeight());
}
});
}
Represents a panel below the editor area (a child of ".content").
function Panel($panel, minSize) {
this.$panel = $panel;
Resizer.makeResizable($panel[0], Resizer.DIRECTION_VERTICAL, Resizer.POSITION_TOP, minSize, false, undefined, true);
listenToResize($panel);
}
Hides the panel
Panel.prototype.hide = function () {
Resizer.hide(this.$panel[0]);
exports.trigger(EVENT_WORKSPACE_PANEL_HIDDEN, this.panelID);
};
Determines if the panel is visible
Panel.prototype.isVisible = function () {
return this.$panel.is(":visible");
};