diff --git a/src/Orchard.Web/Modules/Orchard.DesignerTools/Scripts/orchard-designertools-shapetracing.js b/src/Orchard.Web/Modules/Orchard.DesignerTools/Scripts/orchard-designertools-shapetracing.js index edbae4a0a..7a858d84c 100644 --- a/src/Orchard.Web/Modules/Orchard.DesignerTools/Scripts/orchard-designertools-shapetracing.js +++ b/src/Orchard.Web/Modules/Orchard.DesignerTools/Scripts/orchard-designertools-shapetracing.js @@ -1,440 +1,437 @@ -(function ($) { - $(document).ready(function () { - // default shape window height when first opened - var defaultHeight = 200; +jQuery(function($) { + // default shape window height when first opened + var defaultHeight = 200; - // append the shape tracing window container at the end of the document - $('
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + + // append the shape tracing window container at the end of the document + $('
' + + '
' + + '
' + + '
' + '
' + - '
' + - '
' - ).appendTo('body'); + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + ).appendTo('body'); - // preload main objects - var shapeTracingContainer = $('#shape-tracing-container'); - var shapeTracingResizeHandle = $('#shape-tracing-resize-handle'); - var shapeTracingToolbar = $('#shape-tracing-toolbar'); - var shapeTracingToolbarSwitch = $('#shape-tracing-toolbar-switch'); - var shapeTracingWindow = $('#shape-tracing-window'); - var shapeTracingWindowTree = $('#shape-tracing-window-tree'); - var shapeTracingWindowContent = $('#shape-tracing-window-content'); - var shapeTracingGhost = $('#shape-tracing-container-ghost'); - var shapeTracingOverlay = $('#shape-tracing-overlay'); + // preload main objects + var shapeTracingContainer = $('#shape-tracing-container'); + var shapeTracingResizeHandle = $('#shape-tracing-resize-handle'); + var shapeTracingToolbar = $('#shape-tracing-toolbar'); + var shapeTracingToolbarSwitch = $('#shape-tracing-toolbar-switch'); + var shapeTracingWindow = $('#shape-tracing-window'); + var shapeTracingWindowTree = $('#shape-tracing-window-tree'); + var shapeTracingWindowContent = $('#shape-tracing-window-content'); + var shapeTracingGhost = $('#shape-tracing-container-ghost'); + var shapeTracingOverlay = $('#shape-tracing-overlay'); - var shapeTracingEnabled = false; + var shapeTracingEnabled = false; - // store the size of the container when it is closed (default in css) - var initialContainerSize = shapeTracingContainer.height(); - var previousSize = 0; + // store the size of the container when it is closed (default in css) + var initialContainerSize = shapeTracingContainer.height(); + var previousSize = 0; - // ensure the ghost has always the same size as the container - // and the container is always positionned correctly - var syncResize = function () { - var _window = $(window); - var containerHeight = shapeTracingContainer.outerHeight(); - var containerWidth = shapeTracingContainer.outerWidth(); - var toolbarHeight = shapeTracingToolbar.outerHeight(); - var resizeHandleHeight = shapeTracingResizeHandle.outerHeight(); + // ensure the ghost has always the same size as the container + // and the container is always positionned correctly + var syncResize = function () { + var _window = $(window); + var containerHeight = shapeTracingContainer.outerHeight(); + var containerWidth = shapeTracingContainer.outerWidth(); + var toolbarHeight = shapeTracingToolbar.outerHeight(); + var resizeHandleHeight = shapeTracingResizeHandle.outerHeight(); - shapeTracingGhost.height(containerHeight); + shapeTracingGhost.height(containerHeight); - var windowHeight = _window.height(); - var scrollTop = _window.scrollTop(); - var containerWindowHeight = containerHeight - toolbarHeight - resizeHandleHeight; + var windowHeight = _window.height(); + var scrollTop = _window.scrollTop(); + var containerWindowHeight = containerHeight - toolbarHeight - resizeHandleHeight; - shapeTracingContainer.offset({ top: windowHeight - containerHeight + scrollTop, left: 0 }); - shapeTracingWindow.height(containerWindowHeight); - shapeTracingWindowTree.height(containerWindowHeight); - shapeTracingWindowContent.height(containerWindowHeight); - shapeTracingContainer.width('100%'); + shapeTracingContainer.offset({ top: windowHeight - containerHeight + scrollTop, left: 0 }); + shapeTracingWindow.height(containerWindowHeight); + shapeTracingWindowTree.height(containerWindowHeight); + shapeTracingWindowContent.height(containerWindowHeight); + shapeTracingContainer.width('100%'); - syncResizeMeta(); + syncResizeMeta(); + }; + + // forces the content meta zone's height to enable scrollbar + var syncResizeMeta = function () { + var containerHeight = shapeTracingContainer.outerHeight(); + var containerWidth = shapeTracingContainer.outerWidth(); + var toolbarHeight = shapeTracingToolbar.outerHeight(); + var resizeHandleHeight = shapeTracingResizeHandle.outerHeight(); + + var tabsHeight = $('.shape-tracing-tabs:visible').outerHeight(); + var breadcrumbHeight = $('.shape-tracing-breadcrumb:visible').outerHeight(); + if (tabsHeight) { + var metaContent = $('.shape-tracing-meta-content:visible'); + padding = parseInt(metaContent.css('padding-bottom') + metaContent.css('padding-top')); + metaContent.height(containerHeight - toolbarHeight - resizeHandleHeight - tabsHeight - breadcrumbHeight - padding); + } + }; + + // ensure the size/position is correct whenver the container or the browser is resized + shapeTracingContainer.resize(syncResize); + $(window).resize(syncResize); + $(window).resize(); + + // removes the position flickering by hiding it first, then showing when ready + shapeTracingContainer.show(); + + // expand/collapse behavior + // ensure the container has always a valid size when expanded + shapeTracingToolbarSwitch.click(function () { + var _this = $(this); + _this.toggleClass('expanded'); + if (_this.hasClass('expanded')) { + shapeTracingContainer.height(Math.max(previousSize, defaultHeight, shapeTracingContainer.height())); + enableShapeTracing(); + } + else { + // save previous height + previousSize = shapeTracingContainer.height(); + shapeTracingContainer.height(initialContainerSize); + disableShapeTracing(); + } + + syncResize(); + }); + + var disableShapeTracing = function () { + shapeTracingEnabled = false; + selectShape(); + } + + var enableShapeTracing = function () { + shapeTracingEnabled = true; + } + + // add a resizable handle to the container + $('#shape-tracing-resize-handle').addClass('ui-resizable-handle ui-resizable-n'); + shapeTracingContainer.resizable({ + handles: { n: '#shape-tracing-resize-handle' }, + grid: 20, // mitigates the number of calls to syncResize(), and aligns to the line height + resize: function () { shapeTracingEnabled = false }, + stop: function () { shapeTracingEnabled = true } + }); + + var shapeNodes = {}; // represents the main index of shape nodes, indexed by id + + // projects the shape ids to each DOM element + var startShapeTracingBeacons = $('.shape-tracing-wrapper[shape-id]'); + startShapeTracingBeacons.each(function () { + var _this = $(this); + + var shapeNode = { + id: _this.attr('shape-id'), + type: _this.attr('shape-type'), + hint: _this.attr('shape-hint'), + parent: null, + children: {} }; - // forces the content meta zone's height to enable scrollbar - var syncResizeMeta = function () { - var containerHeight = shapeTracingContainer.outerHeight(); - var containerWidth = shapeTracingContainer.outerWidth(); - var toolbarHeight = shapeTracingToolbar.outerHeight(); - var resizeHandleHeight = shapeTracingResizeHandle.outerHeight(); + // register the new shape node into the main shape nodes index + shapeNodes[shapeNode.id] = shapeNode; - var tabsHeight = $('.shape-tracing-tabs:visible').outerHeight(); - var breadcrumbHeight = $('.shape-tracing-breadcrumb:visible').outerHeight(); - if (tabsHeight) { - var metaContent = $('.shape-tracing-meta-content:visible'); - padding = parseInt(metaContent.css('padding-bottom') + metaContent.css('padding-top')); - metaContent.height(containerHeight - toolbarHeight - resizeHandleHeight - tabsHeight - breadcrumbHeight - padding); - } - }; + // assign the shape-id attribute to all direct children, except wrappers themselves (it would erase their own shape-id) + var found = false; + _this + .nextUntil('[end-of="' + shapeNode.id + '"]') // all elements between the script beacons + .find(':not(.shape-tracing-wrapper)') // all children but not inner beacons + .andSelf() // add the first level items + .attr('shape-id', shapeNode.id) // add the shape-id attribute + .each(function () { + // assign a shapeNode instance to the DOM element + this.shapeNode = shapeNode; + found = true; + }); - // ensure the size/position is correct whenver the container or the browser is resized - shapeTracingContainer.resize(syncResize); - $(window).resize(syncResize); - $(window).resize(); - - // removes the position flickering by hiding it first, then showing when ready - shapeTracingContainer.show(); - - // expand/collapse behavior - // ensure the container has always a valid size when expanded - shapeTracingToolbarSwitch.click(function () { - var _this = $(this); - _this.toggleClass('expanded'); - if (_this.hasClass('expanded')) { - shapeTracingContainer.height(Math.max(previousSize, defaultHeight, shapeTracingContainer.height())); - enableShapeTracing(); - } - else { - // save previous height - previousSize = shapeTracingContainer.height(); - shapeTracingContainer.height(initialContainerSize); - disableShapeTracing(); - } - - syncResize(); - }); - - var disableShapeTracing = function () { - shapeTracingEnabled = false; - selectShape(); + // if the shape is empty, add a hint + if (!found) { + shapeNode.hint = 'empty'; } + this.shapeNode = shapeNode; + }); - var enableShapeTracing = function () { - shapeTracingEnabled = true; + // construct the shape tree based on all current nodes + // for each start beacon, search for the first parent beacon, and create nodes if they don't exist + startShapeTracingBeacons.each(function () { + var _this = $(this); + var shapeNode = this.shapeNode; + var parent = _this.parents('[shape-id!=' + shapeNode.id + ']').get(0); + + shapeNodes[shapeNode.id] = shapeNode; + + if (parent.shapeNode) { + var parentShapeNode = parent.shapeNode; + shapeNodes[parentShapeNode.id] = parentShapeNode; + shapeNode.parent = parentShapeNode; + parentShapeNode.children[shapeNode.id] = shapeNode; } + }); - // add a resizable handle to the container - $('#shape-tracing-resize-handle').addClass('ui-resizable-handle ui-resizable-n'); - shapeTracingContainer.resizable({ - handles: { n: '#shape-tracing-resize-handle' }, - grid: 20, // mitigates the number of calls to syncResize(), and aligns to the line height - resize: function () { shapeTracingEnabled = false }, - stop: function () { shapeTracingEnabled = true } - }); + // removes all beacons as we don't need them anymore + $('.shape-tracing-wrapper').remove(); - var shapeNodes = {}; // represents the main index of shape nodes, indexed by id - - // projects the shape ids to each DOM element - var startShapeTracingBeacons = $('.shape-tracing-wrapper[shape-id]'); - startShapeTracingBeacons.each(function () { - var _this = $(this); - - var shapeNode = { - id: _this.attr('shape-id'), - type: _this.attr('shape-type'), - hint: _this.attr('shape-hint'), - parent: null, - children: {} - }; - - // register the new shape node into the main shape nodes index - shapeNodes[shapeNode.id] = shapeNode; - - // assign the shape-id attribute to all direct children, except wrappers themselves (it would erase their own shape-id) - var found = false; - _this - .nextUntil('[end-of="' + shapeNode.id + '"]') // all elements between the script beacons - .find(':not(.shape-tracing-wrapper)') // all children but not inner beacons - .andSelf() // add the first level items - .attr('shape-id', shapeNode.id) // add the shape-id attribute - .each(function () { - // assign a shapeNode instance to the DOM element - this.shapeNode = shapeNode; - found = true; - }); - - // if the shape is empty, add a hint - if (!found) { - shapeNode.hint = 'empty'; - } - this.shapeNode = shapeNode; - }); - - // construct the shape tree based on all current nodes - // for each start beacon, search for the first parent beacon, and create nodes if they don't exist - startShapeTracingBeacons.each(function () { - var _this = $(this); - var shapeNode = this.shapeNode; - var parent = _this.parents('[shape-id!=' + shapeNode.id + ']').get(0); - - shapeNodes[shapeNode.id] = shapeNode; - - if (parent.shapeNode) { - var parentShapeNode = parent.shapeNode; - shapeNodes[parentShapeNode.id] = parentShapeNode; - shapeNode.parent = parentShapeNode; - parentShapeNode.children[shapeNode.id] = shapeNode; - } - }); - - // removes all beacons as we don't need them anymore - $('.shape-tracing-wrapper').remove(); - - // add first level shapes tree nodes - var shapes = $(''); - for (var shapeId in shapeNodes) { - if (!shapeNodes[shapeId].parent) { - shapes.append(createTreeNode(shapeNodes[shapeId])); - } + // add first level shapes tree nodes + var shapes = $(''); + for (var shapeId in shapeNodes) { + if (!shapeNodes[shapeId].parent) { + shapes.append(createTreeNode(shapeNodes[shapeId])); } + } - shapeTracingWindowTree.append(shapes); + shapeTracingWindowTree.append(shapes); - // add the expand/collapse logic to the shapes tree - var glyph = $(''); - shapeTracingWindowTree.find('div').parent(':has(li)').prepend(glyph); + // add the expand/collapse logic to the shapes tree + var glyph = $(''); + shapeTracingWindowTree.find('div').parent(':has(li)').prepend(glyph); - // collapse all sub uls - shapeTracingWindowTree.find('ul ul').toggle(false); + // collapse all sub uls + shapeTracingWindowTree.find('ul ul').toggle(false); - // expands a list of shapes in the tree - var openExpando = function (expando) { - if (expando.hasClass("closed") || expando.hasClass("closing")) { - expando.siblings('ul').slideDown(100, function () { expando.removeClass("opening").removeClass("closed").addClass("open"); }); - expando.addClass("opening"); - } + // expands a list of shapes in the tree + var openExpando = function (expando) { + if (expando.hasClass("closed") || expando.hasClass("closing")) { + expando.siblings('ul').slideDown(100, function () { expando.removeClass("opening").removeClass("closed").addClass("open"); }); + expando.addClass("opening"); } + } - // collapses a list of shapes in the tree - var closeExpando = function (expando) { - if (!expando.hasClass("closed") && !expando.hasClass("closing")) { - expando.siblings('ul').slideUp(100, function () { expando.removeClass("closing").removeClass("open").addClass("closed"); }); - expando.addClass("closing"); - } + // collapses a list of shapes in the tree + var closeExpando = function (expando) { + if (!expando.hasClass("closed") && !expando.hasClass("closing")) { + expando.siblings('ul').slideUp(100, function () { expando.removeClass("closing").removeClass("open").addClass("closed"); }); + expando.addClass("closing"); } + } - //create an overlay on shapes' descendants - var overlayTarget = null; - $('[shape-id]').add(shapeTracingOverlay).mousemove( - function (event) { - if (!shapeTracingEnabled) { - return; - } - - event.stopPropagation(); - - if ($(this).get(0) == shapeTracingOverlay.get(0)) { - shapeTracingOverlay.hide(); - } - - var element = document.elementFromPoint(event.pageX - $(window).scrollLeft(), event.pageY - $(window).scrollTop()); - shapeTracingOverlay.show(); - - - while (element && !element.shapeNode) - element = element.parentNode; - - if (!element || (overlayTarget != null && overlayTarget.get(0) == element)) { - return; - } - - element = $(element); - shapeTracingOverlay.offset(element.offset()); - shapeTracingOverlay.width(element.outerWidth()); // include border and padding - shapeTracingOverlay.height(element.outerHeight()); // include border and padding - - overlayTarget = element; - } - ); - - // selects a specific shape in the tree, highlight its elements, and display the information - var selectShape = function (shapeId) { - if (!shapeId) { - // remove selection ? - shapeTracingOverlay.hide(); - $('.shape-tracing-selected').removeClass('shape-tracing-selected'); - shapeTracingWindowTree.find('.shape-tracing-selected').removeClass('shape-tracing-selected'); - $('[shape-id-meta]:visible').toggle(false); + //create an overlay on shapes' descendants + var overlayTarget = null; + $('[shape-id]').add(shapeTracingOverlay).mousemove( + function (event) { + if (!shapeTracingEnabled) { return; } - $('.shape-tracing-selected').removeClass('shape-tracing-selected'); - $('li[tree-shape-id="' + shapeId + '"] > div').add('[shape-id="' + shapeId + '"]').addClass('shape-tracing-selected'); - shapeTracingOverlay.hide(); - - // show the properties for the selected shape - $('[shape-id-meta]:visible').toggle(false); - var target = $('[shape-id-meta="' + shapeId + '"]"'); - target.toggle(true); - - // enable codemirror for the current tab - enableCodeMirror(target); - - syncResizeMeta(); - } - - // select shapes when clicked - shapeTracingOverlay.click(function () { - var shapeNode = overlayTarget.get(0).shapeNode; - selectShape(shapeNode.id); - - var lastExpanded = null; - // open the tree until the selected element - $('li[tree-shape-id="' + shapeNode.id + '"]').parents('li').andSelf().find('> .expando-glyph-container').each(function () { - openExpando($(this)); - }) - .last() - .each(function () { - this.scrollIntoView() - }); - - refreshBreadcrumb(); - - return false; - }); - - //create an overlay on shape tree nodes - shapeTracingWindowTree.find('[tree-shape-id] > div') - .hover( - function () { - var _this = $(this); - $('.shape-tracing-overlay').removeClass('shape-tracing-overlay'); - _this.addClass('shape-tracing-overlay'); - }, - function () { - $('.shape-tracing-overlay').removeClass('shape-tracing-overlay'); - }) - .click(function (event) { - var shapeId = $(this).parent().get(0).shapeNode.id; - selectShape(shapeId); - - var element = $('[shape-id="' + shapeId + '"]').get(0); - // there might be no DOM element if the shape was empty, or is not displayed - if (element) { - element.scrollIntoView(); - } - event.stopPropagation(); - }); - // move all shape tracing meta blocks to the content window - $("[shape-id-meta]").detach().prependTo(shapeTracingWindowContent); - - // add the expand/collapse logic to the shape model - // var glyph = $(''); - shapeTracingWindowContent.find('li:has(ul)').prepend(glyph); - - // collapse all sub uls - shapeTracingWindowContent.find('ul ul').toggle(false); - - // tabs events - shapeTracingWindowContent.find('.shape-tracing-tabs > li').click(function () { - var _this = $(this); - var tabName = this.className.split(/\s/)[0]; - - // toggle the selected class on the tab li - $('.shape-tracing-tabs > li.selected').removeClass('selected'); - $('.shape-tracing-tabs > li.' + tabName).addClass('selected'); - - // hide all tabs and display the selected one - $('.shape-tracing-meta-content > div').toggle(false); - $('.shape-tracing-meta-content > div.' + tabName).toggle(true); - - // look for the targetted panel - var wrapper = _this.parent().parent().first(); - var panel = wrapper.find('div.' + tabName); - - refreshBreadcrumb(); - syncResizeMeta(); - - // enable codemirror for the current tab - enableCodeMirror(panel); - }); - - var refreshBreadcrumb = function () { - var container = shapeTracingWindowContent.find('.shape-tracing-meta:visible'); - var breadcrumb = container.find('.shape-tracing-breadcrumb'); - var tab = container.find('.shape-tracing-meta-content > div:visible'); - - if (tab.hasClass('shape')) { - breadcrumb.text(''); + if ($(this).get(0) == shapeTracingOverlay.get(0)) { + shapeTracingOverlay.hide(); } - else if (tab.hasClass('model')) { - breadcrumb.text(''); - } - else if (tab.hasClass('placement')) { - breadcrumb.text(container.find('.sgd-pl > .value').text()); - } - else if (tab.hasClass('template')) { - breadcrumb.text(container.find('.sgd-t > .value').text()); - } - else if (tab.hasClass('html')) { - breadcrumb.text(''); - } - }; - // template link opens template tab - shapeTracingWindowContent.find('.sgd-t a').click(function () { - $(this).parents('.shape-tracing-meta').find('.shape-tracing-tabs > .template').click() - }); + var element = document.elementFromPoint(event.pageX - $(window).scrollLeft(), event.pageY - $(window).scrollTop()); + shapeTracingOverlay.show(); - // activates codemirror on specific textareas - var enableCodeMirror = function (target) { - // if there is a script, and colorization is not enabled yet, turn it on - // code mirror seems to work only if the textarea is visible - target.find('textarea:visible').each(function () { - if ($(this).next('.CodeMirror').length == 0) { - CodeMirror.fromTextArea(this, { mode: "razor", tabMode: "indent", readOnly: true, lineNumbers: true }); - } - }); + + while (element && !element.shapeNode) + element = element.parentNode; + + if (!element || (overlayTarget != null && overlayTarget.get(0) == element)) { + return; + } + + element = $(element); + shapeTracingOverlay.offset(element.offset()); + shapeTracingOverlay.width(element.outerWidth()); // include border and padding + shapeTracingOverlay.height(element.outerHeight()); // include border and padding + + overlayTarget = element; + } + ); + + // selects a specific shape in the tree, highlight its elements, and display the information + var selectShape = function (shapeId) { + if (!shapeId) { + // remove selection ? + shapeTracingOverlay.hide(); + $('.shape-tracing-selected').removeClass('shape-tracing-selected'); + shapeTracingWindowTree.find('.shape-tracing-selected').removeClass('shape-tracing-selected'); + $('[shape-id-meta]:visible').toggle(false); + return; } - // automatically expand or collapse shapes in the tree - shapeTracingWindow.find('.expando-glyph-container').click(function () { + $('.shape-tracing-selected').removeClass('shape-tracing-selected'); + $('li[tree-shape-id="' + shapeId + '"] > div').add('[shape-id="' + shapeId + '"]').addClass('shape-tracing-selected'); + shapeTracingOverlay.hide(); + + // show the properties for the selected shape + $('[shape-id-meta]:visible').toggle(false); + var target = $('[shape-id-meta="' + shapeId + '"]"'); + target.toggle(true); + + // enable codemirror for the current tab + enableCodeMirror(target); + + syncResizeMeta(); + } + + // select shapes when clicked + shapeTracingOverlay.click(function () { + var shapeNode = overlayTarget.get(0).shapeNode; + selectShape(shapeNode.id); + + var lastExpanded = null; + // open the tree until the selected element + $('li[tree-shape-id="' + shapeNode.id + '"]').parents('li').andSelf().find('> .expando-glyph-container').each(function () { + openExpando($(this)); + }) + .last() + .each(function () { + this.scrollIntoView() + }); + + refreshBreadcrumb(); + + return false; + }); + + //create an overlay on shape tree nodes + shapeTracingWindowTree.find('[tree-shape-id] > div') + .hover( + function () { var _this = $(this); - if (_this.hasClass("closed") || _this.hasClass("closing")) { - openExpando(_this); + $('.shape-tracing-overlay').removeClass('shape-tracing-overlay'); + _this.addClass('shape-tracing-overlay'); + }, + function () { + $('.shape-tracing-overlay').removeClass('shape-tracing-overlay'); + }) + .click(function (event) { + var shapeId = $(this).parent().get(0).shapeNode.id; + selectShape(shapeId); + + var element = $('[shape-id="' + shapeId + '"]').get(0); + // there might be no DOM element if the shape was empty, or is not displayed + if (element) { + element.scrollIntoView(); + } + + event.stopPropagation(); + }); + + // move all shape tracing meta blocks to the content window + $("[shape-id-meta]").detach().prependTo(shapeTracingWindowContent); + + // add the expand/collapse logic to the shape model + // var glyph = $(''); + shapeTracingWindowContent.find('li:has(ul)').prepend(glyph); + + // collapse all sub uls + shapeTracingWindowContent.find('ul ul').toggle(false); + + // tabs events + shapeTracingWindowContent.find('.shape-tracing-tabs > li').click(function () { + var _this = $(this); + var tabName = this.className.split(/\s/)[0]; + + // toggle the selected class on the tab li + $('.shape-tracing-tabs > li.selected').removeClass('selected'); + $('.shape-tracing-tabs > li.' + tabName).addClass('selected'); + + // hide all tabs and display the selected one + $('.shape-tracing-meta-content > div').toggle(false); + $('.shape-tracing-meta-content > div.' + tabName).toggle(true); + + // look for the targetted panel + var wrapper = _this.parent().parent().first(); + var panel = wrapper.find('div.' + tabName); + + refreshBreadcrumb(); + syncResizeMeta(); + + // enable codemirror for the current tab + enableCodeMirror(panel); + }); + + var refreshBreadcrumb = function () { + var container = shapeTracingWindowContent.find('.shape-tracing-meta:visible'); + var breadcrumb = container.find('.shape-tracing-breadcrumb'); + var tab = container.find('.shape-tracing-meta-content > div:visible'); + + if (tab.hasClass('shape')) { + breadcrumb.text(''); + } + else if (tab.hasClass('model')) { + breadcrumb.text(''); + } + else if (tab.hasClass('placement')) { + breadcrumb.text(container.find('.sgd-pl > .value').text()); + } + else if (tab.hasClass('template')) { + breadcrumb.text(container.find('.sgd-t > .value').text()); + } + else if (tab.hasClass('html')) { + breadcrumb.text(''); + } + }; + + // template link opens template tab + shapeTracingWindowContent.find('.sgd-t a').click(function () { + $(this).parents('.shape-tracing-meta').find('.shape-tracing-tabs > .template').click() + }); + + // activates codemirror on specific textareas + var enableCodeMirror = function (target) { + // if there is a script, and colorization is not enabled yet, turn it on + // code mirror seems to work only if the textarea is visible + target.find('textarea:visible').each(function () { + if ($(this).next('.CodeMirror').length == 0) { + CodeMirror.fromTextArea(this, { mode: "razor", tabMode: "indent", readOnly: true, lineNumbers: true }); + } + }); + } + + // automatically expand or collapse shapes in the tree + shapeTracingWindow.find('.expando-glyph-container').click(function () { + var _this = $(this); + if (_this.hasClass("closed") || _this.hasClass("closing")) { + openExpando(_this); + } + else { + closeExpando(_this); + } + + return false; + }); + + //create an overlay on model nodes + shapeTracingWindowContent.find('.model div.name') + .hover( + function () { + var _this = $(this); + $('.shape-tracing-overlay').removeClass('shape-tracing-overlay'); + _this.addClass('shape-tracing-overlay'); + }, + function () { + $('.shape-tracing-overlay').removeClass('shape-tracing-overlay'); + }) + .click(function (event) { + // model node is selected + var _this = $(this); + shapeTracingWindowContent.find('.shape-tracing-selected').removeClass('shape-tracing-selected'); + _this.addClass('shape-tracing-selected'); + + // display breadcrumb + var breadcrumb = null; + _this.parentsUntil('.model').children('.name').each(function () { + if (breadcrumb != null) { + breadcrumb = $(this).text() + '.' + breadcrumb; } else { - closeExpando(_this); + breadcrumb = $(this).text(); } - - return false; }); - //create an overlay on model nodes - shapeTracingWindowContent.find('.model div.name') - .hover( - function () { - var _this = $(this); - $('.shape-tracing-overlay').removeClass('shape-tracing-overlay'); - _this.addClass('shape-tracing-overlay'); - }, - function () { - $('.shape-tracing-overlay').removeClass('shape-tracing-overlay'); - }) - .click(function (event) { - // model node is selected - var _this = $(this); - shapeTracingWindowContent.find('.shape-tracing-selected').removeClass('shape-tracing-selected'); - _this.addClass('shape-tracing-selected'); - - // display breadcrumb - var breadcrumb = null; - _this.parentsUntil('.model').children('.name').each(function () { - if (breadcrumb != null) { - breadcrumb = $(this).text() + '.' + breadcrumb; - } - else { - breadcrumb = $(this).text(); - } - }); - - // fix enumerable properties display - breadcrumb = breadcrumb.replace('.[', '['); - - _this.parents('.shape-tracing-meta').find('.shape-tracing-breadcrumb').text('@' + breadcrumb); - event.stopPropagation(); - }); + // fix enumerable properties display + breadcrumb = breadcrumb.replace('.[', '['); + _this.parents('.shape-tracing-meta').find('.shape-tracing-breadcrumb').text('@' + breadcrumb); + event.stopPropagation(); }); // recursively create a node for the shapes tree @@ -461,4 +458,4 @@ return node; } -})(jQuery); +});