/*
* Copyright 2015 Anyware Services
*
* 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.
*/
/**
* @private
* Ovverride Ext.resizer.SplitterTracker to make it works as a resizer for the #collapseTarget
*/
Ext.define("Ametys.ui.tool.layout.ZonedTabsToolsLayout.FloatingSplitterTracker",
{
extend: "Ext.resizer.SplitterTracker",
// ensure the tracker is enabled, store boxes of previous and next
// components and calculate the constrain region
onBeforeStart: function(e)
{
var me = this,
collapseTarget = me.getSplitter().collapseTarget,
target = e.getTarget(),
box;
if (!collapseTarget)
{
return false;
}
if (collapseTarget && target === collapseTarget.dom)
{
return false;
}
// SplitterTracker is disabled if any of its adjacents are collapsed.
if (collapseTarget.collapsed)
{
return false;
}
// store boxes of previous and next
me.collapseTargetBox = collapseTarget.getBox();
me.constrainTo = box = me.calculateConstrainRegion();
if (!box)
{
return false;
}
return box;
},
onStart: function()
{
this.callParent(arguments);
var splitter = this.getSplitter();
this.splitterGhost = Ext.create(splitter.self.$className, Ext.applyIf({ floating: true }, splitter.getInitialConfig()));
this.splitterGhost.collapseTarget = splitter.collapseTarget;
this.splitterGhost.setSize(splitter.getSize());
this.splitterGhost.showAt(splitter.getX(), splitter.getY());
},
onDrag: function(e)
{
var me = this,
offset = me.getOffset('dragTarget'),
splitter = me.getSplitter(),
splitEl = splitter.getEl(),
orient = splitter.orientation;
if (orient === "vertical")
{
this.splitterGhost.setX(me.startRegion.left + offset[0]);
}
else
{
this.splitterGhost.setY(me.startRegion.top + offset[1]);
}
},
onEnd: function(e)
{
this.callParent(arguments);
this.splitterGhost.destroy();
this.splitterGhost = null;
},
// calculate the constrain Region in which the splitter el may be moved.
calculateConstrainRegion: function()
{
var me = this,
splitter = me.getSplitter(),
splitWidth = splitter.getWidth(),
zoneTabsToolPanel = splitter.ownerCt.collapseDirection ? splitter.ownerCt : splitter.ownerCt.ownerCt,
defaultMin = splitter.defaultSplitMin,
orient = splitter.orientation,
collapseTargetBox = me.collapseTargetBox,
collapseTarget = me.collapseTarget,
collapseTargetConstrainRegion, constrainOptions;
// vertical splitters, so resizing left to right
if (orient === 'horizontal')
{
var zoneHeight = zoneTabsToolPanel.ownerCt.getEl().findParent(".x-container-tool-layout", null, true).getHeight();
if (splitter.renderData.collapseDir == 'bottom')
{
collapseTargetConstrainRegion = new Ext.util.Region(
collapseTargetBox.y + splitter.collapseTarget.ownerCt._originialMinSize,
collapseTargetBox.right,
collapseTargetBox.y + (splitter.collapseTarget.ownerCt._originialMaxSize ? splitter.collapseTarget.ownerCt._originialMaxSize : zoneHeight * 2/3),
collapseTargetBox.left
);
}
else
{
collapseTargetConstrainRegion = new Ext.util.Region(
collapseTargetBox.bottom - (splitter.collapseTarget.ownerCt._originialMaxSize ? splitter.collapseTarget.ownerCt._originialMaxSize : zoneHeight * 2/3),
collapseTargetBox.right,
collapseTargetBox.bottom - splitter.collapseTarget.ownerCt._originialMinSize,
collapseTargetBox.left
);
}
}
else
{
var zoneWidth = zoneTabsToolPanel.ownerCt.getEl().findParent(".x-container-tool-layout", null, true).getWidth();
if (splitter.renderData.collapseDir == 'right')
{
collapseTargetConstrainRegion = new Ext.util.Region(
collapseTargetBox.top,
collapseTargetBox.x + (splitter.collapseTarget.ownerCt._originialMaxSize ? splitter.collapseTarget.ownerCt._originialMaxSize : zoneWidth * 2/3),
collapseTargetBox.bottom,
collapseTargetBox.x + splitter.collapseTarget.ownerCt._originialMinSize
);
}
else
{
collapseTargetConstrainRegion = new Ext.util.Region(
collapseTargetBox.top,
collapseTargetBox.right - splitter.collapseTarget.ownerCt._originialMinSize,
collapseTargetBox.bottom,
collapseTargetBox.right - (splitter.collapseTarget.ownerCt._originialMaxSize ? splitter.collapseTarget.ownerCt._originialMaxSize : zoneWidth * 2/3)
);
}
}
return collapseTargetConstrainRegion;
},
// Performs the actual resizing of the previous and next components
performResize: function(e, offset)
{
var me = this,
splitter = me.getSplitter(),
orient = splitter.orientation,
zoneTabsToolPanel = splitter.ownerCt.collapseDirection ? splitter.ownerCt : splitter.ownerCt.ownerCt,
vertical = orient === 'vertical',
dimension = vertical ? 'width' : 'height',
position = vertical ? 'x' : 'y';
var value = vertical ? offset[0] : offset[1];
var revert = zoneTabsToolPanel.collapseDirection == "bottom" || zoneTabsToolPanel.collapseDirection == "right";
if (revert)
{
value = -value;
}
ratio = (splitter.collapseTarget[dimension] + value) / splitter.collapseTarget[dimension];
splitter.collapseTarget[dimension] += value;
splitter.collapseTarget.ownerCt._originalFlex *= ratio;
zoneTabsToolPanel.updateLayout();
if (revert)
{
zoneTabsToolPanel.alignTo(zoneTabsToolPanel.ownerCt, "br-br");
}
}
}
);