Bugfix for disappearing hilight bug and code re-org for text editor

from Ricki Myers (themyers).

Comes with nice juicy commit msg, too!

- source/blender/blenkernel/BKE_text.h

	- Removed indent_paste, uncommen, unindent_lines, comment_paste,
	uncomment_paste, uncomment, set_tabs.

	All these functions cut and re-added text (I felt this was
	unsafe). whicch is was caused the highlight loss.


	- Now the only functions are Indent, Unindent, comment, uncomment,
	  setcurr_tab. 	All these functions only take one @parm (struct Text)

	-indent(struct Text *text)
		copy's the selected text in a MEM_mallocN line by line added a
		tab at the begginning

	- Unindent(struct Text *text)
		Tests if current line starts with a tab.
		if TAB remove it
	- comment(struct Text *text)
		copy's the selected text in a MEM_mallocN and adding a # at the begginning

	- Uncomment(struct Text *text)
		Tests if current line starts with a #.
		if # remove it

	- setcurr_tab (Text *text)
		Checks for Tabs pri. to any text
		if : is found and not in a comment then Tabs is increased by one
		if "return", "break", "pass" is found then Tabs is decreased

- blender/source/blender/src/header_text.c

	Changed:	txt_cut_sel(text);
			indent_paste(text);
	TO:
			txt_order_cursors(text);
			indent(text);
	* no more cutting of the text

- source/blender/src/drawtext.c

	set_tabs(Text *text) just calls setcurr_tab(text);
This commit is contained in:
Stephen Swaney 2005-04-10 14:01:41 +00:00
parent 28064baa5c
commit e8a6bf6fb9
4 changed files with 203 additions and 153 deletions

View File

@ -89,17 +89,11 @@ void run_python_script (struct SpaceText *st);
int jumptoline_interactive (struct SpaceText *st);
void txt_export_to_object (struct Text *text);
void txt_export_to_objects(struct Text *text);
void indent_paste (struct Text *text);
void unindent (struct Text *text);
void comment (struct Text *text);
void uncommen (struct Text *text);
void indent (struct Text *text, char *in_buffer);
void unindent_lines (struct Text *text, char *in_buffer);
void comment_paste (struct Text *text, char *in_buffer);
void uncomment_paste (struct Text *text, char *in_buffer);
void uncomment (struct Text *text);
void set_tabs (struct Text *text);
void indent (struct Text *text);
void uncomment (struct Text *text);
int setcurr_tab (struct Text *text);
/* Undo opcodes */

View File

