"""
Command line layout definitions
-------------------------------

The layout of a command line interface is defined by a Container instance.
There are two main groups of classes here. Containers and controls:

- A container can contain other containers or controls, it can have multiple
  children and it decides about the dimensions.
- A control is responsible for rendering the actual content to a screen.
  A control can propose some dimensions, but it's the container who decides
  about the dimensions -- or when the control consumes more space -- which part
  of the control will be visible.


Container classes::

    - Container (Abstract base class)
       |- HSplit (Horizontal split)
       |- VSplit (Vertical split)
       |- FloatContainer (Container which can also contain menus and other floats)
       `- Window (Container which contains one actual control

Control classes::

    - UIControl (Abstract base class)
       |- FormattedTextControl (Renders formatted text, or a simple list of text fragments)
       `- BufferControl (Renders an input buffer.)


Usually, you end up wrapping every control inside a `Window` object, because
that's the only way to render it in a layout.

There are some prepared toolbars which are ready to use::

- SystemToolbar (Shows the 'system' input buffer, for entering system commands.)
- ArgToolbar (Shows the input 'arg', for repetition of input commands.)
- SearchToolbar (Shows the 'search' input buffer, for incremental search.)
- CompletionsToolbar (Shows the completions of the current buffer.)
- ValidationToolbar (Shows validation errors of the current buffer.)

And one prepared menu:

- CompletionsMenu

"""
from __future__ import unicode_literals

from .containers import (
    ColorColumn,
    ConditionalContainer,
    Container,
    DynamicContainer,
    Float,
    FloatContainer,
    HorizontalAlign,
    HSplit,
    ScrollOffsets,
    VerticalAlign,
    VSplit,
    Window,
    WindowAlign,
    WindowRenderInfo,
    is_container,
    to_container,
    to_window,
)
from .controls import (
    BufferControl,
    DummyControl,
    FormattedTextControl,
    SearchBufferControl,
    UIContent,
    UIControl,
)
from .dimension import (
    D,
    Dimension,
    is_dimension,
    max_layout_dimensions,
    sum_layout_dimensions,
    to_dimension,
)
from .layout import InvalidLayoutError, Layout, walk
from .margins import (
    ConditionalMargin,
    Margin,
    NumberedMargin,
    PromptMargin,
    ScrollbarMargin,
)
from .menus import CompletionsMenu, MultiColumnCompletionsMenu

__all__ = [
    # Layout.
    'Layout',
    'InvalidLayoutError',
    'walk',

    # Dimensions.
    'Dimension',
    'D',
    'sum_layout_dimensions',
    'max_layout_dimensions',
    'to_dimension',
    'is_dimension',

    # Containers.
    'Container',
    'HorizontalAlign',
    'VerticalAlign',
    'HSplit',
    'VSplit',
    'FloatContainer',
    'Float',
    'WindowAlign',
    'Window',
    'WindowRenderInfo',
    'ConditionalContainer',
    'ScrollOffsets',
    'ColorColumn',
    'to_container',
    'to_window',
    'is_container',
    'DynamicContainer',

    # Controls.
    'BufferControl',
    'SearchBufferControl',
    'DummyControl',
    'FormattedTextControl',
    'UIControl',
    'UIContent',

    # Margins.
    'Margin',
    'NumberedMargin',
    'ScrollbarMargin',
    'ConditionalMargin',
    'PromptMargin',

    # Menus.
    'CompletionsMenu',
    'MultiColumnCompletionsMenu',
]
