Commit ff8a1c99168fa72c33424b662c6e24d16d759bb4

Authored by Perry Werneck
1 parent 39d44a90
Exists in master and in 1 other branch develop

Adding html support in the "copy as table" method.

src/include/clipboard.h
@@ -47,8 +47,17 @@ @@ -47,8 +47,17 @@
47 CLIPBOARD_TYPE_HTML, 47 CLIPBOARD_TYPE_HTML,
48 }; 48 };
49 49
  50 + struct ColumnDescription
  51 + {
  52 + unsigned int begin;
  53 + unsigned int width;
  54 + };
  55 +
  56 +
50 G_GNUC_INTERNAL void v3270_update_system_clipboard(GtkWidget *widget); 57 G_GNUC_INTERNAL void v3270_update_system_clipboard(GtkWidget *widget);
51 G_GNUC_INTERNAL const char * v3270_update_selected_text(GtkWidget *widget, gboolean cut); 58 G_GNUC_INTERNAL const char * v3270_update_selected_text(GtkWidget *widget, gboolean cut);
  59 + G_GNUC_INTERNAL GList * v3270_getColumns_from_selection(v3270 * terminal);
  60 +
52 61
53 /// @brief Get formatted contents as single text. 62 /// @brief Get formatted contents as single text.
54 G_GNUC_INTERNAL gchar * v3270_get_copy_as_text(v3270 * terminal); 63 G_GNUC_INTERNAL gchar * v3270_get_copy_as_text(v3270 * terminal);
src/selection/html.c
@@ -143,8 +143,92 @@ static gchar * get_as_div(v3270 * terminal) @@ -143,8 +143,92 @@ static gchar * get_as_div(v3270 * terminal)
143 143
144 } 144 }
145 145
  146 +/// @brief Get formatted contents as HTML TABLE.
  147 +static gchar * get_as_table(v3270 * terminal)
  148 +{
  149 + GList * element = terminal->selection.blocks;
  150 + GString * string = g_string_new("");
  151 +
  152 + unsigned int width = lib3270_get_width(terminal->host);
  153 + g_autofree gchar * line = g_malloc0(width+1);
  154 +
  155 + GList * column;
  156 +
  157 + g_string_append_printf(
  158 + string,
  159 + "<table style=\"font-family:%s,monospace\"><tbody>",
  160 + terminal->font.family
  161 + );
  162 +
  163 + // Get contents
  164 + GList * columns = v3270_getColumns_from_selection(terminal);
  165 +
  166 + while(element)
  167 + {
  168 + lib3270_selection * block = ((lib3270_selection *) element->data);
  169 +
  170 + unsigned int row, col, src = 0;
  171 +
  172 + for(row=0; row < block->bounds.height; row++)
  173 + {
  174 +
  175 + // Build text line with selected data.
  176 + memset(line,' ',width);
  177 + for(col=0; col<block->bounds.width; col++)
  178 + {
  179 + if(block->contents[src].flags & LIB3270_ATTR_SELECTED)
  180 + {
  181 + line[block->bounds.col+col] = block->contents[src].chr;
  182 + }
  183 +
  184 + src++;
  185 + }
  186 +
  187 + g_string_append(string,"<tr>");
  188 +
  189 + // Extract columns
  190 + for(column = columns; column; column = column->next)
  191 + {
  192 + struct ColumnDescription * columndescription = (struct ColumnDescription *) column->data;
  193 +
  194 + g_string_append_printf(string,"<td>");
  195 + g_string_append_len(string,line+columndescription->begin,columndescription->width);
  196 + g_string_append(string,"</td>");
  197 +
  198 + }
  199 +
  200 + g_string_append(string,"</tr>");
  201 +
  202 +#ifdef DEBUG
  203 + g_string_append_c(string,'\n');
  204 +#endif // DEBUG
  205 +
  206 + }
  207 +
  208 + element = g_list_next(element);
  209 + }
  210 +
  211 + g_list_free_full(columns,g_free);
  212 +
  213 +#ifdef DEBUG
  214 + g_string_append_c(string,'\n');
  215 +#endif // DEBUG
  216 +
  217 + g_string_append(string,"</tbody></table>");
  218 +
  219 + return g_string_free(string,FALSE);
  220 +
  221 +}
  222 +
  223 +
