2005-10-25 [wwp] 1.9.15cvs102
[claws.git] / src / noticeview.c
index 4fb466053a8bccb5be5da9f2cf88031dbe16c7d4..59e7ef997f767fe2bb14959f52438edde88aaf89 100644 (file)
@@ -14,7 +14,7 @@
  *
  * 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 #ifdef HAVE_CONFIG_H
@@ -24,6 +24,7 @@
 #include "defs.h"
 
 #include <glib.h>
+#include <glib/gi18n.h>
 #include <gtk/gtkwidget.h>
 #include <gtk/gtkhbox.h>
 #include <gtk/gtkvbox.h>
@@ -37,7 +38,6 @@
 #  include <compface.h>
 #endif
 
-#include "intl.h"
 #include "prefs_common.h"
 #include "gtkutils.h"
 #include "utils.h"
 #include "noticeview.h"
 
 static void noticeview_button_pressed  (GtkButton *button, NoticeView *noticeview);
+static void noticeview_2ndbutton_pressed(GtkButton *button, NoticeView *noticeview);
+static gboolean noticeview_icon_pressed        (GtkWidget *widget, GdkEventButton *evt,
+                                        NoticeView *noticeview);
+static gboolean noticeview_visi_notify(GtkWidget *widget,
+                                      GdkEventVisibility *event,
+                                      NoticeView *noticeview);
+static gboolean noticeview_leave_notify(GtkWidget *widget,
+                                     GdkEventCrossing *event,
+                                     NoticeView *textview);
+static gboolean noticeview_enter_notify(GtkWidget *widget,
+                                     GdkEventCrossing *event,
+                                     NoticeView *textview);
+
+static GdkCursor *hand_cursor = NULL;
 
 NoticeView *noticeview_create(MainWindow *mainwin)
 {
@@ -56,48 +70,79 @@ NoticeView *noticeview_create(MainWindow *mainwin)
        GtkWidget  *icon;
        GtkWidget  *text;
        GtkWidget  *widget;
+       GtkWidget  *widget2;
+       GtkWidget  *evtbox;
+       GtkTooltips *tooltips;
 
        debug_print("Creating notice view...\n");
        noticeview = g_new0(NoticeView, 1);
 
+       if (!hand_cursor)
+               hand_cursor = gdk_cursor_new(GDK_HAND2);
+
        noticeview->window = mainwin->window;
        
        vbox = gtk_vbox_new(FALSE, 4);
        gtk_widget_show(vbox);
        hsep = gtk_hseparator_new();
-       gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, TRUE, 0);
+       gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, TRUE, 1);
        
        hbox = gtk_hbox_new(FALSE, 4);
        gtk_widget_show(hbox);
-       gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
+       gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 1);
+
+       evtbox = gtk_event_box_new();
+       gtk_event_box_set_visible_window(GTK_EVENT_BOX(evtbox), FALSE);
+       gtk_widget_show(evtbox);
 
        icon = stock_pixmap_widget(noticeview->window, STOCK_PIXMAP_NOTICE_WARN); 
-#if 0
-       /* also possible... */
-       icon = gtk_pixmap_new(NULL, NULL);
-#endif
+
        gtk_widget_show(icon);
+       g_signal_connect(G_OBJECT(evtbox), "button-press-event", 
+                        G_CALLBACK(noticeview_icon_pressed),
+                        (gpointer) noticeview);
+       g_signal_connect(G_OBJECT(evtbox), "visibility-notify-event",
+                        G_CALLBACK(noticeview_visi_notify), noticeview);
+       g_signal_connect(G_OBJECT(evtbox), "motion-notify-event",
+                        G_CALLBACK(noticeview_visi_notify), noticeview);
+       g_signal_connect(G_OBJECT(evtbox), "leave-notify-event",
+                        G_CALLBACK(noticeview_leave_notify), noticeview);
+       g_signal_connect(G_OBJECT(evtbox), "enter-notify-event",
+                        G_CALLBACK(noticeview_enter_notify), noticeview);
        
-       gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, TRUE, 0);
+       gtk_container_add(GTK_CONTAINER(evtbox), icon);
+       gtk_box_pack_start(GTK_BOX(hbox), evtbox, FALSE, TRUE, 0);
        
        text = gtk_label_new("");
        gtk_widget_show(text);
        gtk_box_pack_start(GTK_BOX(hbox), text, FALSE, FALSE, 0);
 
        widget = gtk_button_new_with_label("");
+       gtk_widget_set_size_request(widget, 120, -1);
        g_signal_connect(G_OBJECT(widget), "clicked", 
                         G_CALLBACK(noticeview_button_pressed),
                         (gpointer) noticeview);
        gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 4);
        
