/**
* Sets the required layout for a component to anchor another component or
* be anchored.
*
* @param Component $component
* @access public
*/
public function set_anchor_layout_for($component)
{
// Are we anchoring left or right?
$position = null;
switch ($component->get_anchor_position()) {
case Component::ANCHOR_NONE:
return;
case Component::ANCHOR_LEFT:
$position = 'left';
break;
case Component::ANCHOR_RIGHT:
$position = 'right';
break;
case Component::ANCHOR_AUTO:
// The alignment position is the opposite of the body_orientation
// setting. In the case of centered body orientation, use left alignment.
// This behaviour was chosen by design.
if ('left' == $this->get_setting('body_orientation')) {
$position = 'right';
} else {
$position = 'left';
}
break;
}
$layout_name = "anchor-layout-{$position}";
if (!$this->layout_exists($layout_name)) {
// Cache settings
$alignment_offset = $this->get_setting('alignment_offset');
$body_column_span = $this->get_setting('body_column_span');
$layout_columns = $this->get_setting('layout_columns');
// Find out the starting column. This is easy enough if we are anchoring
// left, but for right side alignment, we have to make some math :)
$col_start = 0;
if ('right' == $position) {
if ($component->is_anchor_target()) {
$col_start = $layout_columns - $body_column_span + $alignment_offset;
} else {
$col_start = $body_column_span - $alignment_offset;
}
}
// Find the column span. For the target element, let's use the same
// column span as the Body component, that is, 5 columns, minus the
// defined offset. The element to be anchored uses the remaining space.
$col_span = 0;
if ($component->is_anchor_target()) {
$col_span = $body_column_span - $alignment_offset;
} else {
$col_span = $layout_columns - $body_column_span + $alignment_offset;
}
// Finally, register the layout
$this->register_layout($layout_name, array('columnStart' => $col_start, 'columnSpan' => $col_span));
}
$component->set_json('layout', $layout_name);
// TODO: Use an animation manager
$component->set_json('animation', array('type' => 'fade_in', 'userControllable' => true, 'initialAlpha' => 0.0));
}