/* $Id: main.c 22725 2006-08-12 16:11:41Z benny $ */
/*-
 * Copyright (c) 2003-2006 Benedikt Meurer <benny@xfce.org>
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *                                                                              
 * This program 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 General Public License for more details.
 *                                                                              
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 * 02111-1307, USA.
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#ifdef HAVE_MEMORY_H
#include <memory.h>
#endif
#include <stdio.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_STRING_H
#include <string.h>
#endif

#include <libxfcegui4/libxfcegui4.h>



#define OPTION_TIPS 0
#define OPTION_FORTUNES 1



static const gchar *titles[] = {
  N_("Tips and Tricks"),
  N_("Fortunes")
};



static GtkWidget *dlg = NULL;
static guint      option = OPTION_TIPS;



static gboolean
autostart_enabled (void)
{
  gboolean enabled = FALSE;
  XfceRc  *rc;

  rc = xfce_rc_config_open (XFCE_RESOURCE_CONFIG, "autostart/xfce4-tips-autostart.desktop", TRUE);
  if (G_LIKELY (rc != NULL))
    {
      xfce_rc_set_group (rc, "Desktop Entry");
      enabled = !xfce_rc_read_bool_entry (rc, "Hidden", TRUE);
      xfce_rc_close (rc);
    }

  return enabled;
}



static void
autostart_toggled (GtkToggleButton *button)
{
  gboolean active = gtk_toggle_button_get_active (button);
  XfceRc  *rc;

  rc = xfce_rc_config_open (XFCE_RESOURCE_CONFIG, "autostart/xfce4-tips-autostart.desktop", FALSE);
  if (G_LIKELY (rc != NULL))
    {
      xfce_rc_set_group (rc, "Desktop Entry");
      xfce_rc_write_bool_entry (rc, "Hidden", !active);
      xfce_rc_close (rc);
    }
}



static void
item_cb (GtkWidget *btn,
         gpointer   data)
{
  option = GPOINTER_TO_UINT(data);
  gtk_window_set_title (GTK_WINDOW (dlg), _(titles[option]));
}



static void
next_cb(GtkWidget *btn, GtkTextBuffer *textbuf)
{
  gchar buffer[1024];
  GtkTextIter start;
  GtkTextIter end;
  FILE *fp;

  /* clear the text buffer */
  gtk_text_buffer_get_bounds(textbuf, &start, &end);
  gtk_text_buffer_delete(textbuf, &start, &end);

  switch (option) {
  case OPTION_TIPS:
    strcpy(buffer, "fortune " TIPSDIR "/tips");
    break;

  case OPTION_FORTUNES:
    strcpy(buffer, "fortune");
    break;
  }

  if ((fp = popen(buffer, "r")) == NULL) {
    perror("Unable to execute fortune");
    return;
  }

  while (fgets(buffer, sizeof(buffer), fp) != NULL) {
    gtk_text_buffer_get_end_iter(textbuf, &end);
    gtk_text_buffer_insert(textbuf, &end, buffer, -1);
  }

  pclose (fp);
}



int
main (int argc, char **argv)
{
  GtkWidget *sw;
  GtkWidget *view;
  GtkWidget *vbox2;
  GtkWidget *check;
  GtkWidget *item;
  GtkWidget *menu;
  GtkWidget *opt;
  GtkWidget *next;
  GtkWidget *close;

  xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
  
  gtk_init (&argc, &argv);

  /* fake a SM client id, so the session manager does not restart us */
  gdk_set_sm_client_id ("FAKED CLIENTID");

  dlg = xfce_titled_dialog_new_with_buttons (_("Tips and Tricks"), NULL,
                                             GTK_DIALOG_NO_SEPARATOR,
                                             NULL);
  gtk_window_set_icon_name (GTK_WINDOW (dlg), "xfce4-logo");
  gtk_window_set_default_size (GTK_WINDOW (dlg), 600, 400);
  gtk_window_set_position (GTK_WINDOW (dlg), GTK_WIN_POS_CENTER);
  gtk_window_stick (GTK_WINDOW (dlg));

  gtk_button_box_set_layout (GTK_BUTTON_BOX (GTK_DIALOG (dlg)->action_area), GTK_BUTTONBOX_EDGE);

  vbox2 = gtk_vbox_new (FALSE, 6);
  gtk_container_set_border_width (GTK_CONTAINER (vbox2), 6);
  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), vbox2, TRUE, TRUE, 0);
  gtk_widget_show (vbox2);

  sw = gtk_scrolled_window_new (NULL, NULL);
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
                                  GTK_POLICY_NEVER,
                                  GTK_POLICY_AUTOMATIC);
  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
  gtk_widget_show (sw);
  gtk_box_pack_start (GTK_BOX (vbox2), sw, TRUE, TRUE, 0);

  view = gtk_text_view_new ();
  gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view), FALSE);
  gtk_text_view_set_editable (GTK_TEXT_VIEW (view), FALSE);
  gtk_widget_show (view);
  gtk_container_add (GTK_CONTAINER (sw), view);

  check = gtk_check_button_new_with_mnemonic (_("Display tips on _startup"));
  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), autostart_enabled ());
  g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (autostart_toggled), NULL);
  gtk_box_pack_start (GTK_BOX (vbox2), check, FALSE, FALSE, 0);
  gtk_widget_show (check);

  menu = gtk_menu_new ();
  gtk_widget_show (menu);
  
  item = gtk_menu_item_new_with_label (_("Tips and tricks"));
  g_signal_connect (item, "activate", G_CALLBACK (item_cb), GUINT_TO_POINTER (OPTION_TIPS));
  g_signal_connect (item, "activate", G_CALLBACK (next_cb), gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)));
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
  gtk_widget_show (item);

  item = gtk_menu_item_new_with_label (_("Fortunes"));
  g_signal_connect (item, "activate", G_CALLBACK (item_cb), GUINT_TO_POINTER (OPTION_FORTUNES));
  g_signal_connect (item, "activate", G_CALLBACK (next_cb), gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)));
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
  gtk_widget_show (item);

  opt = gtk_option_menu_new();
  gtk_option_menu_set_menu(GTK_OPTION_MENU(opt), menu);
  gtk_dialog_add_action_widget (GTK_DIALOG (dlg), opt, GTK_RESPONSE_NONE);
  gtk_widget_show(opt);

  next = gtk_button_new_with_label (_("Next"));
  gtk_dialog_add_action_widget (GTK_DIALOG (dlg), next, GTK_RESPONSE_NONE);
  gtk_widget_show (next);

  close = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
  gtk_dialog_add_action_widget (GTK_DIALOG (dlg), close, GTK_RESPONSE_DELETE_EVENT);
  gtk_widget_show (close);

  g_signal_connect (dlg, "delete-event", G_CALLBACK (gtk_main_quit), NULL);
  g_signal_connect (dlg, "destroy-event", G_CALLBACK (gtk_main_quit), NULL);
  g_signal_connect (close, "clicked", G_CALLBACK (gtk_main_quit), NULL);
  g_signal_connect (next, "clicked", G_CALLBACK (next_cb), gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)));

  next_cb (next, gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)));

  gtk_widget_show (dlg);

  gtk_main ();

  return EXIT_SUCCESS;
}


syntax highlighted by Code2HTML, v. 0.9.1