/* GTK - The GIMP Toolkit
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
 *
 * GtkWrapBox: Wrapping box widget
 * Copyright (C) 1999 Tim Janik
 *
 * This library is free software: you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library.  If not, see
 * <https://www.gnu.org/licenses/>.
 */

#ifndef __GTK_WRAP_BOX_H__
#define __GTK_WRAP_BOX_H__

#include <gtk/gtk.h>

G_BEGIN_DECLS


/* --- type macros --- */
#define GTK_TYPE_WRAP_BOX             (gtk_wrap_box_get_type ())
#define GTK_WRAP_BOX(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_WRAP_BOX, GtkWrapBox))
#define GTK_WRAP_BOX_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_WRAP_BOX, GtkWrapBoxClass))
#define GTK_IS_WRAP_BOX(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_WRAP_BOX))
#define GTK_IS_WRAP_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_WRAP_BOX))
#define GTK_WRAP_BOX_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_WRAP_BOX, GtkWrapBoxClass))


/* --- typedefs --- */
typedef struct _GtkWrapBox      GtkWrapBox;
typedef struct _GtkWrapBoxClass GtkWrapBoxClass;
typedef struct _GtkWrapBoxChild GtkWrapBoxChild;

/* --- GtkWrapBox --- */
struct _GtkWrapBox
{
  GtkContainer     container;

  guint            homogeneous : 1;
  guint            justify : 4;
  guint            line_justify : 4;
  guint8           hspacing;
  guint8           vspacing;
  guint16          n_children;
  GtkWrapBoxChild *children;
  gfloat           aspect_ratio; /* 1/256..256 */
  guint            child_limit;
};
struct _GtkWrapBoxClass
{
  GtkContainerClass parent_class;

  GSList* (*rlist_line_children) (GtkWrapBox       *wbox,
                                  GtkWrapBoxChild **child_p,
                                  GtkAllocation    *area,
                                  guint            *max_child_size,
                                  gboolean         *expand_line);
};
struct _GtkWrapBoxChild
{
  GtkWidget *widget;
  guint      hexpand : 1;
  guint      hfill : 1;
  guint      vexpand : 1;
  guint      vfill : 1;
  guint      wrapped : 1;

  GtkWrapBoxChild *next;
};
#define GTK_JUSTIFY_TOP    GTK_JUSTIFY_LEFT
#define GTK_JUSTIFY_BOTTOM GTK_JUSTIFY_RIGHT


/* --- prototypes --- */
GType           gtk_wrap_box_get_type            (void) G_GNUC_CONST;
void           gtk_wrap_box_set_homogeneous     (GtkWrapBox      *wbox,
                                             gboolean         homogeneous);
void           gtk_wrap_box_set_hspacing        (GtkWrapBox      *wbox,
                                             guint            hspacing);
void           gtk_wrap_box_set_vspacing        (GtkWrapBox      *wbox,
                                             guint            vspacing);
void           gtk_wrap_box_set_justify         (GtkWrapBox      *wbox,
                                             GtkJustification justify);
void           gtk_wrap_box_set_line_justify    (GtkWrapBox      *wbox,
                                             GtkJustification line_justify);
void           gtk_wrap_box_set_aspect_ratio    (GtkWrapBox      *wbox,
                                             gfloat           aspect_ratio);
void           gtk_wrap_box_pack                    (GtkWrapBox      *wbox,
                                             GtkWidget       *child,
                                             gboolean         hexpand,
                                             gboolean         hfill,
                                             gboolean         vexpand,
                                             gboolean         vfill);
void           gtk_wrap_box_pack_wrapped        (GtkWrapBox      *wbox,
                                             GtkWidget       *child,
                                             gboolean         hexpand,
                                             gboolean         hfill,
                                             gboolean         vexpand,
                                             gboolean         vfill,
                                             gboolean         wrapped);
void       gtk_wrap_box_reorder_child       (GtkWrapBox      *wbox,
                                             GtkWidget       *child,
                                             gint             position);
void       gtk_wrap_box_query_child_packing (GtkWrapBox      *wbox,
                                             GtkWidget       *child,
                                             gboolean        *hexpand,
                                             gboolean        *hfill,
                                             gboolean        *vexpand,
                                             gboolean        *vfill,
                                             gboolean        *wrapped);
void       gtk_wrap_box_set_child_packing   (GtkWrapBox      *wbox,
                                             GtkWidget       *child,
                                             gboolean         hexpand,
                                             gboolean         hfill,
                                             gboolean         vexpand,
                                             gboolean         vfill,
                                             gboolean         wrapped);
guint*           gtk_wrap_box_query_line_lengths  (GtkWrapBox             *wbox,
                                             guint           *n_lines);


G_END_DECLS

#endif /* __GTK_WRAP_BOX_H__ */
