1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
2 /*
3  * Copyright (C) 2008 Imendio AB
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation; either version 2 of the
8  * License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public
16  * License along with this program; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20 
21 #include "config.h"
22 #include <string.h>
23 #include <glib/gi18n-lib.h>
24 #include <gdk/gdkkeysyms.h>
25 #include <gtk/gtk.h>
26 #include "dh-window.h"
27 #include "dh-util.h"
28 #include "dh-assistant-view.h"
29 #include "dh-assistant.h"
30 
31 typedef struct {
32         GtkWidget *main_box;
33         GtkWidget *view;
34 } DhAssistantPriv;
35 
36 static void dh_assistant_class_init (DhAssistantClass *klass);
37 static void dh_assistant_init       (DhAssistant      *assistant);
38 
39 G_DEFINE_TYPE (DhAssistant, dh_assistant, GTK_TYPE_WINDOW);
40 
41 #define GET_PRIVATE(instance) G_TYPE_INSTANCE_GET_PRIVATE \
42   (instance, DH_TYPE_ASSISTANT, DhAssistantPriv)
43 
44 static gboolean
assistant_key_press_event_cb(GtkWidget * widget,GdkEventKey * event,DhAssistant * assistant)45 assistant_key_press_event_cb (GtkWidget   *widget,
46                               GdkEventKey *event,
47                               DhAssistant *assistant)
48 {
49         if (event->keyval == GDK_Escape) {
50                 gtk_widget_destroy (GTK_WIDGET (assistant));
51                 return TRUE;
52         }
53 
54         return FALSE;
55 }
56 
57 static void
dh_assistant_class_init(DhAssistantClass * klass)58 dh_assistant_class_init (DhAssistantClass *klass)
59 {
60         g_type_class_add_private (klass, sizeof (DhAssistantPriv));
61 }
62 
63 static void
dh_assistant_init(DhAssistant * assistant)64 dh_assistant_init (DhAssistant *assistant)
65 {
66         DhAssistantPriv *priv = GET_PRIVATE (assistant);
67         GtkWidget       *scrolled_window;
68 
69         priv->main_box = gtk_vbox_new (FALSE, 0);
70         gtk_widget_show (priv->main_box);
71         gtk_container_add (GTK_CONTAINER (assistant), priv->main_box);
72 
73         /* i18n: Please don't translate "Devhelp". */
74         gtk_window_set_title (GTK_WINDOW (assistant), _("Devhelp — Assistant"));
75         gtk_window_set_icon_name (GTK_WINDOW (assistant), "devhelp");
76 
77         priv->view = dh_assistant_view_new ();
78 
79         g_signal_connect (assistant, "key-press-event",
80                           G_CALLBACK (assistant_key_press_event_cb),
81                           assistant);
82 
83         scrolled_window = gtk_scrolled_window_new (NULL, NULL);
84         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
85                                         GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
86 
87         gtk_container_add (GTK_CONTAINER (scrolled_window), priv->view);
88 
89         gtk_widget_show_all (scrolled_window);
90 
91         gtk_box_pack_start (GTK_BOX (priv->main_box),
92                             scrolled_window, TRUE, TRUE, 0);
93 
94         dh_util_state_manage_window (GTK_WINDOW (assistant),
95                                      "assistant/window");
96 }
97 
98 GtkWidget *
dh_assistant_new(DhBase * base)99 dh_assistant_new (DhBase *base)
100 {
101         GtkWidget       *assistant;
102         DhAssistantPriv *priv;
103 
104         assistant = g_object_new (DH_TYPE_ASSISTANT, NULL);
105 
106         priv = GET_PRIVATE (assistant);
107 
108         dh_assistant_view_set_base (DH_ASSISTANT_VIEW (priv->view), base);
109 
110         return assistant;
111 }
112 
113 gboolean
dh_assistant_search(DhAssistant * assistant,const gchar * str)114 dh_assistant_search (DhAssistant *assistant,
115                      const gchar *str)
116 {
117         DhAssistantPriv *priv;
118 
119         g_return_val_if_fail (DH_IS_ASSISTANT (assistant), FALSE);
120         g_return_val_if_fail (str != NULL, FALSE);
121 
122         priv = GET_PRIVATE (assistant);
123 
124         if (dh_assistant_view_search (DH_ASSISTANT_VIEW (priv->view), str)) {
125                 gtk_widget_show (GTK_WIDGET (assistant));
126                 return TRUE;
127         }
128 
129         return FALSE;
130 }
131