toolbar.js 5.95 KB
/*
 * Copyright 2015 Open Networking Laboratory
 *
 * 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.
 */

/*
 ONOS GUI -- Widget -- Toolbar Service
 */
(function () {
    'use strict';

    var $log, fs, ps, bns, is;

    var ids = [],
        defaultSettings = {
            edge: 'left',
            width: 20,
            margin: 0,
            hideMargin: -20,
            top: '80%',
            fade: false,
            shown: false
        },
        settings,
        arrowSize = 10,
        btnPadding = 4,
        tbarId,
        tbarPanel,
        tbarDiv,
        tbarArrowDiv;

    // this function is only used in testing
    function init() {
        ids = [];
    }

    // === Helper functions --------------------------------------

    function validId(id, caller) {
        if (fs.inArray(id, ids) !== -1) {
            $log.warn(caller + ': ID already exists');
            return false;
        }
        return true;
    }

    // TODO: Allow toolbar to be on right edge of screen
    // translate uses 50 because the svg viewbox is 50
    function rotateArrowLeft() {
        tbarArrowDiv.select('g')
            .attr('transform', 'translate(0 50) rotate(-90)');
    }
    function rotateArrowRight() {
        tbarArrowDiv.select('g')
            .attr('transform', 'translate(50 0) rotate(90)');
    }
    function createArrow() {
        tbarArrowDiv = tbarDiv.append('div')
            .classed('tbarArrow', true)
            .style({'position': 'absolute',
                'top': '53%',
                'left': '96%',
                'margin-right': '-4%',
                'transform': 'translate(-50%, -50%)',
                'cursor': 'pointer'});
        is.loadEmbeddedIcon(tbarArrowDiv, 'tableColSortAsc', arrowSize);

        tbarArrowDiv.on('click', toggleTools);
    }

    // === Adding to toolbar functions ----------------------------

    // TODO: these add functions look very similar -- combine them somehow?
    function addButton(id, gid, cb, tooltip) {
        var btnId = tbarId + '-' + id,
            button;
        if (!validId(btnId, 'addButton')) { return null; }
        ids.push(btnId);
        button =  bns.button(tbarDiv, btnId, gid, cb, tooltip);
        if (button) { addToWidth(button.width()); }
        displayTools();
        return button;
    }

    function addToggle(id, gid, initState, cb, tooltip) {
        var togId = tbarId + '-' + id,
            toggle;
        if (!validId(togId, 'addToggle')) { return null; }
        ids.push(togId);
        toggle =  bns.toggle(tbarDiv, togId, gid, initState, cb, tooltip);
        if (toggle) { addToWidth(toggle.width()); }
        displayTools();
        return toggle;
    }

    function addRadioSet(id, rset) {
        var radId = tbarId + '-' + id,
            radios;
        if (!validId(radId, 'addRadioSet')) { return null; }
        ids.push(radId);
        radios = bns.radioSet(tbarDiv, radId, rset);
        if (radios) { addToWidth(radios.width()); }
        displayTools();
        return radios;
    }

    function addSeparator() {
        if (!tbarDiv) {
            $log.warn('Separator cannot append to div');
            return null;
        }
        addToWidth(2);
        displayTools();
        return tbarDiv.append('div')
            .classed('separator', true)
            .style({'height': '23px',
                    'width': '0px'});
    }

    // === Main toolbar API functions ----------------------------

    function createToolbar(id, opts) {
        if (!id) {
            $log.warn('createToolbar: no ID given');
            return null;
        }
        tbarId = 'tbar-' + id;
        settings = angular.extend({}, defaultSettings, fs.isO(opts));

        if (!validId(tbarId, 'createToolbar')) { return null; }
        ids.push(tbarId);

        tbarPanel = ps.createPanel(tbarId, settings);
        tbarDiv = tbarPanel.classed('toolbar', true)
            .style('top', settings.top);

        createArrow();
        displayTools();

        return {
            addButton: addButton,
            addToggle: addToggle,
            addRadioSet: addRadioSet,
            addSeparator: addSeparator,

            show: show,
            hide: hide,
            toggleTools: toggleTools,

            width: width
        }
    }

    function destroyToolbar(id) {
        ps.destroyPanel(id);
        tbarDiv = null;
    }

    function show(cb) {
        tbarPanel.show(cb);
        rotateArrowLeft();
    }

    function hide(cb) {
        tbarPanel.hide(cb);
        rotateArrowRight();
    }

    function toggleTools(cb) {
        if (tbarPanel.isVisible()) { hide(cb); }
        else { show(cb) }
    }

    function displayTools() {
        if (settings.shown) { show(); }
        else { hide(); }
    }

    function width(w) {
        if (w) { tbarPanel.width(w); }
        return tbarPanel.width();
    }

    function addToWidth(size) {
        if (!(settings.width > (fs.windowSize(0, 500).width))) {
            settings.width = width() + size + btnPadding;
            tbarPanel.width(settings.width);
        }
    }

    angular.module('onosWidget')
    .factory('ToolbarService',
        ['$log', 'FnService', 'PanelService', 'ButtonService', 'IconService',

        function (_$log_, _fs_, _ps_, _bns_, _is_) {
            $log = _$log_;
            fs = _fs_;
            ps = _ps_;
            bns = _bns_;
            is = _is_;

            return {
                init: init,
                createToolbar: createToolbar,
                destroyToolbar: destroyToolbar
            };
        }]);
}());