/**
 * This mixin is applied to panels that want to manage a Pin state and corresponding tool.
 */
Ext.define('Ext.panel.Pinnable', {
    extend: 'Ext.Mixin',

    mixinId: 'pinnable',

    pinnable: true,

    pinnedTip: 'Unpin this item',

    unpinnedTip: 'Pin this item',

    initPinnable: function() {
        var me = this,
            pinned = me.isPinned();

        me.addTool(me.pinTool = Ext.widget({
            xtype: 'tool',
            type: pinned ? 'unpin' : 'pin',
            callback: 'togglePin',
            scope: me,
            tooltip: pinned ? me.pinnedTip : me.unpinnedTip
        }));
    },

    isPinned: function() {
        return !this.floating;
    },

    setPinned: function(pinned) {
        var me = this,
            args;

        if (pinned !== me.isPinned()) {
            args = [me, pinned];

            if (me.fireEventArgs('beforepinchange', args) !== false) {
                me.updatePinned(pinned);
                me.fireEventArgs('pinchange', args);
            }
        }
    },

    togglePin: function() {
        this.setPinned(!this.isPinned());
    },

    updatePinned: function(pinned) {
        var me = this,
            tool = me.pinTool;

        tool.setTooltip(pinned ? me.pinnedTip : me.unpinnedTip);
        tool.setType(pinned ? 'unpin' : 'pin');
    }
});