Branch: refs/heads/master Author: Sylvan Mostert smostert.dev@gmail.com Committer: Sylvan Mostert smostert.dev@gmail.com Date: Fri, 09 Sep 2016 05:47:54 UTC Commit: 867ffbd11e63975a89ace2fdfa8c93a03b79de2b https://github.com/geany/geany-plugins/commit/867ffbd11e63975a89ace2fdfa8c93...
Log Message: ----------- lineoperations: added some ui changes
Added a message to statusbar to display number of lines changed.
Changed some variable names for clarity, added some spacing.
Modified Paths: -------------- lineoperations/src/linefunctions.c lineoperations/src/linefunctions.h lineoperations/src/lineoperations.c
Modified: lineoperations/src/linefunctions.c 36 lines changed, 19 insertions(+), 17 deletions(-) =================================================================== @@ -41,7 +41,7 @@ compare_desc(const void * a, const void * b)
/* Remove Duplicate Lines, sorted */ void -rmdupst(GeanyDocument *doc, gchar **lines, gint num_lines, gchar *new_file) +rmdupst(gchar **lines, gint num_lines, gchar *new_file) { gchar *nf_end = new_file; /* points to last char of new_file */ gchar *lineptr = (gchar *)""; /* temporary line pointer */ @@ -64,7 +64,7 @@ rmdupst(GeanyDocument *doc, gchar **lines, gint num_lines, gchar *new_file)
/* Remove Duplicate Lines, ordered */ void -rmdupln(GeanyDocument *doc, gchar **lines, gint num_lines, gchar *new_file) +rmdupln(gchar **lines, gint num_lines, gchar *new_file) { gchar *nf_end = new_file; /* points to last char of new_file */ gint i = 0; /* iterator */ @@ -105,7 +105,7 @@ rmdupln(GeanyDocument *doc, gchar **lines, gint num_lines, gchar *new_file)
/* Remove Unique Lines */ void -rmunqln(GeanyDocument *doc, gchar **lines, gint num_lines, gchar *new_file) +rmunqln(gchar **lines, gint num_lines, gchar *new_file) { gchar *nf_end = new_file; /* points to last char of new_file */ gint i = 0; /* iterator */ @@ -142,7 +142,7 @@ rmunqln(GeanyDocument *doc, gchar **lines, gint num_lines, gchar *new_file)
/* Remove Empty Lines */ void -rmemtyln(GeanyDocument *doc, gint line_num, gint end_line_num) +rmemtyln(ScintillaObject *sci, gint line_num, gint end_line_num) {
while(line_num <= end_line_num) /* loop through lines */ @@ -151,10 +151,11 @@ rmemtyln(GeanyDocument *doc, gint line_num, gint end_line_num) if(sci_get_position_from_line(sci, line_num) == sci_get_line_end_position (sci, line_num)) { - scintilla_send_message(doc->editor->sci, + scintilla_send_message(sci, SCI_DELETERANGE, - sci_get_position_from_line(doc->editor->sci, line_num), - sci_get_line_length(doc->editor->sci, line_num)); + sci_get_position_from_line(sci, line_num), + sci_get_line_length(sci, line_num)); + line_num--; end_line_num--; } @@ -165,26 +166,27 @@ rmemtyln(GeanyDocument *doc, gint line_num, gint end_line_num)
/* Remove Whitespace Lines */ void -rmwhspln(GeanyDocument *doc, gint line_num, gint end_line_num) +rmwhspln(ScintillaObject *sci, gint line_num, gint end_line_num) { gint indent; /* indent position */
while(line_num <= end_line_num) /* loop through lines */ { - indent = scintilla_send_message(doc->editor->sci, + indent = scintilla_send_message(sci, SCI_GETLINEINDENTPOSITION, line_num, 0);
/* check if the posn of indentation is also the end of line posn */ if(indent - - sci_get_position_from_line(doc->editor->sci, line_num) == - sci_get_line_end_position (doc->editor->sci, line_num)- - sci_get_position_from_line(doc->editor->sci, line_num)) + sci_get_position_from_line(sci, line_num) == + sci_get_line_end_position (sci, line_num) - + sci_get_position_from_line(sci, line_num)) { - scintilla_send_message(doc->editor->sci, + scintilla_send_message(sci, SCI_DELETERANGE, - sci_get_position_from_line(doc->editor->sci, line_num), - sci_get_line_length(doc->editor->sci, line_num)); + sci_get_position_from_line(sci, line_num), + sci_get_line_length(sci, line_num)); + line_num--; end_line_num--; } @@ -196,7 +198,7 @@ rmwhspln(GeanyDocument *doc, gint line_num, gint end_line_num)
/* Sort Lines Ascending */ void -sortlnsasc(GeanyDocument *doc, gchar **lines, gint num_lines, gchar *new_file) +sortlnsasc(gchar **lines, gint num_lines, gchar *new_file) { gchar *nf_end = new_file; /* points to last char of new_file */ gint i; @@ -211,7 +213,7 @@ sortlnsasc(GeanyDocument *doc, gchar **lines, gint num_lines, gchar *new_file)
/* Sort Lines Descending */ void -sortlndesc(GeanyDocument *doc, gchar **lines, gint num_lines, gchar *new_file) +sortlndesc(gchar **lines, gint num_lines, gchar *new_file) { gchar *nf_end = new_file; /* points to last char of new_file */ gint i;
Modified: lineoperations/src/linefunctions.h 14 lines changed, 7 insertions(+), 7 deletions(-) =================================================================== @@ -31,37 +31,37 @@
/* Remove Duplicate Lines, sorted */ -void +gint rmdupst(gchar **lines, gint num_lines, gchar *new_file);
/* Remove Duplicate Lines, ordered */ -void +gint rmdupln(gchar **lines, gint num_lines, gchar *new_file);
/* Remove Unique Lines */ -void +gint rmunqln(gchar **lines, gint num_lines, gchar *new_file);
/* Remove Empty Lines */ -void +gint rmemtyln(ScintillaObject *sci, gint line_num, gint end_line_num);
/* Remove Whitespace Lines */ -void +gint rmwhspln(ScintillaObject *sci, gint line_num, gint end_line_num);
/* Sort Lines Ascending */ -void +gint sortlnsasc(gchar **lines, gint num_lines, gchar *new_file);
/* Sort Lines Descending */ -void +gint sortlndesc(gchar **lines, gint num_lines, gchar *new_file);
#endif
Modified: lineoperations/src/lineoperations.c 117 lines changed, 81 insertions(+), 36 deletions(-) =================================================================== @@ -31,25 +31,25 @@ static GtkWidget *main_menu_item = NULL;
-/* represents lines that will have Operation applied to */ +/* represents a selection of lines that will have Operation applied to */ struct lo_lines { gboolean is_selection; - gint start_posn_line; - gint end_posn_line; + gint start_line; + gint end_line; };
-/* selects lines in document (based of lo_lines struct parameter) */ +/* selects lines in document (based off of lo_lines struct parameter) */ static void select_lines(GeanyEditor *editor, struct lo_lines sel) { /* set the selection to beginning of first line */ sci_set_selection_start(editor->sci, - sci_get_position_from_line(editor->sci, sel.start_posn_line)); + sci_get_position_from_line(editor->sci, sel.start_line));
/* set the selection to end of last line */ sci_set_selection_end(editor->sci, - sci_get_line_end_position(editor->sci, sel.end_posn_line) + + sci_get_line_end_position(editor->sci, sel.end_line) + editor_get_eol_char_len(editor)); }
@@ -70,11 +70,11 @@ get_current_sel_lines(ScintillaObject *sci) end_posn = sci_get_selection_end (sci);
/* get the line number of those positions */ - sel.start_posn_line = scintilla_send_message(sci, + sel.start_line = scintilla_send_message(sci, SCI_LINEFROMPOSITION, start_posn, 0);
- sel.end_posn_line = scintilla_send_message(sci, + sel.end_line = scintilla_send_message(sci, SCI_LINEFROMPOSITION, end_posn, 0);
@@ -83,9 +83,9 @@ get_current_sel_lines(ScintillaObject *sci) else { /* if there is no selection, start at first line */ - sel.start_posn_line = 0; + sel.start_line = 0; /* and end at last one */ - sel.end_posn_line = (sci_get_line_count(sci) - 1); + sel.end_line = (sci_get_line_count(sci) - 1);
sel.is_selection = FALSE; } @@ -96,44 +96,89 @@ get_current_sel_lines(ScintillaObject *sci)
/* altered from geany/src/editor.c, ensure new line at file end */ static void -ensure_final_newline(GeanyEditor *editor, gint max_lines) +ensure_final_newline(GeanyEditor *editor, gint *num_lines, struct lo_lines *sel) { - gint end_document = sci_get_position_from_line(editor->sci, max_lines); + gint end_document = sci_get_position_from_line(editor->sci, (*num_lines)); gboolean append_newline = end_document > - sci_get_position_from_line(editor->sci, max_lines - 1); + sci_get_position_from_line(editor->sci, ((*num_lines) - 1));
if (append_newline) { const gchar *eol = editor_get_eol_char(editor); sci_insert_text(editor->sci, end_document, eol); + (*num_lines)++; + (*sel).end_line++; + } +} + + +/* set statusbar with message and select altered lines */ +static void +user_indicate(GeanyEditor *editor, gint lines_affected, struct lo_lines sel) +{ + if(lines_affected < 0) + { + ui_set_statusbar(FALSE, _("Operation successful! %d lines removed."), + -lines_affected); + + /* select lines to indicate to user what lines were altered */ + sel.end_line += lines_affected; + + if(sel.is_selection) + select_lines(editor, sel); + } + else if(lines_affected == 0) + { + ui_set_statusbar(FALSE, _("Operation successful! No lines removed.")); + + /* select lines to indicate to user what lines were altered */ + if(sel.is_selection) + select_lines(editor, sel); + } + else + { + ui_set_statusbar(FALSE, _("Operation successful! %d lines affected."), + lines_affected); + + /* select lines to indicate to user what lines were altered */ + if(sel.is_selection) + select_lines(editor, sel); } }
/* * Menu action for functions with indirect scintilla manipulation - * e.g. functions requiring **lines array, *new_file... + * e.g. functions requiring **lines array, num_lines, *new_file */ static void action_indir_manip_item(GtkMenuItem *menuitem, gpointer gdata) { - /* function pointer to gdata -- function to be used */ - void (*func)(gchar **lines, gint num_lines, gchar *new_file) = gdata; + /* function pointer to function to be used */ + gint (*func)(gchar **lines, gint num_lines, gchar *new_file) = gdata; + GeanyDocument *doc = document_get_current();
- GeanyDocument *doc = document_get_current(); - struct lo_lines sel = get_current_sel_lines(doc->editor->sci); - gint num_chars = 0; - gint num_lines = (sel.end_posn_line - sel.start_posn_line) + 1; - gchar **lines = g_malloc(sizeof(gchar *) * num_lines); - gint i = 0; + struct lo_lines sel = get_current_sel_lines(doc->editor->sci); + gint num_lines = (sel.end_line - sel.start_line) + 1; + + gint num_chars = 0; + gint i = 0; + gint lines_affected = 0; + + + /* if last line within selection ensure that the file ends with newline */ + if((sel.end_line + 1) == sci_get_line_count(doc->editor->sci)) + ensure_final_newline(doc->editor, &num_lines, &sel);
/* get num_chars and **lines */ + gchar **lines = g_malloc(sizeof(gchar *) * num_lines); for(i = 0; i < num_lines; i++) { num_chars += (sci_get_line_length(doc->editor->sci, - (i + sel.start_posn_line))); + (i + sel.start_line))); + lines[i] = sci_get_line(doc->editor->sci, - (i + sel.start_posn_line)); + (i + sel.start_line)); }
gchar *new_file = g_malloc(sizeof(gchar) * (num_chars + 1)); @@ -144,21 +189,19 @@ action_indir_manip_item(GtkMenuItem *menuitem, gpointer gdata)
sci_start_undo_action(doc->editor->sci);
- /* if file is not empty, ensure that the file ends with newline */ - if((!sel.is_selection && num_lines != 1) || (sel.is_selection && - sel.end_posn_line == (sci_get_line_count(doc->editor->sci) - 1))) - { - ensure_final_newline(doc->editor, num_lines); - }
- if(doc) func(lines, num_lines, new_file); + if(doc) + lines_affected = func(lines, num_lines, new_file); +
/* set new document */ if(sci_has_selection(doc->editor->sci)) sci_replace_sel(doc->editor->sci, new_file); else sci_set_text(doc->editor->sci, new_file);
+ user_indicate(doc->editor, lines_affected, sel); + sci_end_undo_action(doc->editor->sci);
/* free used memory */ @@ -178,17 +221,19 @@ static void action_sci_manip_item(GtkMenuItem *menuitem, gpointer gdata) { /* function pointer to gdata -- function to be used */ - void (*func)(ScintillaObject *, gint, gint) = gdata; + gint (*func)(ScintillaObject *, gint, gint) = gdata; GeanyDocument *doc = document_get_current(); struct lo_lines sel = get_current_sel_lines(doc->editor->sci); + gint lines_affected = 0;
- /* select lines to indicate to user what lines were altered */ - if(sel.is_selection) - select_lines(doc->editor, sel);
sci_start_undo_action(doc->editor->sci);
- if(doc) func(doc->editor->sci, sel.start_posn_line, sel.end_posn_line); + if(doc) + lines_affected = func(doc->editor->sci, sel.start_line, sel.end_line); + + /* put message in ui_statusbar, and highlight lines that were affected */ + user_indicate(doc->editor, lines_affected, sel);
sci_end_undo_action(doc->editor->sci); }
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
plugins-commits@lists.geany.org