-- Copyright 2012 by Till Tantau
--
-- This file may be distributed an/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 information

-- @release $Header$


local declare       = require "pgf.gd.interface.InterfaceToAlgorithms".declare

local Coordinate    = require "pgf.gd.model.Coordinate"
local lib           = require "pgf.gd.lib"

---
-- @section subsection {Fine-Tuning Positions of Nodes}
--
-- @end



---
declare {
  key = "nudge",
  type = "canvas coordinate",

  summary = [["
    This option allows you to slightly ``nudge'' (move) nodes after
    they have been positioned by the given offset. The idea is that
    this nudging is done after the position of the node has been
    computed, so nudging  has no influence on the actual graph
    drawing algorithms. This, in turn, means that you can use
    nudging to ``correct'' or ``optimize'' the positioning of nodes
    after the algorithm has computed something.
  "]],

  examples = {{
    options = [["
      preamble={
        \usetikzlibrary{graphs,graphdrawing}
        \usegdlibrary{layered}
      },
    "]],
    code = [["
      \tikz \graph [edges=rounded corners, nodes=draw,
                    layered layout, sibling distance=0] {
        a -- {b, c, d[nudge=(up:2mm)]} -- e -- a;
      };
    "]]
  }}
}


---
-- @param distance A distance by which the node is nudges.

declare {
  key = "nudge up",
  type = "length",
  use = {
    { key = "nudge", value = function (v) return Coordinate.new(0,v) end }
  },

  summary = "A shorthand for nudging a node upwards.",
  examples = {{
    options = [["
      preamble={
        \usetikzlibrary{graphs,graphdrawing}
        \usegdlibrary{layered}
      },
    "]],
    code = [["
      \tikz \graph [edges=rounded corners, nodes=draw,
                    layered layout, sibling distance=0] {
        a -- {b, c, d[nudge up=2mm]} -- e -- a;
      };
    "]]
  }}
}


---
-- @param distance A distance by which the node is nudges.

declare {
  key = "nudge down",
  type = "length",
  use = {
    { key = "nudge", value = function (v) return Coordinate.new(0,-v) end }
  },

  summary = "Like |nudge up|, but downwards."
}

---
-- @param distance A distance by which the node is nudges.

declare {
  key = "nudge left",
  type = "length",
  use = {
    { key = "nudge", value = function (v) return Coordinate.new(-v,0) end }
  },

  summary = "Like |nudge up|, but left.",
  examples = {{
    options = [["
      preamble={
        \usetikzlibrary{graphs,graphdrawing}
        \usegdlibrary{layered}
      },
    "]],
    code = [["
      \tikz \graph [edges=rounded corners, nodes=draw,
                    layered layout, sibling distance=0] {
        a -- {b, c, d[nudge left=2mm]} -- e -- a;
      };
    "]]
  }}
}

---
-- @param distance A distance by which the node is nudges.

declare {
  key = "nudge right",
  type = "length",
  use = {
    { key = "nudge", value = function (v) return Coordinate.new(v,0) end }
  },

  summary = "Like |nudge left|, but right."
}


---
declare {
  key = "regardless at",
  type = "canvas coordinate",

  summary = [["
    Using this option you can provide a position for a node to wish
    it will be forced after the graph algorithms have run. So, the node
    is positioned normally and the graph drawing algorithm does not know
    about the position specified using |regardless at|. However,
    afterwards, the node is placed there, regardless of what the
    algorithm has computed (all other nodes are unaffected).
  "]],
  examples = {{
    options = [["
      preamble={
        \usetikzlibrary{graphs,graphdrawing}
        \usegdlibrary{layered}
      },
    "]],
    code = [["
      \tikz \graph [edges=rounded corners, nodes=draw,
                    layered layout, sibling distance=0] {
        a -- {b,c,d[regardless at={(1,0)}]} -- e -- a;
      };
    "]]
  }}
}




---
-- @param pos A canvas position (a coordinate).

declare {
  key = "nail at",
  type = "canvas coordinate",
  use = {
    { key = "desired at", value = lib.id },
    { key = "regardless at", value = lib.id },
  },

  summary = [["
    This option combines |desired at| and |regardless at|. Thus, the
    algorithm is ``told'' about the desired position. If it fails to place
    the node at the desired position, it will be put there
    regardless. The name of the key is intended to remind one of a node
    being ``nailed'' to the canvas.
  "]],
  examples = {{
    options = [["
      preamble={
        \usetikzlibrary{graphs,graphdrawing}
        \usegdlibrary{layered}
      },
    "]],
    code = [["
      \tikz \graph [edges=rounded corners, nodes=draw,
                    layered layout, sibling distance=0] {
        a -- {b,c,d[nail at={(1,0)}]} -- e[nail at={(1.5,-1)}] -- a;
      };
    "]]
  }}
}

