/*
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
*/
/*
#
# Copyright (c) 2010. Oracle and/or its affiliates. All rights reserved.
# Use is subject to license terms.
#
*/
#include <gtk/gtk.h>
#include <glib.h>
#include <glib/gi18n.h>
#include <gconf/gconf-client.h>
#include <libgnomeui/gnome-help.h>
#include "service/service.h"
#include "common.h"
#include "pre-dialog.h"
#include "../config.h"
enum {CHECK_COLUMN, DOC_COLUMN, DES_COLUMN, N_COLUMNS };
extern cmdassist_config pre_conf;
typedef struct {
GtkWidget* criteria_panel_command;
GtkWidget* criteria_panel_docTitle;
GtkWidget* criteria_panel_content;
GtkWidget* criteria_panel_entry_size;
GtkWidget* system_panel_combobox_language;
GtkWidget* system_panel_input_url;
GtkWidget* doc_panel_tree;
cmdassist_config* conf;
} preDialog;
static void
gen_doc_list(gchar* str, gchar* doc_list){
strcat(doc_list, str);
strcat(doc_list, "##");
}
void load_config(cmdassist_config *conf) {
GConfClient *gconf_client;
gconf_client = gconf_client_get_default ();
if(!gconf_client_dir_exists(gconf_client,
CMDASSIST_GCONF_DIR,
NULL)) {
debug_printf("Create Dir\n");
gconf_client_add_dir (gconf_client,
CMDASSIST_GCONF_DIR,
GCONF_CLIENT_PRELOAD_ONELEVEL,
NULL);
}
conf->criteria.command = gconf_client_get_bool(gconf_client, CMDASSIST_GCONF_SEARCH_COMMAND, NULL) ? TRUE : FALSE;
conf->criteria.title = gconf_client_get_bool(gconf_client, CMDASSIST_GCONF_SEARCH_TITLE, NULL) ? TRUE : FALSE;
conf->criteria.content = gconf_client_get_bool(gconf_client, CMDASSIST_GCONF_SEARCH_CONTENT, NULL) ? TRUE : FALSE;
gdouble result_size = gconf_client_get_float(gconf_client, CMDASSIST_GCONF_RESULT_SIZE, NULL);
conf->criteria.result_size = (gconf_client_get_float(gconf_client, CMDASSIST_GCONF_RESULT_SIZE, NULL) == 0) ? 20.0 : result_size;
conf->system.languageID = gconf_client_get_int(gconf_client, CMDASSIST_GCONF_SYSTEM_LANGUAGEID, NULL);
if(conf->system.languageID != 0) {
gchar *conf_str = gconf_client_get_string(gconf_client, CMDASSIST_GCONF_SYSTEM_LANGUAGE, NULL);
strcpy(conf->system.language, conf_str);
g_free(conf_str);
}
gchar *wsdl = NULL;
wsdl = gconf_client_get_string(gconf_client, CMDASSIST_GCONF_SYSTEM_WSDL, NULL);
if(wsdl != NULL) {
strcpy(conf->system.wsdl, wsdl);
} else {
strcpy(conf->system.wsdl, CMDASSIST_WSDL);
}
g_free(wsdl);
//conf->system.isServiceValid = FALSE;
GSList *doc_list = NULL;
doc_list = gconf_client_get_list(gconf_client, CMDASSIST_GCONF_DOC_LIST, GCONF_VALUE_STRING, NULL);
strcpy(conf->doc.docs, "\0");
g_list_foreach (doc_list, (GFunc)gen_doc_list, conf->doc.docs);
g_list_foreach (doc_list, (GFunc)g_free, NULL);
g_slist_free(doc_list);
if(strlen(conf->doc.docs) == 0) {
strcpy(conf->doc.docs, "solbook##manpage");
}
//Unref this gobject
g_object_unref(gconf_client);
}
static void
add_to_list(cmd_doc_list *doc, preDialog *priv)
{
GtkListStore *store;
GtkTreeIter iter;
gboolean is = FALSE;
store = GTK_LIST_STORE(gtk_tree_view_get_model
(GTK_TREE_VIEW(priv->doc_panel_tree)));
if(strstr(priv->conf->doc.docs, doc->doc_name)) {
is = TRUE;
}
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, CHECK_COLUMN, is, DOC_COLUMN, doc->doc_name, DES_COLUMN, doc->doc_des, -1);
}
static void
setConfValues(preDialog *priv) {
cmdassist_config* conf = priv->conf;
GtkTextBuffer *buffer;
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->criteria_panel_command), conf->criteria.command);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(priv->criteria_panel_docTitle), conf->criteria.title);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(priv->criteria_panel_content), conf->criteria.content);
gtk_spin_button_set_value (GTK_SPIN_BUTTON(priv->criteria_panel_entry_size), conf->criteria.result_size);
gtk_combo_box_set_active(GTK_COMBO_BOX(priv->system_panel_combobox_language), conf->system.languageID);
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(priv->system_panel_input_url));
gtk_text_buffer_set_text(buffer, conf->system.wsdl, strlen(conf->system.wsdl));
GList *doc_list = NULL;
if(pre_conf.system.isServiceValid) {
doc_list = get_doc_list(doc_list, conf);
} else {
cmd_doc_list *doc = g_malloc(sizeof(cmd_doc_list));
strcpy(doc->doc_name, "solbook");
strcpy(doc->doc_des, "Solaris Book");
doc_list = g_list_append(doc_list, doc);
cmd_doc_list *doc1 = g_malloc(sizeof(cmd_doc_list));
strcpy(doc1->doc_name, "manpage");
strcpy(doc1->doc_des, "Solaris manpage");
doc_list = g_list_append(doc_list, doc1);
}
g_list_foreach(doc_list, add_to_list, priv);
g_list_foreach (doc_list, (GFunc)g_free, NULL);
g_list_free(doc_list);
}
static void
saveConfValues(GtkWidget *widget, gpointer userdata){
GConfClient *gconf_client;
gconf_client = gconf_client_get_default ();
preDialog *priv = userdata;
gboolean criteria = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->criteria_panel_command));
gconf_client_set_bool (gconf_client,
CMDASSIST_GCONF_SEARCH_COMMAND,
criteria,
NULL);
criteria = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->criteria_panel_docTitle));
gconf_client_set_bool (gconf_client,
CMDASSIST_GCONF_SEARCH_TITLE,
criteria,
NULL);
criteria = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->criteria_panel_content));
gconf_client_set_bool (gconf_client,
CMDASSIST_GCONF_SEARCH_CONTENT,
criteria,
NULL);
gdouble result_size = gtk_spin_button_get_value (priv->criteria_panel_entry_size);
gconf_client_set_float (gconf_client,
CMDASSIST_GCONF_RESULT_SIZE,
result_size,
NULL);
const gint system_languageID = gtk_combo_box_get_active(GTK_COMBO_BOX(priv->system_panel_combobox_language));
gconf_client_set_int (gconf_client,
CMDASSIST_GCONF_SYSTEM_LANGUAGEID,
system_languageID,
NULL);
const gchar *system_language = gtk_combo_box_get_active_text(GTK_COMBO_BOX(priv->system_panel_combobox_language));
gconf_client_set_string(gconf_client,
CMDASSIST_GCONF_SYSTEM_LANGUAGE,
system_language,
NULL);
GtkTextBuffer *buffer;
GtkTextIter start, end;
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(priv->system_panel_input_url));
gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(buffer), &start, &end);
const gchar *system_url = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
if(strlen(system_url) == 0) {
gconf_client_set_string(gconf_client,
CMDASSIST_GCONF_SYSTEM_WSDL,
CMDASSIST_WSDL,
NULL);
} else {
gconf_client_set_string(gconf_client,
CMDASSIST_GCONF_SYSTEM_WSDL,
system_url,
NULL);
}
GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW(priv->doc_panel_tree));
GtkTreeIter iter;
GSList *doc_list = NULL;
gchar *str = NULL;
gboolean is_checked;
if(gtk_tree_model_get_iter_first (model, &iter)) {
gtk_tree_model_get (model, &iter, 1, &str, 0, &is_checked, -1);
if(is_checked) {
doc_list = g_list_append(doc_list, str);
}
}
while(gtk_tree_model_iter_next (model, &iter)) {
gtk_tree_model_get (model, &iter, 1, &str, 0, &is_checked, -1);
if(is_checked) {
doc_list = g_list_append(doc_list, str);
}
}
gconf_client_set_list (gconf_client,
CMDASSIST_GCONF_DOC_LIST,
GCONF_VALUE_STRING,
doc_list,
NULL);
g_list_foreach (doc_list, (GFunc)g_free, NULL);
g_list_free(doc_list);
//Unref this gobject
g_object_unref(gconf_client);
//load the configuration
load_config(&pre_conf);
}
static void
item_toggled (GtkCellRendererToggle *cell,
gchar *path_str,
gpointer data)
{
GtkTreeModel *model = gtk_tree_view_get_model (data);
GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
GtkTreeIter iter;
gboolean toggle_item;
gint *column;
column = 0;
/* get toggled iter */
gtk_tree_model_get_iter (model, &iter, path);
gtk_tree_model_get (model, &iter, column, &toggle_item, -1);
toggle_item ^= 1;
/* set new value */
gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
toggle_item, -1);
/* clean up */
gtk_tree_path_free (path);
}
static void
init_doc_tree(GtkWidget *list)
{
GtkCellRenderer *renderer;
GtkTreeViewColumn *column_toggle;
GtkTreeViewColumn *column_doc;
GtkTreeViewColumn *column_des;
GtkListStore *store;
renderer = gtk_cell_renderer_toggle_new();
column_toggle = gtk_tree_view_column_new_with_attributes(_("Check"),
renderer, "active", CHECK_COLUMN, NULL);
gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column_toggle), TRUE);
g_signal_connect (renderer, "toggled", G_CALLBACK (item_toggled), list);
gtk_tree_view_append_column(GTK_TREE_VIEW(list), column_toggle);
renderer = gtk_cell_renderer_text_new();
column_doc = gtk_tree_view_column_new_with_attributes(_("Document"),
renderer, "text", DOC_COLUMN, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(list), column_doc);
renderer = gtk_cell_renderer_text_new();
column_des = gtk_tree_view_column_new_with_attributes(_("Description"),
renderer, "text", DES_COLUMN, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(list), column_des);
store = gtk_list_store_new(N_COLUMNS, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING);
gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(store));
g_object_unref(store);
}
static void
response_cb (GtkDialog *dialog,
gint response_id,
gpointer user_data)
{
gchar *err = NULL;
GError *error;
switch (response_id) {
case GTK_RESPONSE_HELP:
error = NULL;
/* replacing gnome_help_display with gnome_help_display_uri */
/* gnome_help_display ("CommandAssistant", "command-assistant-preferences", &error); */
gchar* name = g_strdup_printf ("%s%s/C/CommandAssistant.xml", "ghelp://", CMDASSIST_HELPDIR);
gnome_help_display_uri(name, &error);
g_free(name);
if (error) {
GtkWidget *dialog;
dialog = gtk_message_dialog_new (NULL,
0,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
_("Could not display help for the "
"Command Assistant.\n"
"%s"),
error->message);
g_signal_connect_swapped (dialog, "response",
G_CALLBACK (gtk_widget_destroy),
dialog);
gtk_widget_show (dialog);
g_error_free (error);
}
break;
case GTK_RESPONSE_ACCEPT:
saveConfValues(NULL, user_data);
break;
default:
gtk_widget_hide (GTK_WIDGET (dialog));
break;
}
}
void create_pre_dialog ()
{
preDialog priv;
GtkWidget* dialog;
GtkWidget* scrolledwindow;
GtkWidget* tab_panel;
GdkPixbuf *icon;
gchar* icon_name;
GtkWidget* criteria_panel_vbox;
GtkWidget* criteria_panel_title;
GtkWidget* criteria_panel_label;
GtkWidget* criteria_panel_hsep;
GtkWidget* criteria_panel_label_size;
GtkWidget* system_panel_vbox;
GtkWidget* system_panel_title;
GtkWidget* system_panel_frame;
GtkWidget* system_panel_hsep;
GtkWidget* system_panel_label;
GtkWidget* system_panel_label_language;
GtkWidget* system_panel_combobox_language;
GtkWidget* system_panel_hbox_language;
GtkWidget* system_panel_input_url;
GtkWidget* system_panel_hbox_url;
GtkWidget* system_panel_frame_url;
GtkWidget* doc_panel_title;
GtkWidget* doc_panel_treeview_label;
GtkWidget* doc_panel_vbox;
GtkWidget* doc_panel_hbox;
GtkWidget* doc_panel_treeview;
GtkWidget* doc_panel_refresh;
GtkWidget* sw;
GtkWidget* criteria_panel_command;
GtkWidget* criteria_panel_docTitle;
GtkWidget* criteria_panel_content;
GtkWidget* criteria_panel_entry_size;
dialog = gtk_dialog_new();
gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 2);
gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
gtk_window_set_title (GTK_WINDOW (dialog), _("Preferences"));
icon_name = g_strdup_printf ("%s/command_assistant_applet.png", CMDASSIST_PIXDIR);
icon = gdk_pixbuf_new_from_file (icon_name, NULL);
g_free(icon_name);
gtk_window_set_icon (GTK_WINDOW (dialog), icon);
tab_panel = gtk_notebook_new();
gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), tab_panel);
gtk_dialog_add_button (GTK_DIALOG (dialog),
"gtk-help",
GTK_RESPONSE_HELP);
gtk_dialog_add_button (GTK_DIALOG (dialog),
"gtk-close",
GTK_RESPONSE_ACCEPT);
//Create Criteria Panel
criteria_panel_title = gtk_label_new(_("Criteria"));
criteria_panel_label = gtk_label_new (NULL);
gtk_label_set_markup(criteria_panel_label, _("Please Select The Criteria:"));
gtk_misc_set_alignment (criteria_panel_label, 0, 0.5);
//gtk_misc_set_padding (criteria_panel_label, 0, 10);
criteria_panel_vbox = gtk_vbox_new (FALSE, 20);
gtk_container_set_border_width (GTK_CONTAINER (criteria_panel_vbox), 10);
gtk_box_set_spacing (GTK_BOX (criteria_panel_vbox), 4);
gtk_notebook_append_page(GTK_NOTEBOOK(tab_panel), criteria_panel_vbox, criteria_panel_title);
gtk_box_pack_start (GTK_BOX(criteria_panel_vbox), criteria_panel_label, FALSE, FALSE, 5);
criteria_panel_command = gtk_check_button_new_with_label(_("Only Search for Command"));
gtk_box_pack_start (GTK_BOX(criteria_panel_vbox), criteria_panel_command, FALSE, FALSE, 5);
criteria_panel_docTitle = gtk_check_button_new_with_label(_("Only Search for Document Title"));
gtk_box_pack_start (GTK_BOX(criteria_panel_vbox), criteria_panel_docTitle, FALSE, FALSE, 5);
criteria_panel_content = gtk_check_button_new_with_label(_("Only Search for Document Content"));
gtk_box_pack_start (GTK_BOX(criteria_panel_vbox), criteria_panel_content, FALSE, FALSE, 5);
criteria_panel_hsep = gtk_hseparator_new ();
gtk_box_pack_start (GTK_BOX(criteria_panel_vbox), criteria_panel_hsep, FALSE, FALSE, 5);
criteria_panel_label_size = gtk_label_new (NULL);
gtk_label_set_markup(criteria_panel_label_size, _("Please Select Maximum Result Number: "));
gtk_box_pack_start (GTK_BOX(criteria_panel_vbox), criteria_panel_label_size, FALSE, FALSE, 5);
gtk_misc_set_alignment (criteria_panel_label_size, 0, 0.5);
GtkAdjustment *spinner_adj = (GtkAdjustment *) gtk_adjustment_new (50.0, 10.0, 50.0, 5.0, 5.0, 0.0);
criteria_panel_entry_size = gtk_spin_button_new (spinner_adj, 1.0, 0);
gtk_box_pack_start (GTK_BOX(criteria_panel_vbox), criteria_panel_entry_size, FALSE, FALSE, 5);
//Create System Panel
system_panel_title = gtk_label_new(_("System"));
system_panel_vbox = gtk_vbox_new (FALSE, 10);
gtk_box_set_spacing (GTK_BOX (system_panel_vbox), 4);
gtk_container_set_border_width (GTK_CONTAINER (system_panel_vbox), 10);
gtk_notebook_append_page(GTK_NOTEBOOK(tab_panel), system_panel_vbox, system_panel_title);
system_panel_label_language = gtk_label_new(_("Default language:"));
system_panel_combobox_language = gtk_combo_box_new_text();
gtk_combo_box_append_text(system_panel_combobox_language, _("System Default Language"));
gtk_combo_box_append_text(system_panel_combobox_language, "Japanese");
system_panel_hbox_language = gtk_hbox_new (FALSE, 10);
system_panel_input_url = gtk_text_view_new();
system_panel_frame_url = gtk_frame_new(_("Web Service:"));
gtk_container_add(GTK_CONTAINER(system_panel_frame_url), system_panel_input_url);
gtk_widget_set_usize(system_panel_input_url, 20, 65);
gtk_text_view_set_pixels_above_lines(GTK_TEXT_VIEW(system_panel_input_url), 8);
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(system_panel_input_url), GTK_WRAP_CHAR);
system_panel_hbox_url = gtk_hbox_new(FALSE, 10);
gtk_box_pack_start (GTK_BOX(system_panel_hbox_language), system_panel_label_language, FALSE, FALSE, 10);
gtk_box_pack_end (GTK_BOX(system_panel_hbox_language), system_panel_combobox_language, TRUE, TRUE, 10);
//gtk_box_pack_start (GTK_BOX(system_panel_hbox_url), system_panel_label_url, FALSE, FALSE, 10);
gtk_box_pack_end (GTK_BOX(system_panel_hbox_url), system_panel_frame_url, TRUE, TRUE, 10);
gtk_box_pack_start (GTK_BOX(system_panel_vbox), system_panel_hbox_language, FALSE, FALSE, 20);
system_panel_hsep = gtk_hseparator_new ();
gtk_box_pack_start (GTK_BOX(system_panel_vbox), system_panel_hsep, FALSE, FALSE, 5);
gtk_box_pack_start (GTK_BOX(system_panel_vbox), system_panel_hbox_url, FALSE, FALSE, 20);
//Create Doc Panel
doc_panel_title = gtk_label_new(_("Documents"));
doc_panel_vbox = gtk_vbox_new (FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (doc_panel_vbox), 10);
gtk_box_set_spacing (GTK_BOX (doc_panel_vbox), 4);
gtk_notebook_append_page(GTK_NOTEBOOK(tab_panel), doc_panel_vbox, doc_panel_title);
sw = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
GTK_SHADOW_ETCHED_IN);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
doc_panel_treeview_label = gtk_label_new(NULL);
gtk_label_set_markup(doc_panel_treeview_label, _("Available Documents List"));
doc_panel_treeview = gtk_tree_view_new();
gtk_container_add (GTK_CONTAINER (sw), doc_panel_treeview);
doc_panel_refresh = gtk_button_new_with_label(_("Refresh From Server"));
gtk_box_pack_start (GTK_BOX(doc_panel_vbox), doc_panel_treeview_label, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX(doc_panel_vbox), sw, TRUE, TRUE, 0);
doc_panel_hbox = gtk_hbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX(doc_panel_hbox), doc_panel_refresh, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX(doc_panel_vbox), doc_panel_hbox, FALSE, FALSE, 0);
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (doc_panel_treeview), TRUE);
init_doc_tree(doc_panel_treeview);
priv.criteria_panel_command = criteria_panel_command;
priv.criteria_panel_docTitle = criteria_panel_docTitle;
priv.criteria_panel_content = criteria_panel_content;
priv.system_panel_combobox_language = system_panel_combobox_language;
priv.system_panel_input_url = system_panel_input_url;
priv.doc_panel_tree = doc_panel_treeview;
priv.criteria_panel_entry_size = criteria_panel_entry_size;
priv.conf = &pre_conf;
load_config(&pre_conf);
setConfValues( &priv);
gtk_window_set_default_size (GTK_WINDOW (dialog), 400, 300);
gtk_widget_show_all (dialog);
g_signal_connect (dialog, "response",
G_CALLBACK (response_cb),
&priv);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}