+       widget2 = gtk_button_new_with_label("");
+       gtk_widget_set_size_request(widget2, 120, -1);
+       g_signal_connect(G_OBJECT(widget2), "clicked", 
+                        G_CALLBACK(noticeview_2ndbutton_pressed),
+                        (gpointer) noticeview);
+       gtk_box_pack_start(GTK_BOX(hbox), widget2, FALSE, FALSE, 0);
+       
+       tooltips = gtk_tooltips_new();
+       
        noticeview->vbox   = vbox;
        noticeview->hsep   = hsep;
        noticeview->hbox   = hbox;
        noticeview->icon   = icon;
        noticeview->text   = text;
        noticeview->button = widget;
-
-       noticeview->visible = TRUE;
+       noticeview->button2= widget2;
+       noticeview->evtbox = evtbox;
+       noticeview->visible= TRUE;
+       noticeview->tooltips = tooltips;
 
        return noticeview;
 }
@@ -144,6 +189,12 @@ void noticeview_set_button_text(NoticeView *noticeview, const char *text)
                gtk_widget_show(noticeview->button);
        } else
                gtk_widget_hide(noticeview->button);
+       
+       /* Callers defining only one button don't have to mind 
+        * resetting the second one. Callers defining two have
+        * to define the second button after the first one. 
+        */
+       gtk_widget_hide(noticeview->button2);
 }
 
 void noticeview_set_button_press_callback(NoticeView   *noticeview,
@@ -161,6 +212,68 @@ static void noticeview_button_pressed(GtkButton *button, NoticeView *noticeview)
        }
 }
 
+static gboolean noticeview_icon_pressed(GtkWidget *widget, GdkEventButton *evt,
+                                   NoticeView *noticeview)
+{
+       if (evt && evt->button == 1 && noticeview->icon_clickable) {
+               noticeview_button_pressed(NULL, noticeview);
+       }
+       return FALSE;
+}
+
+static gboolean noticeview_visi_notify(GtkWidget *widget,
+                                      GdkEventVisibility *event,
+                                      NoticeView *noticeview)
+{
+       if (noticeview->icon_clickable)
+               gdk_window_set_cursor(noticeview->evtbox->window, hand_cursor);
+       return FALSE;
+}
+
+static gboolean noticeview_leave_notify(GtkWidget *widget,
+                                     GdkEventCrossing *event,
+                                     NoticeView *noticeview)
+{
+       gdk_window_set_cursor(noticeview->evtbox->window, NULL);
+       return FALSE;
+}
+
+static gboolean noticeview_enter_notify(GtkWidget *widget,
+                                     GdkEventCrossing *event,
+                                     NoticeView *noticeview)
+{
+       if (noticeview->icon_clickable)
+               gdk_window_set_cursor(noticeview->evtbox->window, hand_cursor);
+       return FALSE;
+}
+
+void noticeview_set_2ndbutton_text(NoticeView *noticeview, const char *text)
+{
+       g_return_if_fail(noticeview);
+
+       if (text != NULL) {
+               gtk_label_set_text
+                       (GTK_LABEL(GTK_BIN(noticeview->button2)->child), text);
+               gtk_widget_show(noticeview->button2);
+       } else
+               gtk_widget_hide(noticeview->button2);
+}
+
+void noticeview_set_2ndbutton_press_callback(NoticeView        *noticeview,
+                                         GtkSignalFunc  callback,
+                                         gpointer      *user_data)
+{
+       noticeview->press2     = (void (*) (NoticeView *, gpointer)) callback;
+       noticeview->user_data2 = user_data;
+}
+
+static void noticeview_2ndbutton_pressed(GtkButton *button, NoticeView *noticeview)
+{
+       if (noticeview->press2) {
+               noticeview->press2(noticeview, noticeview->user_data2);
+       }
+}
+
 void noticeview_set_icon(NoticeView *noticeview, StockPixmap icon)
 {
        GdkPixmap *pixmap;
@@ -169,5 +282,19 @@ void noticeview_set_icon(NoticeView *noticeview, StockPixmap icon)
        if (stock_pixmap_gdk(noticeview->window, icon, &pixmap, &bitmap) < 0)
                return;
        
-       gtk_pixmap_set(GTK_PIXMAP(noticeview->icon), pixmap, bitmap);
+       gtk_image_set_from_pixmap(GTK_IMAGE(noticeview->icon), pixmap, bitmap);
+}
+
+void noticeview_set_icon_clickable(NoticeView *noticeview, gboolean setting)
+{
+       noticeview->icon_clickable = setting;
+}              
+
+void noticeview_set_tooltip (NoticeView *noticeview, const gchar *text)
+{
+       gtk_tooltips_set_tip(GTK_TOOLTIPS(noticeview->tooltips), 
+                       noticeview->evtbox,
+                       text,
+                       NULL);
+
 }