static void table_wizard_ok_lcb(GtkWidget * widget, Thtml_diag *dg) { gint rows, cols; gchar *tablerowstart, *rowdata, *tablerow, *tablecontent, *finalstring; /* gtk forces the value of one if nothing is entered */ rows = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(dg->spin[1])); cols = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(dg->spin[2])); if (GTK_TOGGLE_BUTTON(dg->check[1])->active) { if (GTK_TOGGLE_BUTTON(dg->check[2])->active) { tablerowstart = cap("\t<TR>"); } else { tablerowstart = cap("<TR>"); } rowdata = bf_str_repeat(cap("<TD></TD>"), cols); } else { tablerowstart = cap("<TR>\n"); if (GTK_TOGGLE_BUTTON(dg->check[2])->active) { rowdata = bf_str_repeat(cap("\t<TD></TD>\n"), cols); } else { rowdata = bf_str_repeat(cap("<TD></TD>\n"), cols); } } tablerow = g_strconcat(tablerowstart, rowdata, cap("</TR>\n"), NULL); g_free(rowdata); tablecontent = bf_str_repeat(tablerow, rows); g_free(tablerow); finalstring = g_strconcat(cap("<TABLE>\n"), tablecontent, cap("</TABLE>"), NULL); g_free(tablecontent); doc_insert_two_strings(dg->bfwin->current_document, finalstring, NULL); g_free(finalstring); html_diag_destroy_cb(NULL, dg); }
/* original version taken from bluefish's (doc_indent_selection) */ gint func_indent( GtkWidget *widget, GdkEventKey *kevent, Tbfwin *bfwin, gint opt) { Tdocument *doc = bfwin->current_document; if (!doc) return 0; gint unindent = opt & FUNC_VALUE_0; GtkTextIter itstart, itend; if ( gtk_text_buffer_get_selection_bounds( doc->buffer, &itstart, &itend ) ) { GtkTextMark * end; doc_unbind_signals( doc ); doc_unre_new_group( doc ); /* we have a selection, now we loop trough the characters, and for every newline we add or remove a tab, we set the end with a mark */ end = gtk_text_buffer_create_mark( doc->buffer, NULL, &itend, TRUE ); if ( gtk_text_iter_get_line_offset( &itstart ) > 0 ) { gtk_text_iter_set_line_index( &itstart, 0 ); } while ( gtk_text_iter_compare( &itstart, &itend ) < 0 ) { GtkTextMark * cur; cur = gtk_text_buffer_create_mark( doc->buffer, NULL, &itstart, TRUE ); if ( unindent ) { /* when unindenting we try to set itend to the end of the indenting step which might be a tab or 'tabsize' spaces, then we delete that part */ gboolean cont = TRUE; gchar *buf = NULL; gunichar cchar = gtk_text_iter_get_char( &itstart ); if ( cchar == 9 ) { /* 9 is ascii for tab */ itend = itstart; cont = gtk_text_iter_forward_char( &itend ); buf = g_strdup( "\t" ); } else if ( cchar == 32 ) { /* 32 is ascii for space */ gint i = 0; itend = itstart; gtk_text_iter_forward_chars( &itend, main_v->props.editor_tab_width ); buf = gtk_text_buffer_get_text( doc->buffer, &itstart, &itend, FALSE ); DEBUG_MSG( "func_indent: tab_width=%d, strlen(buf)=%d, buf='%s'\n", main_v->props.editor_tab_width, strlen( buf ), buf ); while ( cont && buf[ i ] != '\0' ) { cont = ( buf[ i ] == ' ' ); DEBUG_MSG( "func_indent: buf[%d]='%c'\n", i, buf[ i ] ); i++; } if ( !cont ) { g_free ( buf ); } } else { cont = FALSE; } if ( cont ) { gint offsetstart, offsetend; offsetstart = gtk_text_iter_get_offset( &itstart ); offsetend = gtk_text_iter_get_offset( &itend ); gtk_text_buffer_delete( doc->buffer, &itstart, &itend ); doc_unre_add( doc, buf, offsetstart, offsetend, UndoDelete ); g_free ( buf ); } } else { /* indent */ gint offsetstart = gtk_text_iter_get_offset( &itstart ); gchar *indentstring; gint indentlen; if ( main_v->props.view_bars & MODE_INDENT_WITH_SPACES ) { indentstring = bf_str_repeat( " ", main_v->props.editor_tab_width ); indentlen = main_v->props.editor_tab_width; } else { indentstring = g_strdup( "\t" ); indentlen = 1; } gtk_text_buffer_insert( doc->buffer, &itstart, indentstring, indentlen ); doc_unre_add( doc, indentstring, offsetstart, offsetstart + indentlen, UndoInsert ); g_free( indentstring ); } gtk_text_buffer_get_iter_at_mark( doc->buffer, &itstart, cur ); gtk_text_buffer_get_iter_at_mark( doc->buffer, &itend, end ); gtk_text_buffer_delete_mark( doc->buffer, cur ); gtk_text_iter_forward_line( &itstart ); DEBUG_MSG( "func_indent: itstart at %d, itend at %d\n", gtk_text_iter_get_offset( &itstart ), gtk_text_iter_get_offset( &itend ) ); } gtk_text_buffer_delete_mark( doc->buffer, end ); doc_bind_signals( doc ); doc_set_modified( doc, 1 ); } else { /* there is no selection, work on the current line */ GtkTextIter iter; gtk_text_buffer_get_iter_at_mark( doc->buffer, &iter, gtk_text_buffer_get_insert( doc->buffer ) ); gtk_text_iter_set_line_offset( &iter, 0 ); if ( unindent ) { gint deletelen = 0; gchar *tmpstr, *tmp2str; GtkTextIter itend = iter; gtk_text_iter_forward_chars( &itend, main_v->props.editor_tab_width ); tmpstr = gtk_text_buffer_get_text( doc->buffer, &iter, &itend, FALSE ); tmp2str = bf_str_repeat( " ", main_v->props.editor_tab_width ); if ( tmpstr[ 0 ] == '\t' ) { deletelen = 1; } else if ( tmpstr && strncmp( tmpstr, tmp2str, main_v->props.editor_tab_width ) == 0 ) { deletelen = main_v->props.editor_tab_width; } g_free( tmpstr ); g_free( tmp2str ); if ( deletelen ) { itend = iter; gtk_text_iter_forward_chars( &itend, deletelen ); gtk_text_buffer_delete( doc->buffer, &iter, &itend ); } } else { /* indent */ gchar *indentstring; gint indentlen; if ( main_v->props.view_bars & MODE_INDENT_WITH_SPACES ) { indentstring = bf_str_repeat( " ", main_v->props.editor_tab_width ); indentlen = main_v->props.editor_tab_width; } else { indentstring = g_strdup( "\t" ); indentlen = 1; } gtk_text_buffer_insert( doc->buffer, &iter, indentstring, indentlen ); g_free( indentstring ); } } return 1; }