/*
 *    HardInfo - Displays System Information
 *    Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org>
 *
 *    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, version 2.
 *
 *    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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
 */
#ifndef __SHELL_H__
#define __SHELL_H__

#include <gtk/gtk.h>

#include "loadgraph.h"
#include "help-viewer.h"

typedef struct _Shell			Shell;
typedef struct _ShellTree		ShellTree;
typedef struct _ShellInfoTree		ShellInfoTree;
typedef struct _ShellNote		ShellNote;
typedef struct _ShellSummary		ShellSummary;

typedef struct _ShellModule		ShellModule;
typedef struct _ShellModuleMethod	ShellModuleMethod;
typedef struct _ShellModuleEntry	ShellModuleEntry;

typedef struct _ShellFieldUpdate	ShellFieldUpdate;
typedef struct _ShellFieldUpdateSource	ShellFieldUpdateSource;

typedef enum {
    SHELL_ORDER_DESCENDING,
    SHELL_ORDER_ASCENDING,
} ShellOrderType;

typedef enum {
    SHELL_PACK_RESIZE = 1 << 0,
    SHELL_PACK_SHRINK = 1 << 1
} ShellPackOptions;

typedef enum {
    SHELL_VIEW_NORMAL,
    SHELL_VIEW_DUAL,
    SHELL_VIEW_LOAD_GRAPH,
    SHELL_VIEW_PROGRESS,
    SHELL_VIEW_PROGRESS_DUAL,
    SHELL_VIEW_SUMMARY,
    SHELL_VIEW_N_VIEWS
} ShellViewType;

typedef enum {
    TREE_COL_PBUF,
    TREE_COL_NAME,
    TREE_COL_MODULE_ENTRY,
    TREE_COL_MODULE,
    TREE_COL_SEL,
    TREE_NCOL
} ShellTreeColumns;

typedef enum {
    INFO_TREE_COL_NAME,
    INFO_TREE_COL_VALUE,
    INFO_TREE_COL_DATA,
    INFO_TREE_COL_PBUF,
    INFO_TREE_COL_PROGRESS,
    INFO_TREE_COL_EXTRA1,
    INFO_TREE_COL_EXTRA2,
    INFO_TREE_NCOL
} ShellInfoTreeColumns;

struct _Shell {
    GtkWidget		*window, *vbox;
    GtkWidget		*status, *progress;
    GtkWidget		*remote_label;
    GtkWidget		*notebook;
    GtkWidget		*hpaned, *vpaned;

    ShellTree		*tree;
    ShellInfoTree	*info, *moreinfo;
    ShellModule		*selected_module;
    ShellModuleEntry	*selected;
    ShellNote		*note;
    ShellSummary	*summary;
    LoadGraph		*loadgraph;

    GtkActionGroup	*action_group;
    GtkUIManager	*ui_manager;
    GSList		*merge_ids;

    ShellViewType	 view_type;
    gboolean		 normalize_percentage;

    gint		_pulses;
    ShellOrderType	_order_type;

    GKeyFile		*hosts;
    HelpViewer		*help_viewer;
};

struct _ShellSummary {
    GtkWidget		*header;
    GtkWidget		*scroll;
    GtkWidget		*view;

    GSList		*items;
};

struct _ShellTree {
    GtkWidget		*scroll;
    GtkWidget		*view;
    GtkTreeModel	*model;
    GtkTreeSelection	*selection;

    GSList		*modules;
};

struct _ShellInfoTree {
    GtkWidget		*scroll;
    GtkWidget		*view;
    GtkTreeModel        *model;
    GtkTreeSelection	*selection;

    GtkTreeViewColumn	 *col_progress, *col_value, *col_extra1, *col_extra2, *col_textvalue;
};

struct _ShellNote {
    GtkWidget		*event_box;
    GtkWidget		*label;
};

struct _ShellModule {
    gchar		*name;
    GdkPixbuf		*icon;
    GModule		*dll;

    gpointer		(*aboutfunc) ();
    gchar		*(*summaryfunc) ();
    void		(*deinit) ();

    guchar		 weight;

    GSList		*entries;
};

struct _ShellModuleMethod {
    gchar	*name;
    gpointer	function;
};

struct _ShellModuleEntry {
    gchar		*name;
    GdkPixbuf		*icon;
    gchar		*icon_file;
    gboolean		 selected;
    gint		 number;
    guint32		 flags;

    gchar		*(*func) ();
    void		(*scan_func) ();

    gchar		*(*fieldfunc) (gchar * entry);
    gchar 		*(*morefunc)  (gchar * entry);
    gchar		*(*notefunc)  (gint entry);
};

struct _ShellFieldUpdate {
    ShellModuleEntry	*entry;
    gchar		*field_name;
};

struct _ShellFieldUpdateSource {
    guint		 source_id;
    ShellFieldUpdate	*sfu;
};

void		shell_init(GSList *modules);
void		shell_do_reload(void);

Shell	       *shell_get_main_shell();

void		shell_action_set_enabled(const gchar *action_name,
                                         gboolean setting);
gboolean	shell_action_get_enabled(const gchar *action_name);
gboolean	shell_action_get_active(const gchar *action_name);
void		shell_action_set_active(const gchar *action_name,
                                        gboolean setting);
void		shell_action_set_property(const gchar *action_name,
                                          const gchar *property,
                                          gboolean setting);

void		shell_set_side_pane_visible(gboolean setting);
void		shell_set_note_from_entry(ShellModuleEntry *entry);
void		shell_ui_manager_set_visible(const gchar *path,
                                             gboolean setting);

void		shell_status_update(const gchar *message);
void		shell_status_pulse(void);
void		shell_status_set_percentage(gint percentage);
void		shell_status_set_enabled(gboolean setting);

void		shell_view_set_enabled(gboolean setting);

void		shell_clear_timeouts(Shell *shell);
void		shell_clear_tree_models(Shell *shell);
void		shell_clear_field_updates(void);
void		shell_set_title(Shell *shell, char *subtitle);

void		shell_add_modules_to_gui(gpointer _shell_module, gpointer _shell_tree);

void		shell_save_hosts_file(void);
void		shell_update_remote_menu(void);

void		shell_set_remote_label(Shell *shell, gchar *label);

/* decode special information in keys */
gboolean    key_is_flagged(gchar *key);       /* has $[<flags>][<tag>]$ at the start of the key */
gboolean    key_is_highlighted(gchar *key);   /* flag '*' = select/highlight */
gboolean    key_wants_details(gchar *key);    /* flag '!' = report should include the "moreinfo" */
gchar       *key_mi_tag(gchar *key);          /* moreinfo lookup tag */
const gchar *key_get_name(gchar *key);        /* get the key's name, flagged or not */

#endif				/* __SHELL_H__ */