diff --git a/platform/commonUI/general/bundle.json b/platform/commonUI/general/bundle.json index fdac965863..2093a988cd 100644 --- a/platform/commonUI/general/bundle.json +++ b/platform/commonUI/general/bundle.json @@ -8,8 +8,8 @@ "key": "urlService", "implementation": "/services/UrlService.js", "depends": [ "$location" ] - } - ], + } + ], "runs": [ { "implementation": "StyleSheetLoader.js", @@ -131,6 +131,15 @@ "key": "mctScrollY", "implementation": "directives/MCTScroll.js", "depends": [ "$parse", "MCT_SCROLL_Y_PROPERTY", "MCT_SCROLL_Y_ATTRIBUTE" ] + }, + { + "key": "mctSplitPane", + "implementation": "directives/MCTSplitPane.js", + "depends": [ "$parse", "$log" ] + }, + { + "key": "mctSplitter", + "implementation": "directives/MCTSplitter.js" } ], "constants": [ diff --git a/platform/commonUI/general/src/directives/MCTSplitPane.js b/platform/commonUI/general/src/directives/MCTSplitPane.js index dded5f0ea3..88d6e7aeda 100644 --- a/platform/commonUI/general/src/directives/MCTSplitPane.js +++ b/platform/commonUI/general/src/directives/MCTSplitPane.js @@ -27,9 +27,7 @@ define( 'use strict'; // Pixel width to allocate for the splitter itself - var SPLITTER_WIDTH = 8, - HALF_WIDTH = SPLITTER_WIDTH / 2, - DEFAULT_ANCHOR = 'left', + var DEFAULT_ANCHOR = 'left', CHILDREN_WARNING_MESSAGE = [ "Invalid mct-split-pane contents.", "This element should contain exactly three", @@ -111,21 +109,29 @@ define( return "calc(" + styleValue + " + " + offset + "px)"; } + // Get relevant size (height or width) of DOM element + function getSize(splitter) { + return anchor.orientation === 'vertical' ? + splitter.offsetWidth : splitter.offsetHeight; + } + // Apply styles to child elements function updateChildren(children) { // Pick out correct elements to update, flowing from // selected anchor edge. var first = children.eq(anchor.reversed ? 0 : 2), splitter = children.eq(1), - last = children.eq(anchor.reversed ? 2 : 0); + last = children.eq(anchor.reversed ? 2 : 0), + splitterSize = getSize(splitter[0]), + halfSize = splitterSize / 2; first.css(anchor.edge, "0px"); - first.css(anchor.dimension, calc(-HALF_WIDTH)); + first.css(anchor.dimension, calc(-halfSize)); - splitter.css(anchor.edge, calc(-HALF_WIDTH)); - splitter.css(anchor.dimension, SPLITTER_WIDTH + "px"); + splitter.css(anchor.edge, calc(-halfSize)); + splitter.css(anchor.dimension, splitterSize + "px"); - last.css(anchor.edge, calc(HALF_WIDTH)); + last.css(anchor.edge, calc(halfSize)); last.css(anchor.opposite, "0px"); } diff --git a/platform/commonUI/general/src/directives/MCTSplitter.js b/platform/commonUI/general/src/directives/MCTSplitter.js new file mode 100644 index 0000000000..6f87bd8a28 --- /dev/null +++ b/platform/commonUI/general/src/directives/MCTSplitter.js @@ -0,0 +1,85 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define*/ + +define( + [], + function () { + 'use strict'; + + // Pixel width to allocate for the splitter itself + var SPLITTER_TEMPLATE = "
", + OFFSETS_BY_EDGE = { + left: "offsetLeft", + right: "offsetRight", + top: "offsetTop", + bottom: "offsetBottom" + }; + + /** + * Implements `mct-splitter` directive. + * @constructor + */ + function MCTSplitter() { + function link(scope, element, attrs, mctSplitPane) { + var initialPosition; + + scope.splitter = { + // Begin moving this splitter + startMove: function () { + var splitter = element[0]; + initialPosition = splitter[OFFSETS_BY_EDGE[ + mctSplitPane.anchor().edge + ]]; + }, + // Handle user changes to splitter position + move: function (delta) { + var anchor = mctSplitPane.anchor(), + pixelDelta = delta[ + anchor.orientation === "vertical" ? 0 : 1 + ]; + // Update the position of this splitter + mctSplitPane.position(initialPosition + pixelDelta); + } + }; + } + + return { + // Restrict to attributes + restrict: "E", + // Utilize the mct-split-pane controller + require: "^mctSplitPane", + // Expose its controller + link: link, + // Use the template defined above + template: SPLITTER_TEMPLATE, + // Create a new scope to put the splitter into + scope: true + }; + } + + return MCTSplitter; + + } +);