% Copyright 2018 by Till Tantau
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Public License.
%
% See the file doc/generic/pgf/licenses/LICENSE for more details.

\ProvidesFileRCS{pgflibrarydatavisualization.barcharts.code.tex}

\usepgfmodule{datavisualization}%


%
% This file defines additional data visualization classes.
%


\pgfooclass{candle stick visualizer}
{%
  \attribute attribute;%
  \attribute offset;%
  \attribute use path rise=\pgfsetfillcolor{white}\pgfusepath{fill,stroke};%
  \attribute use path fall=\pgfsetfillcolor{black}\pgfusepath{fill,stroke};%
  \attribute use path wick=\pgfusepath{stroke};%

  \method candle stick visualizer(#1) {
    \pgfooeset{attribute}{#1}
    \pgfoothis.set stick width(4pt)
  }%

  \method default connects() {
    \pgfoothis.get handle(\pgf@dv@me)
    \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,visualize,visualize datapoint signal)
  }%

  \method set stick width(#1) {
    \pgfmathparse{#1}
    \pgfmathdivide{\pgfmathresult}{2}
    \let\pgf@dv@lib@w=\pgfmathresult
    % Compute the normalized vector:
    \pgfkeyssetvalue{/data point/\pgfoovalueof{attribute}}{1}
    \pgfcanvaspositionofdatapoint%
    \pgfsettocanvasposition\pgf@dv@lib@lower%
    \pgfkeyssetvalue{/data point/\pgfoovalueof{attribute}}{10}
    \pgfcanvaspositionofdatapoint%
    \pgfsettocanvasposition\pgf@dv@lib@upper%
    \pgf@process{\pgfpointnormalised{\pgfpointdiff{\pgf@dv@lib@upper}{\pgf@dv@lib@lower}}}%
    % Rotate by 90 degrees
    \pgf@xa=\pgf@x%
    \pgf@x=-\pgf@dv@lib@w\pgf@y%
    \pgf@y=\pgf@dv@lib@w\pgf@xa%
    \edef\pgf@dv@lib@temp{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
    \pgfoolet{offset}\pgf@dv@lib@temp
  }%

  \method set use path rise(#1) {
    \pgfooset{use path rise}{#1}
  }%

  \method set use path fall(#1) {
    \pgfooset{use path fall}{#1}
  }%

  \method visualize() {
    {
      \pgfooget{attribute}\pgf@lib@attribute%
      \pgfkeysgetvalue{/data point/\pgf@lib@attribute/low}\pgf@lib@low
      \pgfkeysgetvalue{/data point/\pgf@lib@attribute/high}\pgf@lib@high
      \pgfkeysgetvalue{/data point/\pgf@lib@attribute/entry}\pgf@lib@entry
      \pgfkeysgetvalue{/data point/\pgf@lib@attribute/exit}\pgf@lib@exit
      \ifx\pgf@lib@low\pgfutil@empty\pgf@dv@lib@cs@skiptrue\fi
      \ifx\pgf@lib@low\relax\pgf@dv@lib@cs@skiptrue\fi
      \ifx\pgf@lib@high\pgfutil@empty\pgf@dv@lib@cs@skiptrue\fi
      \ifx\pgf@lib@high\relax\pgf@dv@lib@cs@skiptrue\fi
      \ifx\pgf@lib@entry\pgfutil@empty\pgf@dv@lib@cs@skiptrue\fi
      \ifx\pgf@lib@entry\relax\pgf@dv@lib@cs@skiptrue\fi
      \ifx\pgf@lib@exit\pgfutil@empty\pgf@dv@lib@cs@skiptrue\fi
      \ifx\pgf@lib@exit\relax\pgf@dv@lib@cs@skiptrue\fi
      \ifpgf@dv@lib@cs@skip%
      \else%
        \begin{pgfscope}
          % Ok, compute low point
          \pgfkeyssetvalue{/data point/\pgf@lib@attribute}\pgf@lib@low
          \pgfcanvaspositionofdatapoint%
          \pgfsettocanvasposition\pgf@dv@lib@lowpoint%
          % Ok, compute high point
          \pgfkeyssetvalue{/data point/\pgf@lib@attribute}\pgf@lib@high
          \pgfcanvaspositionofdatapoint%
          \pgfsettocanvasposition\pgf@dv@lib@highpoint%
          % Compute entry and exit
          \pgfkeyssetvalue{/data point/\pgf@lib@attribute}\pgf@lib@entry
          \pgfcanvaspositionofdatapoint%
          \pgfsettocanvasposition\pgf@dv@lib@entrypoint%
          \pgfkeyssetvalue{/data point/\pgf@lib@attribute}\pgf@lib@exit
          \pgfcanvaspositionofdatapoint%
          \pgfsettocanvasposition\pgf@dv@lib@exitpoint%
          \ifdim\pgf@lib@entry pt<\pgf@lib@exit pt\relax%
            \pgf@dv@lib@risetrue%
          \fi%
          \ifpgf@dv@lib@rise
            \let\pgf@dv@lib@a=\pgf@dv@lib@entrypoint
            \let\pgf@dv@lib@b=\pgf@dv@lib@exitpoint
          \else
            \let\pgf@dv@lib@a=\pgf@dv@lib@exitpoint
            \let\pgf@dv@lib@b=\pgf@dv@lib@entrypoint
          \fi
          % Start drawing...
          \pgfpathmoveto{\pgf@dv@lib@lowpoint}
          \pgfpathlineto{\pgf@dv@lib@a}
          \pgfpathmoveto{\pgf@dv@lib@highpoint}
          \pgfpathlineto{\pgf@dv@lib@b}
          \pgfoovalueof{use path wick}
          \pgfpathmoveto{\pgfpointadd{\pgf@dv@lib@a}{\pgfoovalueof{offset}}}
          \pgfpathlineto{\pgfpointadd{\pgf@dv@lib@b}{\pgfoovalueof{offset}}}
          \pgfpathlineto{\pgfpointadd{\pgf@dv@lib@b}{\pgfpointscale{-1}{\pgfoovalueof{offset}}}}
          \pgfpathlineto{\pgfpointadd{\pgf@dv@lib@a}{\pgfpointscale{-1}{\pgfoovalueof{offset}}}}
          \pgfpathclose
          \ifpgf@dv@lib@rise
            \pgfoovalueof{use path rise}
          \else
            \pgfoovalueof{use path fall}
          \fi
        \end{pgfscope}%
      \fi
    }
  }%

  \newif\ifpgf@dv@lib@cs@skip
  \newif\ifpgf@dv@lib@rise
}%


\endinput
