[gnumeric] Improve comment items of in-cell pop-up menu.



commit 42e33b0ecdeabc686aa6455cf3f6c050f98e52a9
Author: Andreas J Guelzow <aguelzow pyrshep ca>
Date:   Tue Jul 6 11:25:38 2010 -0600

    Improve comment items of in-cell pop-up menu.
    
    2010-07-06  Andreas J. Guelzow <aguelzow pyrshep ca>
    
    	* src/gui-util.h (GnumericPopupMenuElement): add field
    	* src/gui-util.c (gnumeric_create_popup_menu): handle new field
    	* src/sheet-control-gui.c (context_menu_handler): handle removal
    	  and cretion of comments
    	(scg_context_menu): add new items for comment addition and removal

 ChangeLog               |    8 ++++
 NEWS                    |    1 +
 src/gui-util.c          |   16 +++++++-
 src/gui-util.h          |    2 +
 src/sheet-control-gui.c |   89 ++++++++++++++++++++++++++++++++++++++---------
 5 files changed, 97 insertions(+), 19 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index e6d1d38..925e01d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2010-07-06  Andreas J. Guelzow <aguelzow pyrshep ca>
+
+	* src/gui-util.h (GnumericPopupMenuElement): add field
+	* src/gui-util.c (gnumeric_create_popup_menu): handle new field
+	* src/sheet-control-gui.c (context_menu_handler): handle removal
+	  and cretion of comments
+	(scg_context_menu): add new items for comment addition and removal
+
 2010-07-06  Jean Brefort  <jean brefort normalesup org>
 
 	* src/item-edit.c (get_top_left), (item_edit_draw),
