2011-10-25 [colin] 3.7.10cvs53
[claws.git] / src / gtk / gtkcmctree.c
index 4d4dc81f20b5768777b29aa762c77c411ee0bdbc..3feb4765152a80566e6c4294728ed2ceca7936d2 100644 (file)
@@ -194,10 +194,6 @@ static void ctree_attach_styles         (GtkCMCTree       *ctree,
 static void ctree_detach_styles         (GtkCMCTree       *ctree,
                                         GtkCMCTreeNode   *node, 
                                         gpointer        data);
-static void draw_drag_highlight         (GtkCMCList        *clist,
-                                        GtkCMCListRow     *dest_row,
-                                        gint             dest_row_number,
-                                        GtkCMCListDragPos  drag_pos);
 static void set_cell_contents           (GtkCMCList      *clist,
                                         GtkCMCListRow   *clist_row,
                                         gint           column,
@@ -496,7 +492,7 @@ draw_expander (GtkCMCTree     *ctree,
   cairo_fill(cr);
  
   cairo_new_path(cr);
-  gdk_cairo_set_source_color(cr, &gtk_widget_get_style(ctree)->fg[GTK_STATE_NORMAL]);
+  gdk_cairo_set_source_color(cr, &gtk_widget_get_style(GTK_WIDGET(ctree))->fg[GTK_STATE_NORMAL]);
   cairo_set_line_width(cr, 1);
   cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE);
   cairo_move_to(cr, points[0].x, points[0].y);
@@ -627,26 +623,23 @@ draw_row (GtkCMCList     *clist,
   GtkWidget *widget;
   GtkStyle *style;
   GtkCMCTree  *ctree;
-  GdkRectangle *rect;
   GdkRectangle *crect;
   GdkRectangle row_rectangle;
   GdkRectangle cell_rectangle; 
   GdkRectangle clip_rectangle;
   GdkRectangle intersect_rectangle;
   gint last_column;
-  gint column_left = 0;
-  gint column_right = 0;
   gint offset = 0;
   gint state;
   gint i;
   static GdkColor greybg={0, 0, 0, 0};
   static gboolean color_change = TRUE;
   cairo_t *cr;
-  GdkColor *fgcolor, *bgcolor, *focuscolor;
+  GdkColor *fgcolor, *bgcolor;
 
   cm_return_if_fail (clist != NULL);
   widget = GTK_WIDGET (clist);
-  style = gtk_widget_get_style (widget);
+  style = clist_row->style ? clist_row->style : gtk_widget_get_style (widget);
 
   if (greybg.pixel == 0 &&
       greybg.red == 0 &&
@@ -704,33 +697,33 @@ draw_row (GtkCMCList     *clist,
   if (prefs_common.use_stripes_everywhere && GTK_SCTREE(ctree)->show_stripes
       && color_change && row % 2) {
     bgcolor = &greybg;
-    focuscolor = &greybg;
   } else {
     bgcolor = &style->base[GTK_STATE_NORMAL];
-    focuscolor = &style->base[GTK_STATE_NORMAL];
   }
   state = clist_row->state;
 
   cr = gdk_cairo_create(clist->clist_window);
-  fgcolor = &style->fg[clist_row->state];
+  
+  if (clist_row->fg_set && state != GTK_STATE_SELECTED)
+       fgcolor = &clist_row->foreground;
+  else
+       fgcolor = &style->fg[clist_row->state];
   /* draw the cell borders */
   if (area)
     {
-      rect = &intersect_rectangle;
       crect = &intersect_rectangle;
 
       if (gdk_rectangle_intersect (area, &cell_rectangle, crect)) {
-        gdk_cairo_rectangle(cr, crect);
+        gdk_cairo_rectangle(cr, &cell_rectangle);
        gdk_cairo_set_source_color(cr, &style->base[GTK_STATE_NORMAL]);
        cairo_fill(cr);
       }
     }
   else
     {
-      rect = &clip_rectangle;
       crect = &cell_rectangle;
 
-      gdk_cairo_rectangle(cr, crect);
+      gdk_cairo_rectangle(cr, &cell_rectangle);
       gdk_cairo_set_source_color(cr, &style->base[GTK_STATE_NORMAL]);
       cairo_fill(cr);
     }
@@ -784,12 +777,6 @@ draw_row (GtkCMCList     *clist,
       pixbuf_width = 0;
       height = 0;
 
-          gdk_cairo_rectangle(cr, &cell_rectangle);
-         if (state == GTK_STATE_NORMAL)
-               gdk_cairo_set_source_color(cr, bgcolor);
-         else
-               gdk_cairo_set_source_color(cr, &style->base[state]);
-         cairo_fill(cr);
       if (area && !gdk_rectangle_intersect (area, &cell_rectangle,
                                            &intersect_rectangle))
        {
@@ -798,6 +785,13 @@ draw_row (GtkCMCList     *clist,
        }
       else
        {
+         gdk_cairo_rectangle(cr, &cell_rectangle);
+         if (state == GTK_STATE_NORMAL)
+               gdk_cairo_set_source_color(cr, bgcolor);
+         else
+               gdk_cairo_set_source_color(cr, &style->base[state]);
+         cairo_fill(cr);
+
          layout = create_cell_layout (clist, clist_row, i);
          if (layout)
            {
@@ -958,6 +952,22 @@ draw_row (GtkCMCList     *clist,
           g_object_unref (G_OBJECT (layout));
        }
     }
+   /* draw focus rectangle */
+  if (clist->focus_row == row &&
+      gtk_widget_get_can_focus (widget) && gtk_widget_has_focus (widget))
+    {
+      if (!area || gdk_rectangle_intersect (area, &row_rectangle,
+                                       &intersect_rectangle))
+       {
+           cairo_set_line_width(cr, 1.0);
+           cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE);
+           gdk_cairo_set_source_color(cr, &style->fg[GTK_STATE_NORMAL]);
+           cairo_rectangle(cr, row_rectangle.x, row_rectangle.y,
+                             row_rectangle.width + 1,
+                             row_rectangle.height);
+           cairo_stroke(cr);
+       }
+     }
     cairo_destroy(cr);
 }
 
@@ -999,7 +1009,6 @@ gtk_cmctree_class_init (GtkCMCTreeClass *klass)
   clist_class->selection_find = selection_find;
   clist_class->click_column = NULL;
   clist_class->draw_row = draw_row;
-  clist_class->draw_drag_highlight = draw_drag_highlight;
   clist_class->clear = real_clear;
   clist_class->select_all = real_select_all;
   clist_class->unselect_all = real_unselect_all;
@@ -1372,7 +1381,6 @@ gtk_cmctree_realize (GtkWidget *widget)
   GtkCMCList *clist;
   GtkCMCTreeNode *node;
   GtkCMCTreeNode *child;
-  GtkStyle *style;
   gint i;
 
   cm_return_if_fail (GTK_IS_CMCTREE (widget));
@@ -1391,8 +1399,6 @@ gtk_cmctree_realize (GtkWidget *widget)
          gtk_cmctree_pre_recursive (ctree, child, ctree_attach_styles, NULL);
       node = GTK_CMCTREE_NODE_NEXT (node);
     }
-
-  style = gtk_widget_get_style(widget);
 }
 
 static void
@@ -1479,160 +1485,6 @@ gtk_cmctree_button_press (GtkWidget      *widget,
   return GTK_WIDGET_CLASS (parent_class)->button_press_event (widget, event);
 }
 
-static void
-draw_drag_highlight (GtkCMCList        *clist,
-                    GtkCMCListRow     *dest_row,
-                    gint             dest_row_number,
-                    GtkCMCListDragPos  drag_pos)
-{
-  GtkAllocation allocation;
-  GtkCMCTree *ctree;
-  GdkPoint points[4];
-  gint level;
-  gint i;
-  gint y = 0;
-
-  cm_return_if_fail (GTK_IS_CMCTREE (clist));
-
-  ctree = GTK_CMCTREE (clist);
-  gtk_widget_get_allocation(GTK_WIDGET(ctree), &allocation);
-
-  level = ((GtkCMCTreeRow *)(dest_row))->level;
-
-  y = ROW_TOP_YPIXEL (clist, dest_row_number) - 1;
-
-  switch (drag_pos)
-    {
-    case GTK_CMCLIST_DRAG_NONE:
-      break;
-    case GTK_CMCLIST_DRAG_AFTER:
-      y += clist->row_height + 1;
-    case GTK_CMCLIST_DRAG_BEFORE:
-      
-      if (clist->column[ctree->tree_column].visible)
-       switch (clist->column[ctree->tree_column].justification)
-         {
-         case GTK_JUSTIFY_CENTER:
-         case GTK_JUSTIFY_FILL:
-         case GTK_JUSTIFY_LEFT:
-           if (ctree->tree_column > 0)
-             gdk_draw_line (clist->clist_window, clist->xor_gc, 
-                            COLUMN_LEFT_XPIXEL(clist, 0), y,
-                            COLUMN_LEFT_XPIXEL(clist, ctree->tree_column - 1)+
-                            clist->column[ctree->tree_column - 1].area.width,
-                            y);
-
-           gdk_draw_line (clist->clist_window, clist->xor_gc, 
-                          COLUMN_LEFT_XPIXEL(clist, ctree->tree_column) + 
-                          ctree->tree_indent * level -
-                          (ctree->tree_indent - PM_SIZE) / 2, y,
-                          allocation.width, y);
-           break;
-         case GTK_JUSTIFY_RIGHT:
-           if (ctree->tree_column < clist->columns - 1)
-             gdk_draw_line (clist->clist_window, clist->xor_gc, 
-                            COLUMN_LEFT_XPIXEL(clist, ctree->tree_column + 1),
-                            y,
-                            COLUMN_LEFT_XPIXEL(clist, clist->columns - 1) +
-                            clist->column[clist->columns - 1].area.width, y);
-      
-           gdk_draw_line (clist->clist_window, clist->xor_gc, 
-                          0, y, COLUMN_LEFT_XPIXEL(clist, ctree->tree_column)
-                          + clist->column[ctree->tree_column].area.width -
-                          ctree->tree_indent * level +
-                          (ctree->tree_indent - PM_SIZE) / 2, y);
-           break;
-         }
-      else
-       gdk_draw_line (clist->clist_window, clist->xor_gc, 
-                      0, y, clist->clist_window_width, y);
-      break;
-    case GTK_CMCLIST_DRAG_INTO:
-      y = ROW_TOP_YPIXEL (clist, dest_row_number) + clist->row_height;
-
-      if (clist->column[ctree->tree_column].visible)
-       switch (clist->column[ctree->tree_column].justification)
-         {
-         case GTK_JUSTIFY_CENTER:
-         case GTK_JUSTIFY_FILL:
-         case GTK_JUSTIFY_LEFT:
-           points[0].x =  COLUMN_LEFT_XPIXEL(clist, ctree->tree_column) + 
-             ctree->tree_indent * level - (ctree->tree_indent - PM_SIZE) / 2;
-           points[0].y = y;
-           points[3].x = points[0].x;
-           points[3].y = y - clist->row_height - 1;
-           points[1].x = clist->clist_window_width - 1;
-           points[1].y = points[0].y;
-           points[2].x = points[1].x;
-           points[2].y = points[3].y;
-
-           for (i = 0; i < 3; i++)
-             gdk_draw_line (clist->clist_window, clist->xor_gc,
-                            points[i].x, points[i].y,
-                            points[i+1].x, points[i+1].y);
-
-           if (ctree->tree_column > 0)
-             {
-               points[0].x = COLUMN_LEFT_XPIXEL(clist,
-                                                ctree->tree_column - 1) +
-                 clist->column[ctree->tree_column - 1].area.width ;
-               points[0].y = y;
-               points[3].x = points[0].x;
-               points[3].y = y - clist->row_height - 1;
-               points[1].x = 0;
-               points[1].y = points[0].y;
-               points[2].x = 0;
-               points[2].y = points[3].y;
-
-               for (i = 0; i < 3; i++)
-                 gdk_draw_line (clist->clist_window, clist->xor_gc,
-                                points[i].x, points[i].y, points[i+1].x, 
-                                points[i+1].y);
-             }
-           break;
-         case GTK_JUSTIFY_RIGHT:
-           points[0].x =  COLUMN_LEFT_XPIXEL(clist, ctree->tree_column) - 
-             ctree->tree_indent * level + (ctree->tree_indent - PM_SIZE) / 2 +
-             clist->column[ctree->tree_column].area.width;
-           points[0].y = y;
-           points[3].x = points[0].x;
-           points[3].y = y - clist->row_height - 1;
-           points[1].x = 0;
-           points[1].y = points[0].y;
-           points[2].x = 0;
-           points[2].y = points[3].y;
-
-           for (i = 0; i < 3; i++)
-             gdk_draw_line (clist->clist_window, clist->xor_gc,
-                            points[i].x, points[i].y,
-                            points[i+1].x, points[i+1].y);
-
-           if (ctree->tree_column < clist->columns - 1)
-             {
-               points[0].x = COLUMN_LEFT_XPIXEL(clist, ctree->tree_column +1);
-               points[0].y = y;
-               points[3].x = points[0].x;
-               points[3].y = y - clist->row_height - 1;
-               points[1].x = clist->clist_window_width - 1;
-               points[1].y = points[0].y;
-               points[2].x = points[1].x;
-               points[2].y = points[3].y;
-
-               for (i = 0; i < 3; i++)
-                 gdk_draw_line (clist->clist_window, clist->xor_gc,
-                                points[i].x, points[i].y,
-                                points[i+1].x, points[i+1].y);
-             }
-           break;
-         }
-      else
-       gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE,
-                           0, y - clist->row_height,
-                           clist->clist_window_width - 1, clist->row_height);
-      break;
-    }
-}
-
 static gint
 gtk_cmctree_get_offset(GtkCMCTree     *ctree,
                      GtkCMCTreeRow  *ctree_row,
@@ -5371,14 +5223,12 @@ gtk_cmctree_drag_begin (GtkWidget            *widget,
                      GdkDragContext *context)
 {
   GtkCMCList *clist;
-  GtkCMCTree *ctree;
   gboolean use_icons;
 
   cm_return_if_fail (GTK_IS_CMCTREE (widget));
   cm_return_if_fail (context != NULL);
 
   clist = GTK_CMCLIST (widget);
-  ctree = GTK_CMCTREE (widget);
 
   use_icons = GTK_CMCLIST_USE_DRAG_ICONS (clist);
   GTK_CMCLIST_UNSET_FLAG (clist, CMCLIST_USE_DRAG_ICONS);
@@ -5386,11 +5236,7 @@ gtk_cmctree_drag_begin (GtkWidget             *widget,
 
   if (use_icons)
     {
-      GtkCMCTreeNode *node;
-
       GTK_CMCLIST_SET_FLAG (clist, CMCLIST_USE_DRAG_ICONS);
-      node = GTK_CMCTREE_NODE (g_list_nth (clist->row_list,
-                                        clist->click_cell.row));
       gtk_drag_set_icon_default (context);
     }
 }
@@ -5459,21 +5305,10 @@ gtk_cmctree_drag_motion (GtkWidget      *widget,
              (new_info.cell.row == dest_info->cell.row &&
               dest_info->insert_pos != new_info.insert_pos))
            {
-             if (dest_info->cell.row >= 0)
-               GTK_CMCLIST_GET_CLASS (clist)->draw_drag_highlight
-                 (clist,
-                  g_list_nth (clist->row_list, dest_info->cell.row)->data,
-                  dest_info->cell.row, dest_info->insert_pos);
-
              dest_info->insert_pos  = new_info.insert_pos;
              dest_info->cell.row    = new_info.cell.row;
              dest_info->cell.column = new_info.cell.column;
 
-             GTK_CMCLIST_GET_CLASS (clist)->draw_drag_highlight
-               (clist,
-                g_list_nth (clist->row_list, dest_info->cell.row)->data,
-                dest_info->cell.row, dest_info->insert_pos);
-
              clist->drag_highlight_row = dest_info->cell.row;
              clist->drag_highlight_pos = dest_info->insert_pos;