@ -1990,157 +1990,223 @@ int txt_add_char (Text *text, char add) {
return 1;
}
//Antihc3(rick) used the paste function below
//used txt_cut_sel, txt_insert_buf modified
void indent_paste(Text *text)
void indent(Text *text)
{
indent(text, txt_cut_buffer);
}
void indent(Text *text, char *in_buffer)
{
int i=0, len;
int len, num;
char *tmp;
char add = '\t';
if (!text) return;
if (!text->curl) return;
if (!text->sell) return;
if (!in_buffer) return;
txt_delete_sel(text); //need to change this to remove the undo
/* Read the first line (or as close as possible */
len= strlen(in_buffer);
while ( i < len ) {
txt_add_char(text, '\t');
while (in_buffer[i] && in_buffer[i]!='\n') {
txt_add_char(text, in_buffer[i]);
i++;
}
if (in_buffer[i]=='\n') {
txt_add_char(text, '\n');
num = 0;
while (TRUE)
{
tmp= MEM_mallocN(text->curl->len+2, "textline_string");
text->curc = 0;
if(text->curc) memcpy(tmp, text->curl->line, text->curc);
tmp[text->curc]= add;
len= text->curl->len - text->curc;
if(len>0) memcpy(tmp+text->curc+1, text->curl->line+text->curc, len);
tmp[text->curl->len+1]=0;
make_new_line(text->curl, tmp);
text->curc++;
txt_make_dirty(text);
txt_clean_text(text);
if(text->curl == text->sell)
{
text->selc = text->sell->len;
break;
} else {
text->curl = text->curl->next;
num++;
}
i++;
}
text->curc = 0;
while( num > 0 )
{
text->curl = text->curl->prev;
num--;
}
}
void unindent(Text *text)
{
unindent_lines(text, txt_cut_buffer);
}
void unindent_lines(Text *text, char *in_buffer)
{
int i=0, len;
int num = 0;
if (!text) return;
if (!text->curl) return;
if (!text->sell) return;
if (!in_buffer) return;
txt_delete_sel(text);
/* Read the first line (or as close as possible */
len = strlen(in_buffer);
while ( i < len ) {
if (in_buffer[i] != '\t') {
while (in_buffer[i] && in_buffer[i]!='\n') {
txt_add_char(text, in_buffer[i]);
while(TRUE)
{
int i = 0;
if (text->curl->line[i] == '\t')
{
while(i< text->curl->len) {
text->curl->line[i]= text->curl->line[i+1];
i++;
}
if (in_buffer[i]=='\n') {
txt_add_char(text, '\n');
}
i++;
text->curl->len--;
}
else {
i++;
while (in_buffer[i] && in_buffer[i]!='\n') {
txt_add_char(text, in_buffer[i]);
i++;
}
if (in_buffer[i]=='\n') {
txt_add_char(text, '\n');
}
i++;
txt_make_dirty(text);
txt_clean_text(text);
if(text->curl == text->sell)
{
text->selc = text->sell->len;
break;
} else {
text->curl = text->curl->next;
num++;
}
}
while( num > 0 )
{
text->curl = text->curl->prev;
num--;
}
}
void comment(Text *text)
{
comment_paste(text, txt_cut_buffer);
}
void comment_paste(Text *text, char *in_buffer)
{
int i=0, len;
int len, num;
char *tmp;
char add = '#';
if (!text) return;
if (!text->curl) return;
if (!text->sell) return;
if (!in_buffer) return;
txt_delete_sel(text);
/* Read the first line (or as close as possible */
len= strlen(in_buffer);
while ( i < len ) {
txt_add_char(text, '#');
while (in_buffer[i] && in_buffer[i]!='\n') {
txt_add_char(text, in_buffer[i]);
i++;
}
num = 0;
while (TRUE)
{
tmp= MEM_mallocN(text->curl->len+2, "textline_string");
text->curc = 0;
if(text->curc) memcpy(tmp, text->curl->line, text->curc);
tmp[text->curc]= add;
if (in_buffer[i]=='\n') {
txt_add_char(text, '\n');
}
i++;
len= text->curl->len - text->curc;
if(len>0) memcpy(tmp+text->curc+1, text->curl->line+text->curc, len);
tmp[text->curl->len+1]=0;
make_new_line(text->curl, tmp);
text->curc++;
txt_make_dirty(text);
txt_clean_text(text);
if(text->curl == text->sell)
{
text->selc = text->sell->len;
break;
} else {
text->curl = text->curl->next;
num++;
}
}
while( num > 0 )
{
text->curl = text->curl->prev;
num--;
}
}
void uncomment(Text *text)
{
uncomment_paste(text, txt_cut_buffer);
}
void uncomment_paste(Text *text, char *in_buffer)
{
int num = 0;
int i=0, len;
if (!text) return;
if (!text->curl) return;
if (!text->sell) return;
if (!in_buffer) return;
txt_delete_sel(text);
/* Read the first line (or as close as possible */
len = strlen(in_buffer);
while ( i < len ) {
if (in_buffer[i] != '#') {
while (in_buffer[i] && in_buffer[i]!='\n') {
txt_add_char(text, in_buffer[i]);
while(TRUE)
{
int i = 0;
if (text->curl->line[i] == '#')
{
while(i< text->curl->len) {
text->curl->line[i]= text->curl->line[i+1];
i++;
}
if (in_buffer[i]=='\n') {
txt_add_char(text, '\n');
}
text->curl->len--;
}
i++;
txt_make_dirty(text);
txt_clean_text(text);
if(text->curl == text->sell)
{
text->selc = text->sell->len;
break;
} else {
text->curl = text->curl->next;
num++;
}
}
while( num > 0 )
{
text->curl = text->curl->prev;
num--;
}
}
int setcurr_tab (Text *text)
{
int i = 0;
int test = 0;
char *word = ":";
char *comm = "#";
char back_words[3][7] = {"return", "break", "pass"};
if (!text) return;
if (!text->curl) return;
while (text->curl->line[i] == '\t')
{
//we only count thos tabs that are before any text or before the curs;
if (i == text->curc)
{
return i;
} else {
i++;
}
}
if(strstr(text->curl->line, word))
{
//if we find a : then add a tab but not if it is in a comment
if(strcspn(text->curl->line, word) < strcspn(text->curl->line, comm))
{
i++;
}
}
while(test < 3)
{
//if there are these 3 key words then remove a tab because we are done with the block
if(strstr(text->curl->line, back_words[test]) && i > 0)
{
if(strcspn(text->curl->line, back_words[test]) < strcspn(text->curl->line, comm))
{
i--;
}
}
test++;
}
return i;
}

View File

@ -989,23 +989,10 @@ void run_python_script(SpaceText *st)
}
}
void set_tabs(Text *text) {
TextLine *line = text->curl;
void set_tabs(Text *text)
{
SpaceText *st = curarea->spacedata.first;
int pos = 0;
int max;
max = line->len;
st->currtab_set = 0;
while ( pos < max-1) {
if (line->line[pos] == '\t') {
st->currtab_set++;
pos++;
}
else {
pos++;
}
}
st->currtab_set = setcurr_tab(text);
}
void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
@ -1357,29 +1344,34 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case TABKEY:
if (G.qual & LR_SHIFTKEY) {
if (txt_has_sel(text)) {
txt_cut_sel(text);
txt_order_cursors(text);
unindent(text);
}
} else {
if ( txt_has_sel(text)) {
txt_cut_sel(text);
indent_paste(text);
txt_order_cursors(text);
indent(text);
} else {
txt_add_char(text, '\t');
st->currtab_set++;
}
}
pop_space_text(st);
do_draw= 1;
st->currtab_set = setcurr_tab(text);
break;
case RETKEY:
//double check tabs before splitting the line
st->currtab_set = setcurr_tab(text);
txt_split_curline(text);
{
int a = 0;
while ( a < st->currtab_set) {
txt_add_char(text, '\t');
a++;
if (a < st->currtab_set)
{
while ( a < st->currtab_set) {
txt_add_char(text, '\t');
a++;
}
}
}
do_draw= 1;
@ -1392,12 +1384,10 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
pop_space_text(st);
break;
case DELKEY:
if ( text->curl->line[text->curc] == '\t') {
st->currtab_set--;
}
txt_delete_char(text);
do_draw= 1;
pop_space_text(st);
st->currtab_set = setcurr_tab(text);
break;
case DOWNARROWKEY:
txt_move_down(text, G.qual & LR_SHIFTKEY);

View File

@ -341,8 +341,8 @@ static void do_text_formatmenu(void *arg, int event)
switch(event) {
case 3:
if (txt_has_sel(text)) {
txt_cut_sel(text);
indent_paste(text);
txt_order_cursors(text);
indent(text);
break;
}
else {
@ -351,21 +351,21 @@ static void do_text_formatmenu(void *arg, int event)
}
case 4:
if ( txt_has_sel(text)) {
txt_cut_sel(text);
txt_order_cursors(text);
unindent(text);
break;
}
break;
case 5:
if ( txt_has_sel(text)) {
txt_cut_sel(text);
txt_order_cursors(text);
comment(text);
break;
}
break;
case 6:
if ( txt_has_sel(text)) {
txt_cut_sel(text);
txt_order_cursors(text);
uncomment(text);
break;
}