#include <stdlib.h>
#include <cstring>
#include "libui/ui.h"

using namespace std;

static uiWindow *mainwin;

static int onClosing(uiWindow *w, void *data)
{
  uiControlDestroy(uiControl(mainwin));
  uiQuit();
  return 0;
}

static int shouldQuit(void *data)
{
  uiControlDestroy(uiControl(mainwin));
  return 1;
}

static void openClicked(uiMenuItem *item, uiWindow *w, void *data)
{
  char *filename;

  filename = uiOpenFile(mainwin);
  if (filename == NULL) {
    uiMsgBoxError(mainwin, "No file selected", "Don't be alarmed!");
    return;
  }
  uiMsgBox(mainwin, "File selected", filename);
  uiFreeText(filename);
}

static void saveClicked(uiMenuItem *item, uiWindow *w, void *data)
{
  char *filename;

  filename = uiSaveFile(mainwin);
  if (filename == NULL) {
    uiMsgBoxError(mainwin, "No file selected", "Don't be alarmed!");
    return;
  }
  uiMsgBox(mainwin, "File selected (don't worry, it's still there)", filename);
  uiFreeText(filename);
}

static uiSpinbox *spinbox;
static uiSlider *slider;
static uiProgressBar *progressbar;

static void update(intmax_t value)
{
  uiSpinboxSetValue(spinbox, value);
  uiSliderSetValue(slider, value);
  uiProgressBarSetValue(progressbar, value);
}

static void onSpinboxChanged(uiSpinbox *s, void *data)
{
  update(uiSpinboxValue(spinbox));
}

static void onSliderChanged(uiSlider *s, void *data)
{
  update(uiSliderValue(slider));
}

int callthis(void)
{
  uiInitOptions o;
  const char *err;
  uiMenu *menu;
  uiMenuItem *item;
  uiBox *box;
  uiBox *hbox;
  uiGroup *group;
  uiBox *inner;
  uiBox *inner2;
  uiEntry *entry;
  uiCombobox *cbox;
  uiRadioButtons *rb;
  uiTab *tab;

  memset(&o, 0, sizeof (uiInitOptions));
  err = uiInit(&o);
  if (err != NULL) {
    fprintf(stderr, "error initializing ui: %s\n", err);
    uiFreeInitError(err);
    return 1;
  }

  menu = uiNewMenu("File");
  item = uiMenuAppendItem(menu, "Open");
  uiMenuItemOnClicked(item, openClicked, NULL);
  item = uiMenuAppendItem(menu, "Save");
  uiMenuItemOnClicked(item, saveClicked, NULL);
  item = uiMenuAppendQuitItem(menu);
  uiOnShouldQuit(shouldQuit, NULL);

  menu = uiNewMenu("Edit");
  item = uiMenuAppendCheckItem(menu, "Checkable Item");
  uiMenuAppendSeparator(menu);
  item = uiMenuAppendItem(menu, "Disabled Item");
  uiMenuItemDisable(item);
  item = uiMenuAppendPreferencesItem(menu);

  menu = uiNewMenu("Help");
  item = uiMenuAppendItem(menu, "Help");
  item = uiMenuAppendAboutItem(menu);

  mainwin = uiNewWindow("libui Control Gallery", 640, 480, 1);
  uiWindowSetMargined(mainwin, 1);
  uiWindowOnClosing(mainwin, onClosing, NULL);

  box = uiNewVerticalBox();
  uiBoxSetPadded(box, 1);
  uiWindowSetChild(mainwin, uiControl(box));

  hbox = uiNewHorizontalBox();
  uiBoxSetPadded(hbox, 1);
  uiBoxAppend(box, uiControl(hbox), 1);

  group = uiNewGroup("Basic Controls");
  uiGroupSetMargined(group, 1);
  uiBoxAppend(hbox, uiControl(group), 0);

  inner = uiNewVerticalBox();
  uiBoxSetPadded(inner, 1);
  uiGroupSetChild(group, uiControl(inner));

  uiBoxAppend(inner,
    uiControl(uiNewButton("Button")),
    0);
  uiBoxAppend(inner,
    uiControl(uiNewCheckbox("Checkbox")),
    0);
  entry = uiNewEntry();
  uiEntrySetText(entry, "Entry");
  uiBoxAppend(inner,
    uiControl(entry),
    0);
  uiBoxAppend(inner,
    uiControl(uiNewLabel("Label")),
    0);

  uiBoxAppend(inner,
    uiControl(uiNewHorizontalSeparator()),
    0);

  uiBoxAppend(inner,
    uiControl(uiNewDatePicker()),
    0);
  uiBoxAppend(inner,
    uiControl(uiNewTimePicker()),
    0);
  uiBoxAppend(inner,
    uiControl(uiNewDateTimePicker()),
    0);

  uiBoxAppend(inner,
    uiControl(uiNewFontButton()),
    0);

  uiBoxAppend(inner,
    uiControl(uiNewColorButton()),
    0);

  inner2 = uiNewVerticalBox();
  uiBoxSetPadded(inner2, 1);
  uiBoxAppend(hbox, uiControl(inner2), 1);

  group = uiNewGroup("Numbers");
  uiGroupSetMargined(group, 1);
  uiBoxAppend(inner2, uiControl(group), 0);

  inner = uiNewVerticalBox();
  uiBoxSetPadded(inner, 1);
  uiGroupSetChild(group, uiControl(inner));

  spinbox = uiNewSpinbox(0, 100);
  uiSpinboxOnChanged(spinbox, onSpinboxChanged, NULL);
  uiBoxAppend(inner, uiControl(spinbox), 0);

  slider = uiNewSlider(0, 100);
  uiSliderOnChanged(slider, onSliderChanged, NULL);
  uiBoxAppend(inner, uiControl(slider), 0);

  progressbar = uiNewProgressBar();
  uiBoxAppend(inner, uiControl(progressbar), 0);

  group = uiNewGroup("Lists");
  uiGroupSetMargined(group, 1);
  uiBoxAppend(inner2, uiControl(group), 0);

  inner = uiNewVerticalBox();
  uiBoxSetPadded(inner, 1);
  uiGroupSetChild(group, uiControl(inner));

  cbox = uiNewCombobox();
  uiComboboxAppend(cbox, "Combobox Item 1");
  uiComboboxAppend(cbox, "Combobox Item 2");
  uiComboboxAppend(cbox, "Combobox Item 3");
  uiBoxAppend(inner, uiControl(cbox), 0);

  cbox = uiNewEditableCombobox();
  uiComboboxAppend(cbox, "Editable Item 1");
  uiComboboxAppend(cbox, "Editable Item 2");
  uiComboboxAppend(cbox, "Editable Item 3");
  uiBoxAppend(inner, uiControl(cbox), 0);

  rb = uiNewRadioButtons();
  uiRadioButtonsAppend(rb, "Radio Button 1");
  uiRadioButtonsAppend(rb, "Radio Button 2");
  uiRadioButtonsAppend(rb, "Radio Button 3");
  uiBoxAppend(inner, uiControl(rb), 1);

  tab = uiNewTab();
  uiTabAppend(tab, "Page 1", uiControl(uiNewHorizontalBox()));
  uiTabAppend(tab, "Page 2", uiControl(uiNewHorizontalBox()));
  uiTabAppend(tab, "Page 3", uiControl(uiNewHorizontalBox()));
  uiBoxAppend(inner2, uiControl(tab), 1);

  uiControlShow(uiControl(mainwin));
  uiMain();
  uiUninit();
  return 0;
}