diff --git a/NEWS b/NEWS
index 6f81147..e3189ab 100644
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,7 @@ Andreas:
 	* Fix additional undo entry for sheet object duplication. [#623559]
 	* Fix undo of object creation followed by duplication. [#623566]
 	* Avoid creating interacting auto filters. [#607086]
+	* Improve comment items of in-cell pop-up menu.
 
 Jean:
 	* Fix strong/weak cursor display. [#623241]
diff --git a/src/gui-util.c b/src/gui-util.c
index a512542..0486a4b 100644
--- a/src/gui-util.c
+++ b/src/gui-util.c
@@ -568,11 +568,19 @@ gnumeric_create_popup_menu (GnumericPopupMenuElement const *element,
 		item = NULL;
 
 		if (element->display_filter != 0 &&
-		    !(element->display_filter & display_filter))
+		    !(element->display_filter & display_filter)) {
+			if (element->allocated_name) {
+				g_free (element->allocated_name);
+				*(gchar **)(&element->allocated_name) = NULL;
+			}
 			continue;
+		}
 
 		if (name != NULL && *name != '\0') {
-			trans = _(name);
+			if (element->allocated_name)
+				trans = element->allocated_name;
+			else
+				trans = _(name);
 			item = gtk_image_menu_item_new_with_mnemonic (trans);
 			if (element->sensitive_filter != 0 &&
 			    (element->sensitive_filter & sensitive_filter))
@@ -585,6 +593,10 @@ gnumeric_create_popup_menu (GnumericPopupMenuElement const *element,
 					GTK_IMAGE_MENU_ITEM (item),
 					image);
 			}
+			if (element->allocated_name) {
+				g_free (element->allocated_name);
+				*(gchar **)(&element->allocated_name) = NULL;
+			}
 		} else if (element->index >= 0) {
 			/* separator */
 			item = gtk_menu_item_new ();
diff --git a/src/gui-util.h b/src/gui-util.h
index 6abed6d..2c929ee 100644
--- a/src/gui-util.h
+++ b/src/gui-util.h
@@ -55,6 +55,8 @@ typedef struct {
 	int sensitive_filter;
 
 	int index;
+
+	char *allocated_name;
 } GnumericPopupMenuElement;
 
 typedef gboolean (*GnumericPopupMenuHandler) (GnumericPopupMenuElement const *e,
diff --git a/src/sheet-control-gui.c b/src/sheet-control-gui.c
index b57890d..6c23615 100644
--- a/src/sheet-control-gui.c
+++ b/src/sheet-control-gui.c
@@ -1780,6 +1780,8 @@ enum {
 	CONTEXT_ROW_HIDE,
 	CONTEXT_ROW_UNHIDE,
 	CONTEXT_COMMENT_EDIT,
+	CONTEXT_COMMENT_ADD,
+	CONTEXT_COMMENT_REMOVE,
 	CONTEXT_HYPERLINK_EDIT,
 	CONTEXT_HYPERLINK_ADD,
 	CONTEXT_HYPERLINK_REMOVE,
@@ -1844,9 +1846,12 @@ context_menu_handler (GnumericPopupMenuElement const *element,
 		cmd_selection_colrow_hide (wbc, FALSE, TRUE);
 		break;
 	case CONTEXT_COMMENT_EDIT:
+	case CONTEXT_COMMENT_ADD:
 		dialog_cell_comment (wbcg, sheet, &sv->edit_pos);
 		break;
-
+	case CONTEXT_COMMENT_REMOVE:
+		cmd_selection_clear (WORKBOOK_CONTROL (wbcg), CLEAR_COMMENTS);
+		break;
 	case CONTEXT_HYPERLINK_EDIT:
 	case CONTEXT_HYPERLINK_ADD:
 		dialog_hyperlink (wbcg, sc);
@@ -1887,7 +1892,10 @@ scg_context_menu (SheetControlGUI *scg, GdkEventButton *event,
 		CONTEXT_DISPLAY_WITHOUT_HYPERLINK	= 1 << 4,
 		CONTEXT_DISPLAY_WITH_DATA_SLICER	= 1 << 5,
 		CONTEXT_DISPLAY_WITH_DATA_SLICER_ROW	= 1 << 6,
-		CONTEXT_DISPLAY_WITH_DATA_SLICER_COL	= 1 << 7
+		CONTEXT_DISPLAY_WITH_DATA_SLICER_COL	= 1 << 7,
+		CONTEXT_DISPLAY_WITH_COMMENT		= 1 << 8,
+		CONTEXT_DISPLAY_WITHOUT_COMMENT	        = 1 << 9,
+		CONTEXT_DISPLAY_WITH_COMMENT_IN_RANGE	= 1 << 10
 	};
 	enum {
 		CONTEXT_DISABLE_PASTE_SPECIAL	= 1,
@@ -1895,7 +1903,31 @@ scg_context_menu (SheetControlGUI *scg, GdkEventButton *event,
 		CONTEXT_DISABLE_FOR_COLS	= 4
 	};
 
-	static GnumericPopupMenuElement const popup_elements[] = {
+	/* Note: keep the following two in sync!*/
+	enum {
+		POPUPITEM_CUT = 0,
+		POPUPITEM_COPY,
+		POPUPITEM_PASTE,
+		POPUPITEM_PASTESPECIAL,
+		POPUPITEM_SEP1,
+		POPUPITEM_INSERT_CELL,
+		POPUPITEM_DELETE_CELL,
+		POPUPITEM_INSERT_COLUMN,
+		POPUPITEM_DELETE_COLUMN,
+		POPUPITEM_INSERT_ROW,
+		POPUPITEM_DELETE_ROW,
+		POPUPITEM_CLEAR_CONTENTS,
+		POPUPITEM_SEP2,
+		POPUPITEM_COMMENT_ADD,
+		POPUPITEM_COMMENT_EDIT,
+		POPUPITEM_COMMENT_REMOVE,
+		POPUPITEM_LINK_ADD,
+		POPUPITEM_LINK_EDIT,
+		POPUPITEM_LINK_REMOVE,
+		POPUPITEM_SEP3
+	};
+
+	static GnumericPopupMenuElement popup_elements[] = { 
 		{ N_("Cu_t"),           GTK_STOCK_CUT,
 		    0, 0, CONTEXT_CUT },
 		{ N_("_Copy"),          GTK_STOCK_COPY,
@@ -1929,10 +1961,26 @@ scg_context_menu (SheetControlGUI *scg, GdkEventButton *event,
 
 		{ N_("Clear Co_ntents"), GTK_STOCK_CLEAR,
 		    0, 0, CONTEXT_CLEAR_CONTENT },
+
+		{ "", NULL, CONTEXT_DISPLAY_FOR_CELLS, 0, 0 },
+
+		{ N_("Add _Co_mment"),	  "Gnumeric_CommentAdd",
+		    CONTEXT_DISPLAY_WITHOUT_COMMENT, 0, CONTEXT_COMMENT_ADD },
 		{ N_("Edit Co_mment..."),"Gnumeric_CommentEdit",
-		    0, 0, CONTEXT_COMMENT_EDIT },
+		    CONTEXT_DISPLAY_WITH_COMMENT, 0, CONTEXT_COMMENT_EDIT },
+		{ N_("_Remove Comments"),	  "Gnumeric_CommentDelete",
+		    CONTEXT_DISPLAY_WITH_COMMENT_IN_RANGE, 0, CONTEXT_COMMENT_REMOVE },
+
+		{ N_("Add _Hyperlink"),	  "Gnumeric_Link_Add",
+		    CONTEXT_DISPLAY_WITHOUT_HYPERLINK, 0,
+		    CONTEXT_HYPERLINK_ADD },
+		{ N_("Edit _Hyperlink"),	  "Gnumeric_Link_Edit",
+		    CONTEXT_DISPLAY_WITH_HYPERLINK, 0,
+		    CONTEXT_HYPERLINK_EDIT },
+		{ N_("_Remove Hyperlink"),	  "Gnumeric_Link_Delete",
+		    CONTEXT_DISPLAY_WITH_HYPERLINK, 0,
+		    CONTEXT_HYPERLINK_REMOVE },
 
-		/* TODO : Add the comment modification elements */
 		{ "", NULL, 0, 0, 0 },
 
 		{ N_("_Edit DataSlicer"),	NULL,
@@ -1980,16 +2028,6 @@ scg_context_menu (SheetControlGUI *scg, GdkEventButton *event,
 		{ N_("_Unhide"),	  "Gnumeric_RowUnhide",
 		    CONTEXT_DISPLAY_FOR_ROWS, 0, CONTEXT_ROW_UNHIDE },
 
-		{ N_("_Hyperlink"),	  "Gnumeric_Link_Add",
-		    CONTEXT_DISPLAY_WITHOUT_HYPERLINK, 0,
-		    CONTEXT_HYPERLINK_ADD },
-		{ N_("Edit _Hyperlink"),	  "Gnumeric_Link_Edit",
-		    CONTEXT_DISPLAY_WITH_HYPERLINK, 0,
-		    CONTEXT_HYPERLINK_EDIT },
-		{ N_("_Remove Hyperlink"),	  "Gnumeric_Link_Delete",
-		    CONTEXT_DISPLAY_WITH_HYPERLINK, 0,
-		    CONTEXT_HYPERLINK_REMOVE },
-
 		{ NULL, NULL, 0, 0, 0 },
 	};
 
@@ -2008,7 +2046,8 @@ scg_context_menu (SheetControlGUI *scg, GdkEventButton *event,
 		? 0 : CONTEXT_DISABLE_PASTE_SPECIAL;
 
 	GSList *l;
-	gboolean has_link = FALSE;
+	gboolean has_link = FALSE, has_comment = FALSE;
+	int n_comments = 0;
 	GnmSheetSlicer *slicer;
 
 	wbcg_edit_finish (scg->wbcg, WBC_EDIT_REJECT, NULL);
@@ -2019,6 +2058,7 @@ scg_context_menu (SheetControlGUI *scg, GdkEventButton *event,
 	 */
 	for (l = scg_view (scg)->selections; l != NULL; l = l->next) {
 		GnmRange const *r = l->data;
+		GSList *objs;
 
 		if (r->start.row == 0 && r->end.row == gnm_sheet_get_last_row (sheet))
 			sensitivity_filter |= CONTEXT_DISABLE_FOR_ROWS;
@@ -2028,7 +2068,11 @@ scg_context_menu (SheetControlGUI *scg, GdkEventButton *event,
 
 		if (!has_link && sheet_style_region_contains_link (sheet, r))
 			has_link = TRUE;
+		objs = sheet_objects_get (sheet, r, CELL_COMMENT_TYPE);
+		n_comments += g_slist_length (objs);
+		g_slist_free (objs);
 	}
+	has_comment = (sheet_get_comment (sheet, &sv->edit_pos) != NULL);
 
 	slicer = sv_editpos_in_slicer (scg_view (scg));
 	/* FIXME: disabled for now */
@@ -2044,9 +2088,20 @@ scg_context_menu (SheetControlGUI *scg, GdkEventButton *event,
 		display_filter &= ~CONTEXT_DISPLAY_FOR_CELLS;
 	}
 
-	if (display_filter & CONTEXT_DISPLAY_FOR_CELLS)
+	if (display_filter & CONTEXT_DISPLAY_FOR_CELLS) {
+		char const *format;
 		display_filter |= ((has_link) ?
 				   CONTEXT_DISPLAY_WITH_HYPERLINK : CONTEXT_DISPLAY_WITHOUT_HYPERLINK);
+		display_filter |= ((has_comment) ?
+				   CONTEXT_DISPLAY_WITH_COMMENT : CONTEXT_DISPLAY_WITHOUT_COMMENT);
+		display_filter |= ((n_comments > 0) ?
+				   CONTEXT_DISPLAY_WITH_COMMENT_IN_RANGE : CONTEXT_DISPLAY_WITHOUT_COMMENT);
+		if (n_comments > 0) {
+			/* xgettext : %d gives the number of comments. This is input to ngettext. */
+			format = ngettext ("_Remove %d Comment", "_Remove %d Comments", n_comments);
+			popup_elements[POPUPITEM_COMMENT_REMOVE].allocated_name = g_strdup_printf (format, n_comments);
+		}
+	}
 
 	gnumeric_create_popup_menu (popup_elements, &context_menu_handler,
 				    scg, display_filter,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]