Commit ff8a1c99168fa72c33424b662c6e24d16d759bb4
1 parent
39d44a90
Exists in
master
and in
1 other branch
Adding html support in the "copy as table" method.
Showing
4 changed files
with
100 additions
and
15 deletions
Show diff stats
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 |