146 gchar * v3270_get_copy_as_html(v3270 * terminal) 224 gchar * v3270_get_copy_as_html(v3270 * terminal)
147 { 225 {
148 - g_autofree char * text = get_as_div(terminal); 226 + g_autofree char * text = NULL;
  227 +
  228 + if(terminal->selection.format == V3270_SELECT_TABLE)
  229 + text = get_as_table(terminal);
  230 + else
  231 + text = get_as_div(terminal);
  232 +
149 return g_convert(text, -1, "UTF-8", lib3270_get_display_charset(terminal->host), NULL, NULL, NULL); 233 return g_convert(text, -1, "UTF-8", lib3270_get_display_charset(terminal->host), NULL, NULL, NULL);
150 } 234 }
src/selection/linux/copy.c
@@ -59,18 +59,15 @@ static void clipboard_get(G_GNUC_UNUSED GtkClipboard *clipboard, GtkSelectionDa @@ -59,18 +59,15 @@ static void clipboard_get(G_GNUC_UNUSED GtkClipboard *clipboard, GtkSelectionDa
59 { 59 {
60 gchar *text; 60 gchar *text;
61 61
  62 +#ifdef DEBUG
  63 + text = v3270_get_copy_as_html(terminal);
  64 +#else
62 if(terminal->selection.format == V3270_SELECT_TABLE) 65 if(terminal->selection.format == V3270_SELECT_TABLE)
63 - {  
64 text = v3270_get_copy_as_table(terminal,"\t"); 66 text = v3270_get_copy_as_table(terminal,"\t");
65 - }  
66 else 67 else
67 - {  
68 -#ifdef DEBUG  
69 - text = v3270_get_copy_as_html(terminal);  
70 -#else  
71 text = v3270_get_copy_as_text(terminal); 68 text = v3270_get_copy_as_text(terminal);
72 #endif // DEBUG 69 #endif // DEBUG
73 - } 70 +
74 gtk_selection_data_set_text(selection,text,-1); 71 gtk_selection_data_set_text(selection,text,-1);
75 g_free(text); 72 g_free(text);
76 } 73 }
src/selection/table.c
@@ -31,11 +31,6 @@ @@ -31,11 +31,6 @@
31 #include <ctype.h> 31 #include <ctype.h>
32 #include <lib3270/selection.h> 32 #include <lib3270/selection.h>
33 33
34 - struct ColumnDescription {  
35 - unsigned int begin;  
36 - unsigned int width;  
37 - };  
38 -  
39 /*--[ Implement ]------------------------------------------------------------------------------------*/ 34 /*--[ Implement ]------------------------------------------------------------------------------------*/
40 35
41 /// @brief Check if column has data. 36 /// @brief Check if column has data.
@@ -70,7 +65,7 @@ static gboolean hasDataOnColumn(v3270 * terminal, unsigned int col) @@ -70,7 +65,7 @@ static gboolean hasDataOnColumn(v3270 * terminal, unsigned int col)
70 } 65 }
71 66
72 /// @brief Get column list. 67 /// @brief Get column list.
73 -GList * getColumns(v3270 * terminal) 68 +GList * v3270_getColumns_from_selection(v3270 * terminal)
74 { 69 {
75 unsigned int col = 0; 70 unsigned int col = 0;
76 GList *rc = NULL; 71 GList *rc = NULL;
@@ -108,7 +103,7 @@ gchar * v3270_get_copy_as_table(v3270 * terminal, const gchar *delimiter) @@ -108,7 +103,7 @@ gchar * v3270_get_copy_as_table(v3270 * terminal, const gchar *delimiter)
108 { 103 {
109 GString * string = g_string_new(""); 104 GString * string = g_string_new("");
110 105
111 - GList * columns = getColumns(terminal); 106 + GList * columns = v3270_getColumns_from_selection(terminal);
112 107
113 debug("columns=%p",columns); 108 debug("columns=%p",columns);
114 109