#' @param range An optional meta argument to handle the different input types.
#'  If the `range` argument is missing, all the relevant information to
#'  create the object has to be provided as individual function arguments
#'  (see below).
#' The different input options for `range` are:
#'  * A `GRanges` object: the genomic ranges for the
#' `Annotation` track as well as the optional additional metadata columns
#' `feature`, `group` and `id` (see description of the
#' individual function parameters below for details). Calling the constructor
#' on a `GRanges` object without further arguments, e.g.
#' `AnnotationTrack(range=obj)` is equivalent to calling the coerce method
#' `as(obj, "AnnotationTrack")`.
#' * A `GRangesList` object: this is very similar to the previous
#' case, except that the grouping information that is part of the list
#' structure is preserved in the `AnnotationTrack`. I.e., all the elements
#' within one list item receive the same group id. For consistency, there is
#' also a coercion method from `GRangesLists` `as(obj,"AnnotationTrack")`.
#' * An \code{\linkS4class{IRanges}} object: almost identical to the
#' `GRanges` case, except that the chromosome and strand information as
#' well as all additional metadata has to be provided in the separate
#' `chromosome`, `strand`, `feature`, `group` or `id`
#' arguments, because it can not be directly encoded in an `IRange`
#' object. Note that none of those inputs are mandatory, and if not provided
#' explicitly the more or less reasonable default values `chromosome=NA`
#' and `strand="*"` are used.
#' * A `data.frame` object: the `data.frame` needs to contain
#' at least the two mandatory columns `start` and `end` with the
#' range coordinates. It may also contain a `chromosome` and a
#' `strand` column with the chromosome and strand information for each
#' range. If missing it will be drawn from the separate `chromosome` or
#' `strand` arguments. In addition, the `feature`, `group` and
#' `id` data can be provided as additional columns. The above comments
#' about potential default values also apply here.
#' * A `character` scalar: in this case the value of the
#' `range` argument is considered to be a file path to an annotation file
#' on disk. A range of file types are supported by the `Gviz` package as
#' identified by the file extension. See the `importFunction`
#' documentation below for further details.
#' @param start,end,width Integer vectors, giving the start and the end end
#' coordinates for the individual track items, or their width. Two of the three
#' need to be specified, and have to be of equal length or of length one, in
#' which case this single value will be recycled. Otherwise, the usual R
#' recycling rules for vectors do not apply here.
#' @param feature Factor (or other vector that can be coerced into one), giving
#' the feature types for the individual track items. When plotting the track to
#' the device, if a display parameter with the same name as the value of
#' `feature` is set, this will be used as the track item's fill colour. See
#' `grouping` for details.  Needs to be of equal length as the
#' provided genomic coordinates, or of length 1.
#' @param group Factor (or other vector that can be coerced into one), giving
#' the group memberships for the individual track items. When plotting to the
#' device, all items in the same group will be connected.  See
#' `grouping` for details. Needs to be of equal length as the
#' provided genomic coordinates, or of length 1.
#' @param id Character vector of track item identifiers. When plotting to the
#' device, it's value will be used as the identifier tag if the display
#' parameter `showFeatureId=TRUE`. Needs to be of equal length as the
#' provided genomic ranges, or of length 1.
#' @param strand Character vector, the strand information for the individual
#' track items. It may be provided in the form `+` for the Watson strand,
#' `-` for the Crick strand or `*` for either one of the two. Needs
#' to be of equal length as the provided genomic coordinates, or of length 1.
#' Please note that grouped items need to be on the same strand, and erroneous
#' entries will result in casting of an error.
#' @param chromosome The chromosome on which the track's genomic ranges are
#' defined. A valid UCSC chromosome identifier if
#' \code{options(ucscChromosomeNames=TRUE)}. Please note that in this case only
#' syntactic checking takes place, i.e., the argument value needs to be an
#' integer, numeric character or a character of the form `chrx`, where
#' `x` may be any possible string. The user has to make sure that the
#' respective chromosome is indeed defined for the the track's genome. If not
#' provided here, the constructor will try to construct the chromosome
#' information based on the available inputs, and as a last resort will fall
#' back to the value `chrNA`. Please note that by definition all objects
#' in the `Gviz` package can only have a single active chromosome at a
#' time (although internally the information for more than one chromosome may
#' be present), and the user has to call the `chromosome<-` replacement
#' method in order to change to a different active chromosome.
#' @param genome The genome on which the track's ranges are defined. Usually
#' this is a valid UCSC genome identifier, however this is not being formally
#' checked at this point. If not provided here the constructor will try to
#' extract this information from the provided input, and eventually will fall
#' back to the default value of `NA`.
#' @param stacking The stacking type for overlapping items of the track. One in
#' `c(hide, dense, squish, pack,full)`. Currently, only squish (make best
#' use of the available space), dense (no stacking, collapse overlapping
#' ranges), and hide (do not show any track items at all) are implemented.
#' @param name Character scalar of the track's name used in the title panel
#' when plotting.
#' @param fun A function that is being called for each entry in the
#' `AnnotationTrack` object. See section 'Details' and 'Examples' for
#' further information. When called internally by the plotting machinery, a
#' number of arguments are automatically passed on to this function, and the
#' user needs to make sure that they can all be digested (i.e., either have all
#' of them as formal named function arguments, or gobble up everything that is
#' not needed in `...`). These arguments are:
#' * `start`: the genomic start coordinate of the range item.
#' * `end`: the genomic end coordinates of the range item.
#' * `strand`: the strand information for the range item.
#' * `chromosome`: the chromosome of the range item.
#' * `identifier`: the identifier of the range item, i.e., the result
#' of calling `identifier(DetailsAnnotationTrack, lowest=TRUE)`. Typically
#' those identifiers are passed on to the object constructor during
#' instantiation as the `id` argument.
#' * `index`: a counter enumerating the ranges. The `AnnotationTrack` object
#' is sorted internally for visibility, and the `index` argument refers to
#' the index of plotting.
#' * `GdObject`: a reference to the currently plotted `DetailsAnnotationTrack`
#' object.
#' * `GdObject.original`: a reference to the `DetailsAnnotationTrack` before
#' any processing like item collapsing has taken place. Essentially, this is
#' the track object as it exists in your working environment.
#' Additional arguments can be passed to the plotting function by means of the
#' `detailsFunArgs` argument (see below). Note that the plot must use grid
#' graphics (e.g. function in the 'lattice' package or low-level grid
#' functions). To access a data object such a matrix or data frame within the
#' function you can either store it as a variable in the global environment or,
#' to avoid name space conflicts, you can make it part of the function
#' environment by means of a closure. Alternatively, you may want to
#' explicitely stick it into an environment or pass it along in the
#' `detailsFunArgs` list. To figure out in your custom plotting function
#' which annotation element is currently being plotted you can either use the
#' identifier which has to be unique for each range element, or you may want to
#' use the genomic position (start/end/strand/chromosome) e.g. if the data is
#' stored in a `GRanges` object.
#' @param selectFun A function that is being called for each entry in the
#' `AnnotationTrack` object with exactly the same arguments as in
#' `fun`. The purpose of this function is to decide for each track element
#' whether details should be drawn, and consequently it has to return a single
#' logical scalar. If the return value is `TRUE`, details will be drawn
#' for the item, if it is `FALSE`, the details strip for the item is
#' omitted.
#' @param importFunction A user-defined function to be used to import the data
#' from a file. This only applies when the `range` argument is a character
#' string with the path to the input data file. The function needs to accept an
#' argument `x` containing the file path and has to return a proper
#' `GRanges` object with all the necessary metadata columns set. A set of
#' default import functions is already implemented in the package for a number
#' of different file types, and one of these defaults will be picked
#' automatically based on the extension of the input file name. If the
#' extension can not be mapped to any of the existing import function, an error
#' is raised asking for a user-defined import function via this argument.
#' Currently the following file types can be imported with the default
#' functions: `gff`, `gff1`, `gff2`, `gff3`, `bed`, `bam`.
#' @param stream A logical flag indicating that the user-provided import
#' function can deal with indexed files and knows how to process the additional
#' `selection` argument when accessing the data on disk. This causes the
#' constructor to return a `ReferenceAnnotationTrack` object which will
#' grab the necessary data on the fly during each plotting operation.
#' @param \dots Additional items which will all be interpreted as further
#' display parameters. See [`settings`](settings) and the "Display Parameters"
#' section below for details.