1
/* gnome-druid-page-edge.c
2
* Copyright (C) 1999 Red Hat, Inc.
6
* This library is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Library General Public
8
* License as published by the Free Software Foundation; either
9
* version 2 of the License, or (at your option) any later version.
11
* This library is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Library General Public License for more details.
16
* You should have received a copy of the GNU Library General Public
17
* License along with this library; if not, write to the
18
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19
* Boston, MA 02111-1307, USA.
26
* FIXME (for gnome 2.2):
28
* This widget needs properties like GnomeDruidPageStandard
30
#include "gnome-druid.h"
32
#include "gnome-druid-page-edge.h"
34
struct _GnomeDruidPageEdgePrivate
36
GtkWidget *background;
37
GtkWidget *top_watermark;
38
GtkWidget *side_watermark;
39
GtkWidget *title_label;
41
GtkWidget *text_label;
44
gboolean background_color_set : 1;
45
gboolean textbox_color_set : 1;
46
gboolean logo_background_color_set : 1;
47
gboolean title_color_set : 1;
48
gboolean text_color_set : 1;
51
static void gnome_druid_page_edge_destroy (GtkObject *object);
52
static void gnome_druid_page_edge_finalize (GObject *object);
53
static void gnome_druid_page_edge_set_color (GnomeDruidPageEdge *druid_page_edge);
54
static void gnome_druid_page_edge_style_set (GtkWidget *widget,
56
static void gnome_druid_page_edge_realize (GtkWidget *widget);
57
static void gnome_druid_page_edge_prepare (GnomeDruidPage *page,
60
#define LOGO_WIDTH 50.0
61
#define DRUID_PAGE_HEIGHT 318
62
#define DRUID_PAGE_WIDTH 516
63
#define DRUID_PAGE_LEFT_WIDTH 100.0
65
GNOME_CLASS_BOILERPLATE (GnomeDruidPageEdge, gnome_druid_page_edge,
66
GnomeDruidPage, GNOME_TYPE_DRUID_PAGE,
70
gnome_druid_page_edge_class_init (GnomeDruidPageEdgeClass *klass)
72
GtkObjectClass *object_class;
73
GObjectClass *gobject_class;
74
GtkWidgetClass *widget_class;
75
GnomeDruidPageClass *page_class;
77
object_class = (GtkObjectClass*) klass;
78
gobject_class = (GObjectClass*) klass;
79
widget_class = (GtkWidgetClass*) klass;
80
page_class = (GnomeDruidPageClass*) klass;
82
object_class->destroy = gnome_druid_page_edge_destroy;
83
gobject_class->finalize = gnome_druid_page_edge_finalize;
84
widget_class->style_set = gnome_druid_page_edge_style_set;
85
widget_class->realize = gnome_druid_page_edge_realize;
87
page_class->prepare = gnome_druid_page_edge_prepare;
91
gnome_druid_page_edge_instance_init (GnomeDruidPageEdge *page)
95
GnomeDruidPageEdgePrivate *priv;
97
priv = g_new0(GnomeDruidPageEdgePrivate, 1);
100
/* FIXME: we should be a windowed widget, so we can set the
101
* background style on ourself rather than doing this eventbox
103
priv->background = gtk_event_box_new ();
104
gtk_container_add (GTK_CONTAINER (page), priv->background);
105
gtk_widget_show (priv->background);
107
table = gtk_table_new (2, 2, FALSE);
108
gtk_container_add (GTK_CONTAINER (priv->background), table);
109
gtk_widget_show (table);
111
/* top bar watermark */
112
priv->top_watermark = gtk_image_new ();
113
gtk_misc_set_alignment (GTK_MISC (priv->top_watermark), 0.0, 0.0);
114
gtk_widget_show (priv->top_watermark);
117
priv->title_label = gtk_label_new (NULL);
118
gtk_misc_set_alignment (GTK_MISC (priv->title_label), 0.0, 0.5);
119
gtk_widget_show (priv->title_label);
122
priv->logo = gtk_image_new ();
123
gtk_misc_set_alignment (GTK_MISC (priv->logo), 1.0, 0.5);
124
gtk_widget_show (priv->logo);
126
box = gtk_hbox_new (FALSE, 0);
127
gtk_widget_show (box);
130
priv->side_watermark = gtk_image_new ();
131
gtk_misc_set_alignment (GTK_MISC (priv->side_watermark), 0.0, 1.0);
132
gtk_widget_set_size_request (priv->side_watermark, DRUID_PAGE_LEFT_WIDTH, -1);
133
gtk_box_pack_start (GTK_BOX (box), priv->side_watermark,
135
gtk_widget_show (priv->side_watermark);
137
/* contents event box (used for styles) */
138
priv->contents = gtk_event_box_new ();
139
gtk_box_pack_start (GTK_BOX (box), priv->contents,
141
gtk_widget_show (priv->contents);
144
priv->text_label = gtk_label_new (NULL);
145
gtk_label_set_line_wrap (GTK_LABEL (priv->text_label), TRUE);
146
gtk_misc_set_alignment (GTK_MISC (priv->text_label), 0.5, 0.5);
147
gtk_container_add (GTK_CONTAINER (priv->contents), priv->text_label);
148
gtk_widget_show (priv->text_label);
150
gtk_table_attach (GTK_TABLE (table),
156
gtk_table_attach (GTK_TABLE (table),
159
GTK_EXPAND | GTK_FILL,
163
gtk_table_attach (GTK_TABLE (table),
166
GTK_EXPAND | GTK_FILL,
170
gtk_table_attach (GTK_TABLE (table),
173
GTK_EXPAND | GTK_FILL,
174
GTK_EXPAND | GTK_FILL,
180
* gnome_druid_page_edge_construct:
181
* @druid_page_edge: A #GnomeDruidPageEdge instance.
182
* @position: The position of @druid_page_edge within the druid.
183
* @antialiased: Unused in the current implementation. Set to %FALSE.
184
* @title: The title of the page.
185
* @text: The text in the body of the page.
186
* @logo: The logo on the page.
187
* @watermark: The watermark on the side of the page.
188
* @top_watermark: The watermark on the top of the page.
190
* Description: Useful for subclassing and language bindings, this function
191
* fills the given pieces of information into the existing @druid_page_edge.
194
gnome_druid_page_edge_construct (GnomeDruidPageEdge *druid_page_edge,
195
GnomeEdgePosition position,
196
gboolean antialiased,
200
GdkPixbuf *watermark,
201
GdkPixbuf *top_watermark)
203
g_return_if_fail (GNOME_IS_DRUID_PAGE_EDGE (druid_page_edge));
204
g_return_if_fail (position >= GNOME_EDGE_START &&
205
position < GNOME_EDGE_LAST);
207
druid_page_edge->position = position;
210
gnome_druid_page_edge_set_title (druid_page_edge, title);
213
gnome_druid_page_edge_set_text (druid_page_edge, text);
216
gnome_druid_page_edge_set_logo (druid_page_edge, logo);
219
gnome_druid_page_edge_set_watermark (druid_page_edge, watermark);
222
gnome_druid_page_edge_set_top_watermark (druid_page_edge, top_watermark);
226
gnome_druid_page_edge_destroy(GtkObject *object)
228
GnomeDruidPageEdge *druid_page_edge = GNOME_DRUID_PAGE_EDGE(object);
230
/* remember, destroy can be run multiple times! */
232
if (druid_page_edge->logo_image != NULL)
233
g_object_unref (G_OBJECT (druid_page_edge->logo_image));
234
druid_page_edge->logo_image = NULL;
236
if (druid_page_edge->watermark_image != NULL)
237
g_object_unref (G_OBJECT (druid_page_edge->watermark_image));
238
druid_page_edge->watermark_image = NULL;
240
GNOME_CALL_PARENT (GTK_OBJECT_CLASS, destroy, (object));
244
gnome_druid_page_edge_finalize(GObject *object)
246
GnomeDruidPageEdge *druid_page_edge = GNOME_DRUID_PAGE_EDGE(object);
248
g_free (druid_page_edge->text);
249
druid_page_edge->text = NULL;
250
g_free (druid_page_edge->title);
251
druid_page_edge->title = NULL;
253
g_free (druid_page_edge->_priv);
254
druid_page_edge->_priv = NULL;
256
GNOME_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
260
gnome_druid_page_edge_set_color (GnomeDruidPageEdge *page)
262
GnomeDruidPageEdgePrivate *priv = page->_priv;
263
GtkWidget *widget = GTK_WIDGET (page);
265
if (!priv->background_color_set)
266
page->background_color = widget->style->bg[GTK_STATE_SELECTED];
268
if (!priv->textbox_color_set)
269
page->textbox_color = widget->style->bg[GTK_STATE_PRELIGHT];
271
if (!priv->logo_background_color_set)
272
page->logo_background_color = widget->style->bg[GTK_STATE_SELECTED];
274
if (!priv->title_color_set)
275
page->title_color = widget->style->fg[GTK_STATE_SELECTED];
277
if (!priv->text_color_set)
278
page->text_color = widget->style->fg[GTK_STATE_PRELIGHT];
280
gtk_widget_modify_bg (priv->background, GTK_STATE_NORMAL, &page->background_color);
281
gtk_widget_modify_bg (priv->contents, GTK_STATE_NORMAL, &page->textbox_color);
282
gtk_widget_modify_bg (priv->logo, GTK_STATE_NORMAL, &page->logo_background_color);
283
gtk_widget_modify_fg (priv->title_label, GTK_STATE_NORMAL, &page->title_color);
284
gtk_widget_modify_fg (priv->text_label, GTK_STATE_NORMAL, &page->text_color);
288
gnome_druid_page_edge_prepare (GnomeDruidPage *page,
291
switch (GNOME_DRUID_PAGE_EDGE (page)->position) {
292
case GNOME_EDGE_START:
293
gnome_druid_set_buttons_sensitive (GNOME_DRUID (druid), FALSE, TRUE, TRUE, TRUE);
294
gnome_druid_set_show_finish (GNOME_DRUID (druid), FALSE);
295
if (GTK_IS_WINDOW (gtk_widget_get_toplevel (druid)))
296
gtk_widget_grab_default (GNOME_DRUID (druid)->next);
298
case GNOME_EDGE_FINISH:
299
gnome_druid_set_buttons_sensitive (GNOME_DRUID (druid), TRUE, FALSE, TRUE, TRUE);
300
gnome_druid_set_show_finish (GNOME_DRUID (druid), TRUE);
301
if (GTK_IS_WINDOW (gtk_widget_get_toplevel (druid)))
302
gtk_widget_grab_default (GNOME_DRUID (druid)->finish);
304
case GNOME_EDGE_OTHER:
305
gnome_druid_set_buttons_sensitive (GNOME_DRUID (druid), TRUE, TRUE, TRUE, TRUE);
306
gnome_druid_set_show_finish (GNOME_DRUID (druid), FALSE);
313
* gnome_druid_page_edge_new:
314
* @position: Position in druid.
316
* Description: Creates a new GnomeDruidPageEdge widget.
318
* Returns: #GtkWidget pointer to a new #GnomeDruidPageEdge.
320
/* Public functions */
322
gnome_druid_page_edge_new (GnomeEdgePosition position)
324
GnomeDruidPageEdge *retval;
326
g_return_val_if_fail (position >= GNOME_EDGE_START &&
327
position < GNOME_EDGE_LAST, NULL);
329
retval = g_object_new (GNOME_TYPE_DRUID_PAGE_EDGE, NULL);
331
gnome_druid_page_edge_construct (retval,
340
return GTK_WIDGET (retval);
344
* gnome_druid_page_edge_new_aa:
345
* @position: Position in druid.
347
* Description: Creates a new GnomeDruidPageEdge widget. The
348
* internal canvas is created in an antialiased mode.
350
* Returns: #GtkWidget pointer to a new #GnomeDruidPageEdge.
352
/* Public functions */
354
gnome_druid_page_edge_new_aa (GnomeEdgePosition position)
356
GnomeDruidPageEdge *retval;
358
g_return_val_if_fail (position >= GNOME_EDGE_START &&
359
position < GNOME_EDGE_LAST, NULL);
361
retval = g_object_new (GNOME_TYPE_DRUID_PAGE_EDGE, NULL);
363
gnome_druid_page_edge_construct (retval,
372
return GTK_WIDGET (retval);
376
* gnome_druid_page_edge_new_with_vals:
377
* @position: Position in druid.
378
* @antialiased: Use an antialiased canvas
380
* @text: The introduction text.
381
* @logo: The logo in the upper right corner.
382
* @watermark: The watermark on the left.
383
* @top_watermark: The watermark on the left.
385
* This will create a new GNOME Druid Edge page, with the values given. It is
386
* acceptable for any of them to be %NULL. Position should be
387
* %GNOME_EDGE_START, %GNOME_EDGE_FINISH or %GNOME_EDGE_OTHER.
389
* Returns: #GtkWidget pointer to a new #GnomeDruidPageEdge.
392
gnome_druid_page_edge_new_with_vals (GnomeEdgePosition position,
393
gboolean antialiased,
397
GdkPixbuf *watermark,
398
GdkPixbuf *top_watermark)
400
GnomeDruidPageEdge *retval;
402
g_return_val_if_fail (position >= GNOME_EDGE_START &&
403
position < GNOME_EDGE_LAST, NULL);
405
retval = g_object_new (GNOME_TYPE_DRUID_PAGE_EDGE, NULL);
407
gnome_druid_page_edge_construct (retval,
415
return GTK_WIDGET (retval);
419
* gnome_druid_page_edge_set_bg_color:
420
* @druid_page_edge: A @GnomeDruidPageEdge instance.
421
* @color: The new background color.
423
* Description: This will set the background color to be the @color. You do
424
* not need to allocate the color, as the @druid_page_edge will do it for you.
427
gnome_druid_page_edge_set_bg_color (GnomeDruidPageEdge *druid_page_edge,
430
g_return_if_fail (GNOME_IS_DRUID_PAGE_EDGE (druid_page_edge));
431
g_return_if_fail (color != NULL);
433
druid_page_edge->background_color = *color;
434
druid_page_edge->_priv->background_color_set = TRUE;
436
gtk_widget_modify_bg (druid_page_edge->_priv->background, GTK_STATE_NORMAL, color);
440
* gnome_druid_page_edge_set_textbox_color
441
* @druid_page_edge: A @GnomeDruidPageEdge instance.
442
* @color: The new textbox color.
444
* Sets the color of the background in the main text area of the page.
447
gnome_druid_page_edge_set_textbox_color (GnomeDruidPageEdge *druid_page_edge,
450
g_return_if_fail (GNOME_IS_DRUID_PAGE_EDGE (druid_page_edge));
451
g_return_if_fail (color != NULL);
453
druid_page_edge->textbox_color = *color;
454
druid_page_edge->_priv->textbox_color_set = TRUE;
456
gtk_widget_modify_bg (druid_page_edge->_priv->contents, GTK_STATE_NORMAL, color);
460
* gnome_druid_page_edge_set_logo_bg_color
461
* @druid_page_edge: A @GnomeDruidPageEdge instance.
462
* @color: The new color of the logo's background.
464
* Set the color behind the druid page's logo.
467
gnome_druid_page_edge_set_logo_bg_color (GnomeDruidPageEdge *druid_page_edge,
470
g_return_if_fail (GNOME_IS_DRUID_PAGE_EDGE (druid_page_edge));
471
g_return_if_fail (color != NULL);
473
druid_page_edge->logo_background_color = *color;
474
druid_page_edge->_priv->logo_background_color_set = TRUE;
476
gtk_widget_modify_bg (druid_page_edge->_priv->logo, GTK_STATE_NORMAL, color);
480
* gnome_druid_page_edge_set_title_color
481
* @druid_page_edge: A @GnomeDruidPageEdge instance.
482
* @color: The color of the title text.
484
* Sets the color of the title text on the current page.
487
gnome_druid_page_edge_set_title_color (GnomeDruidPageEdge *druid_page_edge,
490
g_return_if_fail (GNOME_IS_DRUID_PAGE_EDGE (druid_page_edge));
491
g_return_if_fail (color != NULL);
493
druid_page_edge->title_color = *color;
494
druid_page_edge->_priv->title_color_set = 1;
496
gtk_widget_modify_fg (druid_page_edge->_priv->title_label, GTK_STATE_NORMAL, color);
500
* gnome_druid_page_edge_set_text_color
501
* @druid_page_edge: A @GnomeDruidPageEdge instance.
502
* @color: The new test color.
504
* Sets the color of the text in the body of the druid page.
507
gnome_druid_page_edge_set_text_color (GnomeDruidPageEdge *druid_page_edge,
510
g_return_if_fail (GNOME_IS_DRUID_PAGE_EDGE (druid_page_edge));
511
g_return_if_fail (color != NULL);
513
druid_page_edge->text_color = *color;
514
druid_page_edge->_priv->text_color_set = TRUE;
516
gtk_widget_modify_fg (druid_page_edge->_priv->text_label, GTK_STATE_NORMAL, color);
520
* gnome_druid_page_edge_set_text
521
* @druid_page_edge: A @GnomeDruidPageEdge instance.
522
* @text: The text contents.
524
* Sets the contents of the text portion of the druid page.
527
gnome_druid_page_edge_set_text (GnomeDruidPageEdge *druid_page_edge,
530
g_return_if_fail (GNOME_IS_DRUID_PAGE_EDGE (druid_page_edge));
532
g_free (druid_page_edge->text);
533
druid_page_edge->text = g_strdup (text);
534
gtk_label_set_text (GTK_LABEL (druid_page_edge->_priv->text_label), text);
538
* gnome_druid_page_edge_set_title
539
* @druid_page_edge: A @GnomeDruidPageEdge instance.
540
* @title: The title text
542
* Sets the contents of the page's title text.
545
gnome_druid_page_edge_set_title (GnomeDruidPageEdge *druid_page_edge,
548
g_return_if_fail (GNOME_IS_DRUID_PAGE_EDGE (druid_page_edge));
550
g_free (druid_page_edge->title);
551
druid_page_edge->title = g_strconcat ("<span size=\"xx-large\" weight=\"ultrabold\">",
552
title ? title : "", "</span>", NULL);
553
gtk_label_set_text (GTK_LABEL (druid_page_edge->_priv->title_label),
554
druid_page_edge->title);
555
gtk_label_set_use_markup (GTK_LABEL (druid_page_edge->_priv->title_label), TRUE);
559
* gnome_druid_page_edge_set_logo:
560
* @druid_page_edge: A @GnomeDruidPageEdge instance.
561
* @logo_image: The #GdkPixbuf to use as a logo.
563
* Description: Sets a #GdkPixbuf as the logo in the top right corner.
564
* If %NULL, then no logo will be displayed.
567
gnome_druid_page_edge_set_logo (GnomeDruidPageEdge *druid_page_edge,
568
GdkPixbuf *logo_image)
570
g_return_if_fail (GNOME_IS_DRUID_PAGE_EDGE (druid_page_edge));
572
if (druid_page_edge->logo_image != NULL)
573
g_object_unref (G_OBJECT (druid_page_edge->logo_image));
575
druid_page_edge->logo_image = logo_image;
576
if (logo_image != NULL )
577
g_object_ref (G_OBJECT (logo_image));
578
gtk_image_set_from_pixbuf (GTK_IMAGE (druid_page_edge->_priv->logo), logo_image);
582
* gnome_druid_page_edge_set_watermark:
583
* @druid_page_edge: A @GnomeDruidPageEdge instance.
584
* @watermark: The #GdkPixbuf to use as a watermark.
586
* Description: Sets a #GdkPixbuf as the watermark on the left strip on the
587
* druid. If @watermark is %NULL, it is reset to the normal color.
590
gnome_druid_page_edge_set_watermark (GnomeDruidPageEdge *druid_page_edge,
591
GdkPixbuf *watermark)
594
g_return_if_fail (GNOME_IS_DRUID_PAGE_EDGE (druid_page_edge));
596
if (druid_page_edge->watermark_image != NULL)
597
g_object_unref (G_OBJECT (druid_page_edge->watermark_image));
599
druid_page_edge->watermark_image = watermark;
600
if (watermark != NULL )
601
g_object_ref (G_OBJECT (watermark));
602
gtk_image_set_from_pixbuf (GTK_IMAGE (druid_page_edge->_priv->side_watermark), watermark);
605
width = gdk_pixbuf_get_width (watermark);
607
gtk_widget_set_size_request (druid_page_edge->_priv->side_watermark,
608
width ? -1 : DRUID_PAGE_LEFT_WIDTH, -1);
612
* gnome_druid_page_edge_set_top_watermark:
613
* @druid_page_edge: the #GnomeDruidPageEdge to work on
614
* @top_watermark_image: The #GdkPixbuf to use as a top watermark
616
* Description: Sets a #GdkPixbuf as the watermark on top of the top
617
* strip on the druid. If @top_watermark_image is %NULL, it is reset
618
* to the normal color.
621
gnome_druid_page_edge_set_top_watermark (GnomeDruidPageEdge *druid_page_edge,
622
GdkPixbuf *top_watermark_image)
624
g_return_if_fail (GNOME_IS_DRUID_PAGE_EDGE (druid_page_edge));
626
if (druid_page_edge->top_watermark_image)
627
g_object_unref (G_OBJECT (druid_page_edge->top_watermark_image));
629
druid_page_edge->top_watermark_image = top_watermark_image;
630
if (top_watermark_image != NULL)
631
g_object_ref (G_OBJECT (top_watermark_image));
632
gtk_image_set_from_pixbuf (GTK_IMAGE (druid_page_edge->_priv->top_watermark),
633
top_watermark_image);
637
gnome_druid_page_edge_style_set (GtkWidget *widget,
640
GNOME_CALL_PARENT (GTK_WIDGET_CLASS, style_set, (widget, old_style));
641
gnome_druid_page_edge_set_color (GNOME_DRUID_PAGE_EDGE (widget));
645
gnome_druid_page_edge_realize (GtkWidget *widget)
647
GNOME_CALL_PARENT (GTK_WIDGET_CLASS, realize, (widget));
648
gnome_druid_page_edge_set_color (GNOME_DRUID_PAGE_EDGE (widget));