/**
 * 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');
    }
});