diff options
Diffstat (limited to 'source/blender/src/drawtext.c')
-rw-r--r-- | source/blender/src/drawtext.c | 2230 |
1 files changed, 0 insertions, 2230 deletions
diff --git a/source/blender/src/drawtext.c b/source/blender/src/drawtext.c deleted file mode 100644 index b4026746a35..00000000000 --- a/source/blender/src/drawtext.c +++ /dev/null @@ -1,2230 +0,0 @@ -/** - * $Id$ - * - * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. The Blender - * Foundation also sells licenses for use in proprietary software under - * the Blender License. See http://www.blender.org/BL/ for information - * about this. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include <stdlib.h> -#include <math.h> -#include <string.h> -#include <ctype.h> - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#ifndef _WIN32 -#include <unistd.h> -#else -#include <io.h> -#include "BLI_winstuff.h" -#endif -#include "MEM_guardedalloc.h" -#include "PIL_time.h" - -#include "BMF_Api.h" - -#include "BLI_blenlib.h" -#include "BLI_arithb.h" - -#include "DNA_text_types.h" -#include "DNA_space_types.h" -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" - -#include "BKE_utildefines.h" -#include "BKE_text.h" -#include "BKE_global.h" -#include "BKE_main.h" - -#include "BIF_gl.h" -#include "BIF_glutil.h" -#include "BIF_keyval.h" -#include "BIF_interface.h" -#include "BIF_drawtext.h" -#include "BIF_editfont.h" -#include "BIF_spacetypes.h" -#include "BIF_usiblender.h" -#include "BIF_screen.h" -#include "BIF_toolbox.h" -#include "BIF_space.h" -#include "BIF_mywindow.h" -#include "BIF_resources.h" - -#include "BSE_filesel.h" - -#include "BPY_extern.h" - -#include "mydevice.h" -#include "blendef.h" - -#define TEXTXLOC 38 - -/* forward declarations */ - -void drawtextspace(ScrArea *sa, void *spacedata); -void winqreadtextspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt); -void txt_copy_selectbuffer (Text *text); -void txt_paste_clipboard(Text *text); /* blank on non Win32 */ -void txt_copy_clipboard(Text *text); /* blank on non Win32 */ -void do_brackets(); - -int check_bracket(char *string); -static int check_delim(char *string); -static int check_numbers(char *string); -static int check_builtinfuncs(char *string); -static int check_specialvars(char *string); - -static void *last_txt_find_string= NULL; - -static BMF_Font *spacetext_get_font(SpaceText *st) { - static BMF_Font *scr12= NULL; - static BMF_Font *scr15= NULL; - - switch (st->font_id) { - default: - case 0: - if (!scr12) - scr12= BMF_GetFont(BMF_kScreen12); - return scr12; - case 1: - if (!scr15) - scr15= BMF_GetFont(BMF_kScreen15); - return scr15; - } -} - -static int spacetext_get_fontwidth(SpaceText *st) { - return BMF_GetCharacterWidth(spacetext_get_font(st), ' '); -} - -static char *temp_char_buf= NULL; -static int *temp_char_accum= NULL; -static int temp_char_len= 0; -static int temp_char_pos= 0; - -static void temp_char_write(char c, int accum) { - if (temp_char_len==0 || temp_char_pos>=temp_char_len) { - char *nbuf; int *naccum; - int olen= temp_char_len; - - if (olen) temp_char_len*= 2; - else temp_char_len= 256; - - nbuf= MEM_mallocN(sizeof(*temp_char_buf)*temp_char_len, "temp_char_buf"); - naccum= MEM_mallocN(sizeof(*temp_char_accum)*temp_char_len, "temp_char_accum"); - - if (olen) { - memcpy(nbuf, temp_char_buf, olen); - memcpy(naccum, temp_char_accum, olen); - - MEM_freeN(temp_char_buf); - MEM_freeN(temp_char_accum); - } - - temp_char_buf= nbuf; - temp_char_accum= naccum; - } - - temp_char_buf[temp_char_pos]= c; - temp_char_accum[temp_char_pos]= accum; - - if (c==0) temp_char_pos= 0; - else temp_char_pos++; -} - -void free_txt_data(void) { - txt_free_cut_buffer(); - - if (last_txt_find_string) MEM_freeN(last_txt_find_string); - if (temp_char_buf) MEM_freeN(temp_char_buf); - if (temp_char_accum) MEM_freeN(temp_char_accum); -} - -static int render_string (SpaceText *st, char *in) { - int r = 0, i = 0; - - while(*in) { - if (*in=='\t') { - if (temp_char_pos && *(in-1)=='\t') i= st->tabnumber; - else if (st->tabnumber > 0) i= st->tabnumber - (temp_char_pos%st->tabnumber); - while(i--) temp_char_write(' ', r); - } else temp_char_write(*in, r); - - r++; - in++; - } - r= temp_char_pos; - temp_char_write(0, 0); - - return r; -} - -void get_format_string(SpaceText *st) -{ - Text *text = st->text; - TextLine *tmp; - char *in_line; - char format[2000], check[200], other[2]; - unsigned char c; - int a, b, len, spot, letter, tabs, mem_amount; - - if(!text) return; - tmp = text->lines.first; - - while(tmp) { - in_line = tmp->line; - - len = strlen(in_line); - /* weak code... but we dont want crashes (ton) */ - if(len>2000-1) { - if (tmp->format) MEM_freeN(tmp->format); - tmp->format= NULL; - } - else { - - spot = 0; - tabs = 0; - //see how many tabs we have - for(a = 0; a <len; a++) { - c = (unsigned char) in_line[a]; - if(c == '\t') { - tabs++; - } - } - //calculate the amount of MEM_mallocN we neen - mem_amount = (((tabs*st->tabnumber)-tabs)+2)+len; // +2 for good measure - if (tmp->format) MEM_freeN(tmp->format); - tmp->format = MEM_mallocN(mem_amount, "Syntax_format"); - - for (a = 0; a < len; a++) { - c = (unsigned char) in_line[a]; - - check[0] = c; - check[1] = '\0'; - - if (check_delim(check)) - { - switch (c) { - case '\"': - if(in_line[a] == '\"' && in_line[a+1] == '\"' && in_line[a+2] == '\"') { - format[spot] = format[spot+1] = format[spot+2] = 'l'; - spot +=3; - a += 3; - while(in_line[a] != '\"' || in_line[a-1] != '\"' || in_line[a-2] != '\"') { - c = (unsigned char) in_line[a]; - if(a >= len) { - format[spot] = '\0'; - memcpy(tmp->format, format, strlen(format)); - if(!(tmp= tmp->next)) { - return; - } else { - in_line = tmp->line; - len = strlen(in_line); - tabs = 0; - for(b = 0; b <len; b++) { - c = (unsigned char) in_line[b]; - if(c == '\t') { - tabs++; - } - } - mem_amount = (((tabs*st->tabnumber)-tabs)+2)+len; - if (tmp->format) MEM_freeN(tmp->format); - tmp->format = MEM_mallocN(mem_amount, "Syntax_format"); - a = 0; spot = 0; - } - } else { - if(c == '\t' || c == ' ') { - if(c == '\t') { - for(b = st->tabnumber-(spot%st->tabnumber); b > 0; b--) { - format[spot] = ' '; - spot++; - } - a++; - } else { - format[spot] = ' '; - a++; spot++; - } - } else { - format[spot] = 'l'; - a++; spot++; - } - } - } - format[spot] = 'l'; - spot++; - } else { - format[spot] = 'l'; - a++; spot++; - while(in_line[a] != '\"') { - c = (unsigned char) in_line[a]; - if(a >= len) { - format[spot] = '\0'; - memcpy(tmp->format, format, strlen(format)); - if(!(tmp= tmp->next)) { - return; - } else { - in_line = tmp->line; - len = strlen(in_line); - for(b = 0; b <len; b++) { - c = (unsigned char) in_line[b]; - if(c == '\t') { - tabs++; - } - } - //calculate the amount of MEM_mallocN we neen - mem_amount = (((tabs*st->tabnumber)-tabs)+2)+len; - if (tmp->format) MEM_freeN(tmp->format); - tmp->format = MEM_mallocN(mem_amount, "Syntax_format"); - a = 0; spot = 0; - } - } - if(c == '\t' || c == ' ') { - if(c == '\t') { - for(b = st->tabnumber-(spot%st->tabnumber); b > 0; b--) { - format[spot] = ' '; - spot++; - } - a++; - } else { - format[spot] = ' '; - a++; spot++; - } - } else { - format[spot] = 'l'; - a++; spot++; - } - } - format[spot] = 'l'; - spot++; - } - break; - case '\'': - if(in_line[a] == '\'' && in_line[a+1] == '\'' && in_line[a+2] == '\'') { - format[spot] = format[spot+1] = format[spot+2] = 'l'; - spot +=3; - a += 3; - while(in_line[a] != '\'' || in_line[a-1] != '\'' || in_line[a-2] != '\'') { - c = (unsigned char) in_line[a]; - if(a >= len) { - format[spot] = '\0'; - memcpy(tmp->format, format, strlen(format)); - if(!(tmp= tmp->next)) { - return; - } else { - in_line = tmp->line; - len = strlen(in_line); - tabs = 0; - for(b = 0; b <len; b++) { - c = (unsigned char) in_line[b]; - if(c == '\t') { - tabs++; - } - } - mem_amount = (((tabs*st->tabnumber)-tabs)+2)+len; - if (tmp->format) MEM_freeN(tmp->format); - tmp->format = MEM_mallocN(mem_amount, "Syntax_format"); - a = 0; spot = 0; - } - } else { - if(c == '\t' || c == ' ') { - if(c == '\t') { - for(b = st->tabnumber-(spot%st->tabnumber); b > 0; b--) { - format[spot] = ' '; - spot++; - } - a++; - } else { - format[spot] = ' '; - a++; spot++; - } - } else { - format[spot] = 'l'; - a++; spot++; - } - } - } - format[spot] = 'l'; - spot++; - } else { - format[spot] = 'l'; - a++; spot++; - while(in_line[a] != '\'') { - c = (unsigned char) in_line[a]; - if(a >= len) { - format[spot] = '\0'; - memcpy(tmp->format, format, strlen(format)); - if(!(tmp= tmp->next)) { - return; - } else { - in_line = tmp->line; - len = strlen(in_line); - for(b = 0; b <len; b++) { - c = (unsigned char) in_line[b]; - if(c == '\t') { - tabs++; - } - } - //calculate the amount of MEM_mallocN we neen - mem_amount = (((tabs*st->tabnumber)-tabs)+2)+len; - if (tmp->format) MEM_freeN(tmp->format); - tmp->format = MEM_mallocN(mem_amount, "Syntax_format"); - a = 0; spot = 0; - } - } - if(c == '\t' || c == ' ') { - if(c == '\t') { - for(b = st->tabnumber-(spot%st->tabnumber); b > 0; b--) { - format[spot] = ' '; - spot++; - } - a++; - } else { - format[spot] = ' '; - a++; spot++; - } - } else { - format[spot] = 'l'; - a++; spot++; - } - } - format[spot] = 'l'; - spot++; - } - break; - case '#': - while(a<len) { - c = (unsigned char) in_line[a]; - if(c == '\t' || c == ' ') { - if(c == '\t') { - for(b = st->tabnumber-(spot%st->tabnumber); b > 0; b--) { - format[spot] = '#'; - spot++; - } - a++; - } else { - format[spot] = '#'; - a++; spot++; - } - } else { - format[spot] = '#'; - a++; spot++; - } - } - break; - case ' ': - format[spot] = ' '; - spot++; - break; - case '\t': - for(b = st->tabnumber-(spot%st->tabnumber); b > 0; b--) { - format[spot] = ' '; - spot++; - } - break; - default: - format[spot] = 'q'; - spot++; - - break; - } - } else if (check_numbers(check)) { - while (a < len) { - c = (unsigned char) in_line[a]; - other[0] = c; - other[1] = '\0'; - if (check_delim(other) && c != '.') { - a--; break; - } else { - format[spot] = 'n'; - a++; spot++; - } - } - } else { - letter = 0; - while (a < len) { - c = (unsigned char) in_line[a]; - other[0] = c; - other[1] = '\0'; - if (check_delim(other)) { - a--; - break; - } else { - check[letter] = (unsigned char) in_line[a]; - letter++; - a++; - } - } - check[letter] = '\0'; - if (check_builtinfuncs(check)) { - for (b = 0; b < strlen(check); b++) { - format[spot] = 'b'; - spot++; - } - } else if (check_specialvars(check)) { /*If TRUE then color and color next word*/ - for (b = 0; b < strlen(check); b++) { - format[spot] = 'b'; - spot++; - } - a++; - format[spot] = 'q'; - spot++; a++; - letter = 0; - while (a < len) { - c = (unsigned char) in_line[a]; - other[0] = c; - other[1] = '\0'; - if (check_delim(other)) { - a--; - break; - } else { - check[letter] = (unsigned char) in_line[a]; - letter++; - a++; - } - } - check[letter] = '\0'; - for (b = 0; b < strlen(check); b++) { - format[spot] = 'v'; - spot++; - } - }else { - for (b = 0; b < strlen(check); b++) { - format[spot] = 'q'; - spot++; - } - } - } - } - format[spot] = '\0'; - memcpy(tmp->format, format, strlen(format)); - } - - tmp = tmp->next; - } -} - -static int text_draw(SpaceText *st, char *str, int cshift, int maxwidth, int draw, int x, int y, char *format) { - int r=0, w= 0; - char *in; - int *acc; - - w= render_string(st, str); - if(w<cshift ) return 0; /* String is shorter than shift */ - - in= temp_char_buf+cshift; - acc= temp_char_accum+cshift; - w= w-cshift; - - if (draw) { - if(st->showsyntax && format) { - int amount, a; - char out[2]; - format = format+cshift; - - amount = strlen(in); - - for(a = 0; a < amount; a++) { - out[0] = (unsigned char) in[a]; - out[1] = '\0'; - switch (format[a]) { - case 'l': - BIF_ThemeColor(TH_SYNTAX_L); - break; - case 'b': - BIF_ThemeColor(TH_SYNTAX_B); - break; - case '#': - BIF_ThemeColor(TH_SYNTAX_C); - break; - case 'v': - BIF_ThemeColor(TH_SYNTAX_V); - break; - case 'n': - BIF_ThemeColor(TH_SYNTAX_N); - break; - case 'q': - BIF_ThemeColor(TH_TEXT); - break; - default: - BIF_ThemeColor(TH_TEXT); - break; - } - glRasterPos2i(x, y); - BMF_DrawString(spacetext_get_font(st), out); - x = x+BMF_GetStringWidth(spacetext_get_font(st), out); - } - } else { - glRasterPos2i(x, y); - BMF_DrawString(spacetext_get_font(st), in); - } - } else { - while (w-- && *acc++ < maxwidth) { - r+= spacetext_get_fontwidth(st); - } - } - - if (cshift && r==0) return 0; - else if (st->showlinenrs) - return r+TXT_OFFSET+TEXTXLOC; - else - return r+TXT_OFFSET; -} - -static void set_cursor_to_pos (SpaceText *st, int x, int y, int sel) -{ - Text *text; - TextLine **linep; - int *charp; - int w; - - text= st->text; - - if(sel) { linep= &text->sell; charp= &text->selc; } - else { linep= &text->curl; charp= &text->curc; } - - y= (curarea->winy - y)/st->lheight; - - y-= txt_get_span(text->lines.first, *linep) - st->top; - - if (y>0) { - while (y-- != 0) if((*linep)->next) *linep= (*linep)->next; - } else if (y<0) { - while (y++ != 0) if((*linep)->prev) *linep= (*linep)->prev; - } - - if(st->showlinenrs) - x-= TXT_OFFSET+TEXTXLOC; - else - x-= TXT_OFFSET; - - if (x<0) x= 0; - x = (x/spacetext_get_fontwidth(st)) + st->left; - - w= render_string(st, (*linep)->line); - if(x<w) *charp= temp_char_accum[x]; - else *charp= (*linep)->len; - - if(!sel) txt_pop_sel(text); -} - -static void draw_cursor(SpaceText *st) { - int h, x, i; - Text *text= st->text; - TextLine *linef, *linel; - int charf, charl; - - if (text->curl==text->sell && text->curc==text->selc) { - x= text_draw(st, text->curl->line, st->left, text->curc, 0, 0, 0, NULL); - - if (x) { - h= txt_get_span(text->lines.first, text->curl) - st->top; - - BIF_ThemeColor(TH_HILITE); - - glRecti(x-1, curarea->winy-st->lheight*(h)-2, x+1, curarea->winy-st->lheight*(h+1)-2); - } - } else { - int span= txt_get_span(text->curl, text->sell); - - if (span<0) { - linef= text->sell; - charf= text->selc; - - linel= text->curl; - charl= text->curc; - } else if (span>0) { - linef= text->curl; - charf= text->curc; - - linel= text->sell; - charl= text->selc; - } else { - linef= linel= text->curl; - - if (text->curc<text->selc) { - charf= text->curc; - charl= text->selc; - } else { - charf= text->selc; - charl= text->curc; - } - } - - /* Walk to the beginning of visible text */ - h= txt_get_span(text->lines.first, linef) - st->top; - while (h++<-1 && linef!=linel) linef= linef->next; - - x= text_draw(st, linef->line, st->left, charf, 0, 0, 0, NULL); - - BIF_ThemeColor(TH_SHADE2); - - if(st->showlinenrs) { - if (!x) x= TXT_OFFSET + TEXTXLOC -4; - } else { - if (!x) x= TXT_OFFSET - 4; - } - - while (linef && linef != linel) { - h= txt_get_span(text->lines.first, linef) - st->top; - if (h>st->viewlines) break; - - glRecti(x, curarea->winy-st->lheight*(h)-2, curarea->winx, curarea->winy-st->lheight*(h+1)-2); - if(st->showlinenrs) - glRecti(TXT_OFFSET+TEXTXLOC-4, curarea->winy-st->lheight*(h+1)-2, TXT_OFFSET+TEXTXLOC, curarea->winy-st->lheight*(h+2)-2); - else - glRecti(TXT_OFFSET-4, curarea->winy-st->lheight*(h+1)-2, TXT_OFFSET, curarea->winy-st->lheight*(h+2)-2); - - if(st->showlinenrs) - x= TXT_OFFSET + TEXTXLOC; - else - x= TXT_OFFSET; - - linef= linef->next; - } - - h= txt_get_span(text->lines.first, linef) - st->top; - - i= text_draw(st, linel->line, st->left, charl, 0, 0, 0, NULL); - if(i) glRecti(x, curarea->winy-st->lheight*(h)-2, i, curarea->winy-st->lheight*(h+1)-2); - - } - - do_brackets(); - BIF_ThemeColor(TH_TEXT); -} - -static void calc_text_rcts(SpaceText *st) -{ - int lhlstart, lhlend, ltexth; - short barheight, barstart, hlstart, hlend, blank_lines; - short pix_available, pix_top_margin, pix_bottom_margin, pix_bardiff; - - pix_top_margin = 8; - pix_bottom_margin = 4; - pix_available = curarea->winy - pix_top_margin - pix_bottom_margin; - ltexth= txt_get_span(st->text->lines.first, st->text->lines.last); - blank_lines = st->viewlines / 2; - - /* when resizing a vieport with the bar at the bottom to a greater height more blank lines will be added */ - if (ltexth + blank_lines < st->top + st->viewlines) { - blank_lines = st->top + st->viewlines - ltexth; - } - - ltexth += blank_lines; - - barheight = (st->viewlines*pix_available) / ltexth; - pix_bardiff = 0; - if (barheight < 20) { - pix_bardiff = 20 - barheight; /* take into account the now non-linear sizing of the bar */ - barheight = 20; - } - barstart = ((pix_available - pix_bardiff) * st->top) / ltexth; - - st->txtbar.xmin = 5; - st->txtbar.xmax = 17; - st->txtbar.ymax = curarea->winy - pix_top_margin - barstart; - st->txtbar.ymin = st->txtbar.ymax - barheight; - - CLAMP(st->txtbar.ymin, pix_bottom_margin, curarea->winy - pix_top_margin); - CLAMP(st->txtbar.ymax, pix_bottom_margin, curarea->winy - pix_top_margin); - - st->pix_per_line= (float) ltexth/pix_available; - if (st->pix_per_line<.1) st->pix_per_line=.1f; - - lhlstart = MIN2(txt_get_span(st->text->lines.first, st->text->curl), - txt_get_span(st->text->lines.first, st->text->sell)); - lhlend = MAX2(txt_get_span(st->text->lines.first, st->text->curl), - txt_get_span(st->text->lines.first, st->text->sell)); - - hlstart = (lhlstart * pix_available) / ltexth; - hlend = (lhlend * pix_available) / ltexth; - - /* the scrollbar is non-linear sized */ - if (pix_bardiff > 0) { - /* the start of the highlight is in the current viewport */ - if (lhlstart >= st->top && lhlstart <= st->top + st->viewlines) { - /* speed the progresion of the start of the highlight through the scrollbar */ - hlstart = ( ( (pix_available - pix_bardiff) * lhlstart) / ltexth) + (pix_bardiff * (lhlstart - st->top) / st->viewlines); - } - else if (lhlstart > st->top + st->viewlines && hlstart < barstart + barheight && hlstart > barstart) { - /* push hl start down */ - hlstart = barstart + barheight; - } - else if (lhlend > st->top && lhlstart < st->top && hlstart > barstart) { - /*fill out start */ - hlstart = barstart; - } - - if (hlend <= hlstart) { - hlend = hlstart + 2; - } - - /* the end of the highlight is in the current viewport */ - if (lhlend >= st->top && lhlend <= st->top + st->viewlines) { - /* speed the progresion of the end of the highlight through the scrollbar */ - hlend = (((pix_available - pix_bardiff )*lhlend)/ltexth) + (pix_bardiff * (lhlend - st->top)/st->viewlines); - } - else if (lhlend < st->top && hlend >= barstart - 2 && hlend < barstart + barheight) { - /* push hl end up */ - hlend = barstart; - } - else if (lhlend > st->top + st->viewlines && lhlstart < st->top + st->viewlines && hlend < barstart + barheight) { - /* fill out end */ - hlend = barstart + barheight; - } - - if (hlend <= hlstart) { - hlstart = hlend - 2; - } - } - - if (hlend - hlstart < 2) { - hlend = hlstart + 2; - } - - st->txtscroll.xmin= 5; - st->txtscroll.xmax= 17; - st->txtscroll.ymax= curarea->winy - pix_top_margin - hlstart; - st->txtscroll.ymin= curarea->winy - pix_top_margin - hlend; - - CLAMP(st->txtscroll.ymin, pix_bottom_margin, curarea->winy - pix_top_margin); - CLAMP(st->txtscroll.ymax, pix_bottom_margin, curarea->winy - pix_top_margin); -} - -static void draw_textscroll(SpaceText *st) -{ - if (!st->text) return; - - calc_text_rcts(st); - - BIF_ThemeColorShade(TH_SHADE1, -20); - glRecti(2, 2, 20, curarea->winy-6); - uiEmboss(2, 2, 20, curarea->winy-6, 1); - - BIF_ThemeColor(TH_SHADE1); - glRecti(st->txtbar.xmin, st->txtbar.ymin, st->txtbar.xmax, st->txtbar.ymax); - - BIF_ThemeColor(TH_SHADE2); - glRecti(st->txtscroll.xmin, st->txtscroll.ymin, st->txtscroll.xmax, st->txtscroll.ymax); - - uiEmboss(st->txtbar.xmin, st->txtbar.ymin, st->txtbar.xmax, st->txtbar.ymax, st->flags & ST_SCROLL_SELECT); -} - -static void screen_skip(SpaceText *st, int lines) -{ - int last; - - if (!st) return; - if (st->spacetype != SPACE_TEXT) return; - if (!st->text) return; - - st->top += lines; - - last= txt_get_span(st->text->lines.first, st->text->lines.last); - last= last - (st->viewlines/2); - - if (st->top>last) st->top= last; - if (st->top<0) st->top= 0; -} - -/* - * mode 1 == view scroll - * mode 2 == scrollbar - */ -static void do_textscroll(SpaceText *st, int mode) -{ - short delta[2]= {0, 0}; - short mval[2], hold[2], old[2]; - - if (!st->text) return; - - calc_text_rcts(st); - - st->flags|= ST_SCROLL_SELECT; - - glDrawBuffer(GL_FRONT); - uiEmboss(st->txtbar.xmin, st->txtbar.ymin, st->txtbar.xmax, st->txtbar.ymax, st->flags & ST_SCROLL_SELECT); - bglFlush(); - glDrawBuffer(GL_BACK); - - getmouseco_areawin(mval); - old[0]= hold[0]= mval[0]; - old[1]= hold[1]= mval[1]; - - while(get_mbut()&(L_MOUSE|M_MOUSE)) { - getmouseco_areawin(mval); - - if(old[0]!=mval[0] || old[1]!=mval[1]) { - if (mode==1) { - delta[0]= (hold[0]-mval[0])/spacetext_get_fontwidth(st); - delta[1]= (mval[1]-hold[1])/st->lheight; - } - else delta[1]= (hold[1]-mval[1])*st->pix_per_line; - - if (delta[0] || delta[1]) { - screen_skip(st, delta[1]); - st->left+= delta[0]; - if (st->left<0) st->left= 0; - - scrarea_do_windraw(curarea); - screen_swapbuffers(); - - hold[0]=mval[0]; - hold[1]=mval[1]; - } - old[0]=mval[0]; - old[1]=mval[1]; - } else { - BIF_wait_for_statechange(); - } - } - st->flags^= ST_SCROLL_SELECT; - - glDrawBuffer(GL_FRONT); - uiEmboss(st->txtbar.xmin, st->txtbar.ymin, st->txtbar.xmax, st->txtbar.ymax, st->flags & ST_SCROLL_SELECT); - bglFlush(); - glDrawBuffer(GL_BACK); -} - -static void do_selection(SpaceText *st, int selecting) -{ - short mval[2], old[2]; - int sell, selc; - int linep2, charp2; - int first= 1; - - getmouseco_areawin(mval); - old[0]= mval[0]; - old[1]= mval[1]; - - if (!selecting) { - int curl= txt_get_span(st->text->lines.first, st->text->curl); - int curc= st->text->curc; - int linep2, charp2; - - set_cursor_to_pos(st, mval[0], mval[1], 0); - - linep2= txt_get_span(st->text->lines.first, st->text->curl); - charp2= st->text->selc; - - if (curl!=linep2 || curc!=charp2) - txt_undo_add_toop(st->text, UNDO_CTO, curl, curc, linep2, charp2); - } - - sell= txt_get_span(st->text->lines.first, st->text->sell); - selc= st->text->selc; - - while(get_mbut()&L_MOUSE) { - getmouseco_areawin(mval); - - if (mval[1]<0 || mval[1]>curarea->winy) { - int d= (old[1]-mval[1])*st->pix_per_line; - if (d) screen_skip(st, d); - - set_cursor_to_pos(st, mval[0], mval[1]<0?0:curarea->winy, 1); - - scrarea_do_windraw(curarea); - screen_swapbuffers(); - } else if (mval[0]<0 || mval[0]>curarea->winx) { - if (mval[0]>curarea->winx) st->left++; - else if (mval[0]<0 && st->left>0) st->left--; - - set_cursor_to_pos(st, mval[0], mval[1], 1); - - scrarea_do_windraw(curarea); - screen_swapbuffers(); - - PIL_sleep_ms(10); - } else if (first || old[0]!=mval[0] || old[1]!=mval[1]) { - set_cursor_to_pos(st, mval[0], mval[1], 1); - - scrarea_do_windraw(curarea); - screen_swapbuffers(); - - old[0]= mval[0]; - old[1]= mval[1]; - first= 1; - } else { - BIF_wait_for_statechange(); - } - } - - linep2= txt_get_span(st->text->lines.first, st->text->sell); - charp2= st->text->selc; - - if (sell!=linep2 || selc!=charp2) - txt_undo_add_toop(st->text, UNDO_STO, sell, selc, linep2, charp2); -} - -void drawtextspace(ScrArea *sa, void *spacedata) -{ - SpaceText *st= curarea->spacedata.first; - Text *text; - int i; - TextLine *tmp; - char linenr[12]; - float col[3]; - int linecount = 0; - - if (st==NULL || st->spacetype != SPACE_TEXT) return; - - BIF_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0.0); - glClear(GL_COLOR_BUFFER_BIT); - myortho2(-0.375, (float)(sa->winx)-0.375, -0.375, (float)(sa->winy)-0.375); - - draw_area_emboss(sa); - - text= st->text; - if(!text) return; - - /* Make sure all the positional pointers exist */ - if (!text->curl || !text->sell || !text->lines.first || !text->lines.last) - txt_clean_text(text); - - if(st->lheight) st->viewlines= (int) curarea->winy/st->lheight; - else st->viewlines= 0; - - if(st->showlinenrs) { - cpack(0x8c787c); - glRecti(23, 0, (st->lheight==15)?63:59, curarea->winy - 2); - } - - BIF_ThemeColor(TH_TEXT); - - draw_cursor(st); - - tmp= text->lines.first; - for (i= 0; i<st->top && tmp; i++) { - tmp= tmp->next; - linecount++; - } - - if(st->showsyntax) { - if (tmp && !tmp->format) { - get_format_string(st); - } - } - - for (i=0; i<st->viewlines && tmp; i++, tmp= tmp->next) { - if(st->showlinenrs) { - BIF_ThemeColor(TH_TEXT); - if(((float)(i + linecount + 1)/10000.0) < 1.0) { - sprintf(linenr, "%4d", i + linecount + 1); - glRasterPos2i(TXT_OFFSET - 7, curarea->winy-st->lheight*(i+1)); - } else { - sprintf(linenr, "%5d", i + linecount + 1); - glRasterPos2i(TXT_OFFSET - 11, curarea->winy-st->lheight*(i+1)); - } - BMF_DrawString(spacetext_get_font(st), linenr); - text_draw(st, tmp->line, st->left, 0, 1, TXT_OFFSET + TEXTXLOC, curarea->winy-st->lheight*(i+1), tmp->format); - } else - text_draw(st, tmp->line, st->left, 0, 1, TXT_OFFSET, curarea->winy-st->lheight*(i+1), tmp->format); - } - - draw_textscroll(st); - - curarea->win_swap= WIN_BACK_OK; -} - -/* Moves the view to the cursor location, - also used to make sure the view isnt outside the file */ -void pop_space_text (SpaceText *st) -{ - int i, x; - - if(!st) return; - if(!st->text) return; - if(!st->text->curl) return; - - i= txt_get_span(st->text->lines.first, st->text->curl); - if (st->top+st->viewlines <= i || st->top > i) { - st->top= i - st->viewlines/2; - } - - x= text_draw(st, st->text->curl->line, st->left, st->text->curc, 0, 0, 0, NULL); - - if (x==0 || x>curarea->winx) { - st->left= st->text->curc-0.5*(curarea->winx)/spacetext_get_fontwidth(st); - } - - if (st->top < 0) st->top= 0; - if (st->left <0) st->left= 0; -} - -void add_text_fs(char *file) /* bad but cant pass an as arg here */ -{ - SpaceText *st= curarea->spacedata.first; - Text *text; - - if (st==NULL || st->spacetype != SPACE_TEXT) return; - - text= add_text(file); - - st->text= text; - - st->top= 0; - - if (st->showsyntax) get_format_string(st); - allqueue(REDRAWTEXT, 0); - allqueue(REDRAWHEADERS, 0); -} - -void free_textspace(SpaceText *st) -{ - if (!st) return; - - st->text= NULL; -} - -static void save_mem_text(char *str) -{ - SpaceText *st= curarea->spacedata.first; - Text *text; - - if (!str) return; - - if (!st) return; - if (st->spacetype != SPACE_TEXT) return; - - text= st->text; - if(!text) return; - - if (text->name) MEM_freeN(text->name); - text->name= MEM_mallocN(strlen(str)+1, "textname"); - strcpy(text->name, str); - - text->flags ^= TXT_ISMEM; - - txt_write_file(text); -} - -void txt_write_file(Text *text) -{ - FILE *fp; - TextLine *tmp; - - /* Do we need to get a filename? */ - if (text->flags & TXT_ISMEM) { - if (text->name) - activate_fileselect(FILE_SPECIAL, "SAVE TEXT FILE", text->name, save_mem_text); - else - activate_fileselect(FILE_SPECIAL, "SAVE TEXT FILE", text->id.name+2, save_mem_text); - return; - } - - /* Should we ask to save over? */ - if (text->flags & TXT_ISTMP) { - if (BLI_exists(text->name)) { - if (!okee("Save over")) return; - } else if (!okee("Create new file")) return; - - text->flags ^= TXT_ISTMP; - } - - fp= fopen(text->name, "w"); - if (fp==NULL) { - error("Unable to save file"); - return; - } - - tmp= text->lines.first; - while (tmp) { - if (tmp->next) fprintf(fp, "%s\n", tmp->line); - else fprintf(fp, "%s", tmp->line); - - tmp= tmp->next; - } - - fclose (fp); - - if (text->flags & TXT_ISDIRTY) text->flags ^= TXT_ISDIRTY; -} - -void unlink_text(Text *text) -{ - bScreen *scr; - ScrArea *area; - SpaceLink *sl; - - /* check if this text was used as script link: - * this check function unsets the pointers and returns how many - * script links used this Text */ - if (BPY_check_all_scriptlinks (text)) { - allqueue(REDRAWBUTSSCRIPT, 0); - } - - for (scr= G.main->screen.first; scr; scr= scr->id.next) { - for (area= scr->areabase.first; area; area= area->next) { - for (sl= area->spacedata.first; sl; sl= sl->next) { - if (sl->spacetype==SPACE_TEXT) { - SpaceText *st= (SpaceText*) sl; - - if (st->text==text) { - st->text= NULL; - st->top= 0; - - if (st==area->spacedata.first) { - scrarea_queue_redraw(area); - } - } - } - } - } - } -} - -int jumptoline_interactive(SpaceText *st) { - short nlines= txt_get_span(st->text->lines.first, st->text->lines.last)+1; - short tmp= txt_get_span(st->text->lines.first, st->text->curl)+1; - - if (button(&tmp, 1, nlines, "Jump to line:")) { - txt_move_toline(st->text, tmp-1, 0); - pop_space_text(st); - return 1; - } else { - return 0; - } -} - - -int bufferlength; -static char *copybuffer = NULL; - -void txt_copy_selectbuffer (Text *text) -{ - int length=0; - TextLine *tmp, *linef, *linel; - int charf, charl; - - if (!text) return; - if (!text->curl) return; - if (!text->sell) return; - - if (!txt_has_sel(text)) return; - - if (copybuffer) { - MEM_freeN(copybuffer); - copybuffer= NULL; - } - - if (text->curl==text->sell) { - linef= linel= text->curl; - - if (text->curc < text->selc) { - charf= text->curc; - charl= text->selc; - } else{ - charf= text->selc; - charl= text->curc; - } - } else if (txt_get_span(text->curl, text->sell)<0) { - linef= text->sell; - linel= text->curl; - - charf= text->selc; - charl= text->curc; - } else { - linef= text->curl; - linel= text->sell; - - charf= text->curc; - charl= text->selc; - } - - if (linef == linel) { - length= charl-charf; - - copybuffer= MEM_mallocN(length+1, "cut buffera"); - - BLI_strncpy(copybuffer, linef->line + charf, length+1); - } else { - length+= linef->len - charf; - length+= charl; - length++; /* For the '\n' */ - - tmp= linef->next; - while (tmp && tmp!= linel) { - length+= tmp->len+1; - tmp= tmp->next; - } - - copybuffer= MEM_mallocN(length+1, "cut bufferb"); - - strncpy(copybuffer, linef->line+ charf, linef->len-charf); - length= linef->len-charf; - - copybuffer[length++]='\n'; - - tmp= linef->next; - while (tmp && tmp!=linel) { - strncpy(copybuffer+length, tmp->line, tmp->len); - length+= tmp->len; - - copybuffer[length++]='\n'; - - tmp= tmp->next; - } - strncpy(copybuffer+length, linel->line, charl); - length+= charl; - - copybuffer[length]=0; - } - - bufferlength = length; -} - - -#ifdef _WIN32 -static char *unixNewLine(char *buffer) -{ - char *p, *p2, *output; - - /* we can afford the few extra bytes */ - output= MEM_callocN(strlen(buffer)+1, "unixnewline"); - for (p= buffer, p2= output; *p; p++) - if (*p != '\r') *(p2++)= *p; - - *p2= 0; - return(output); -} - -static char *winNewLine(char *buffer) -{ - char *p, *p2, *output; - int add= 0; - - for (p= buffer; *p; p++) - if (*p == '\n') add++; - - bufferlength= p-buffer+add+1; - output= MEM_callocN(bufferlength, "winnewline"); - for (p= buffer, p2= output; *p; p++, p2++) { - if (*p == '\n') { - *(p2++)= '\r'; *p2= '\n'; - } else *p2= *p; - } - *p2= 0; - - return(output); -} -#endif - - -void txt_paste_clipboard(Text *text) { -#ifdef _WIN32 - char * buffer = NULL; - - if ( OpenClipboard(NULL) ) { - HANDLE hData = GetClipboardData( CF_TEXT ); - buffer = (char*)GlobalLock( hData ); - if (buffer) { - buffer = unixNewLine(buffer); - if (buffer) txt_insert_buf(text, buffer); - } - GlobalUnlock( hData ); - CloseClipboard(); - MEM_freeN(buffer); - } -#endif -} - -void txt_copy_clipboard(Text *text) { -#ifdef _WIN32 - txt_copy_selectbuffer(text); - - if (OpenClipboard(NULL)) { - HLOCAL clipbuffer; - char* buffer; - - if (copybuffer) { - copybuffer = winNewLine(copybuffer); - - EmptyClipboard(); - clipbuffer = LocalAlloc(LMEM_FIXED,((bufferlength+1))); - buffer = (char *) LocalLock(clipbuffer); - - strncpy(buffer, copybuffer, bufferlength); - buffer[bufferlength] = '\0'; - LocalUnlock(clipbuffer); - SetClipboardData(CF_TEXT,clipbuffer); - } - CloseClipboard(); - } - - if (copybuffer) { - MEM_freeN(copybuffer); - copybuffer= NULL; - } -#endif -} - -/* - * again==0 show find panel or find - * again==1 find text again */ -void txt_find_panel(SpaceText *st, int again) -{ - Text *text=st->text; - char *findstr= last_txt_find_string; - - if (again==0) { - findstr= txt_sel_to_buf(text); - } else if (again==1) { - char buf[256]; - - if (findstr && strlen(findstr)<(sizeof(buf)-1)) - strcpy(buf, findstr); - else - buf[0]= 0; - - if (sbutton(buf, 0, sizeof(buf)-1, "Find: ") && buf[0]) - findstr= BLI_strdup(buf); - else - findstr= NULL; - } - - if (findstr!=last_txt_find_string) { - if (last_txt_find_string) - MEM_freeN(last_txt_find_string); - last_txt_find_string= findstr; - } - - if (findstr) { - if (txt_find_string(text, findstr)) - pop_space_text(st); - else - error("Not found: %s", findstr); - } -} - -void run_python_script(SpaceText *st) -{ - char *py_filename; - Text *text=st->text; - - if (!BPY_txt_do_python_Text(text)) { - int lineno = BPY_Err_getLinenumber(); - // jump to error if happened in current text: - py_filename = (char*) BPY_Err_getFilename(); - - /* st->text can become NULL: user called Blender.Load(blendfile) - * before the end of the script. */ - if (!st->text) return; - - if (!strcmp(py_filename, st->text->id.name+2)) { - error("Python script error, check console"); - if (lineno >= 0) { - txt_move_toline(text, lineno-1, 0); - txt_sel_line(text); - pop_space_text(st); - } - } else { - error("Error in other (possibly external) file, "\ - "check console"); - } - } -} - -static void set_tabs(Text *text) -{ - SpaceText *st = curarea->spacedata.first; - st->currtab_set = setcurr_tab(text); -} - -void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt) -{ - unsigned short event= evt->event; - short val= evt->val; - char ascii= evt->ascii; - SpaceText *st= curarea->spacedata.first; - Text *text; - int do_draw=0, p; - - if (st==NULL || st->spacetype != SPACE_TEXT) return; - - /* smartass code to prevent the CTRL/ALT events below from not working! */ - if(G.qual & (LR_ALTKEY|LR_CTRLKEY)) - if(!ispunct(ascii)) - ascii= 0; - - text= st->text; - - if (!text) { - if (event==RIGHTMOUSE) { - switch (pupmenu("File %t|New %x0|Open... %x1")) { - case 0: - st->text= add_empty_text("Text"); - st->top= 0; - - allqueue(REDRAWTEXT, 0); - allqueue(REDRAWHEADERS, 0); - break; - case 1: - activate_fileselect(FILE_SPECIAL, "Open Text File", G.sce, add_text_fs); - break; - } - } - if (val && !ELEM(G.qual, 0, LR_SHIFTKEY)) { - if (event==FKEY && G.qual == (LR_ALTKEY|LR_SHIFTKEY)) { - switch (pupmenu("File %t|New %x0|Open... %x1")) { - case 0: - st->text= add_empty_text("Text"); - st->top= 0; - - allqueue(REDRAWTEXT, 0); - allqueue(REDRAWHEADERS, 0); - break; - case 1: - activate_fileselect(FILE_SPECIAL, "Open Text File", G.sce, add_text_fs); - break; - } - } - else if (event==QKEY) { - if (G.qual & LR_CTRLKEY) { - if(okee("Quit Blender")) exit_usiblender(); - } - } - else if (event==NKEY) { - if (G.qual & LR_ALTKEY) { - st->text= add_empty_text("Text"); - st->top= 0; - - allqueue(REDRAWTEXT, 0); - allqueue(REDRAWHEADERS, 0); - } - } - else if (event==OKEY) { - if (G.qual & LR_ALTKEY) { - activate_fileselect(FILE_SPECIAL, "Open Text File", G.sce, add_text_fs); - } - } - } - return; - } - - if (event==LEFTMOUSE) { - if (val) { - short mval[2]; - set_tabs(text); - getmouseco_areawin(mval); - - if (mval[0]>2 && mval[0]<20 && mval[1]>2 && mval[1]<curarea->winy-2) { - do_textscroll(st, 2); - } else { - do_selection(st, G.qual&LR_SHIFTKEY); - do_draw= 1; - } - } - } else if (event==MIDDLEMOUSE) { - if (val) { - do_textscroll(st, 1); - } - } else if (event==RIGHTMOUSE) { - if (val) { - p= pupmenu("File %t|New %x0|Open... %x1|Save %x2|Save As...%x3|Execute Script%x4"); - - switch(p) { - case 0: - st->text= add_empty_text("Text"); - st->top= 0; - - allqueue(REDRAWTEXT, 0); - allqueue(REDRAWHEADERS, 0); - break; - - case 1: - activate_fileselect(FILE_SPECIAL, "Open Text File", G.sce, add_text_fs); - break; - - case 3: - text->flags |= TXT_ISMEM; - - case 2: - txt_write_file(text); - do_draw= 1; - break; - case 4: - run_python_script(st); - do_draw= 1; - break; - default: - break; - } - } - } else if (ascii) { - if (txt_add_char(text, ascii)) { - if (st->showsyntax) get_format_string(st); - pop_space_text(st); - do_draw= 1; - } - } else if (val) { - switch (event) { - case AKEY: - if (G.qual & LR_ALTKEY) { - txt_move_bol(text, G.qual & LR_SHIFTKEY); - do_draw= 1; - pop_space_text(st); - } else if (G.qual & LR_CTRLKEY) { - txt_sel_all(text); - do_draw= 1; - } - break; /* BREAK A */ - case CKEY: - if (G.qual & LR_ALTKEY || G.qual & LR_CTRLKEY) { - if(G.qual & LR_SHIFTKEY) - txt_copy_clipboard(text); - else - txt_copy_sel(text); - - do_draw= 1; - } - break; /* BREAK C */ - case DKEY: - if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY)) { - //uncommenting - txt_order_cursors(text); - uncomment(text); - do_draw = 1; - if (st->showsyntax) get_format_string(st); - break; - } else if (G.qual == LR_CTRLKEY) { - txt_delete_char(text); - if (st->showsyntax) get_format_string(st); - do_draw= 1; - pop_space_text(st); - } - break; /* BREAK D */ - case EKEY: - if (G.qual == (LR_ALTKEY|LR_SHIFTKEY)) { - switch(pupmenu("Edit %t|Cut %x0|Copy %x1|Paste %x2|Print Cut Buffer %x3")) { - case 0: - txt_cut_sel(text); - do_draw= 1; - break; - case 1: - txt_copy_sel(text); - do_draw= 1; - break; - case 2: - txt_paste(text); - if (st->showsyntax) get_format_string(st); - do_draw= 1; - break; - case 3: - txt_print_cutbuffer(); - break; - } - } - else if (G.qual == LR_CTRLKEY || G.qual == (LR_CTRLKEY|LR_SHIFTKEY)) { - txt_move_eol(text, G.qual & LR_SHIFTKEY); - do_draw= 1; - pop_space_text(st); - } - break; /* BREAK E */ - case FKEY: - if (G.qual == (LR_ALTKEY|LR_SHIFTKEY)) { - switch(pupmenu("File %t|New %x0|Open... %x1|Save %x2|Save As...%x3")) { - case 0: - st->text= add_empty_text("Text"); - st->top= 0; - - allqueue(REDRAWTEXT, 0); - allqueue(REDRAWHEADERS, 0); - break; - case 1: - activate_fileselect(FILE_SPECIAL, "Open Text File", G.sce, add_text_fs); - break; - case 3: - text->flags |= TXT_ISMEM; - case 2: - txt_write_file(text); - do_draw= 1; - break; - } - } - else if (G.qual == LR_ALTKEY) { - if (txt_has_sel(text)) { - txt_find_panel(st,0); - do_draw= 1; - } - } - else if (G.qual == (LR_ALTKEY|LR_CTRLKEY)) { /* always search button */ - txt_find_panel(st,1); - do_draw= 1; - } - break; /* BREAK F */ - case JKEY: - if (G.qual == LR_ALTKEY) { - do_draw= jumptoline_interactive(st); - } - break; /* BREAK J */ - case MKEY: - if (G.qual == LR_ALTKEY) { - txt_export_to_object(text); - do_draw= 1; - } - break; /* BREAK M */ - case NKEY: - if (G.qual == LR_ALTKEY) { - st->text= add_empty_text("Text"); - st->top= 0; - - allqueue(REDRAWTEXT, 0); - allqueue(REDRAWHEADERS, 0); - - } - break; /* BREAK N */ - case OKEY: - if (G.qual == LR_ALTKEY) { - activate_fileselect(FILE_SPECIAL, "Open Text File", G.sce, add_text_fs); - } - break; /* BREAK O */ - case PKEY: - if (G.qual == LR_ALTKEY) { - run_python_script(st); - do_draw= 1; - } - break; /* BREAK P */ - case QKEY: - if(okee("Quit Blender")) exit_usiblender(); - break; /* BREAK Q */ - case RKEY: - if (G.qual == LR_ALTKEY) { - if (text->compiled) BPY_free_compiled_text(text); - text->compiled = NULL; - if (okee("Reopen text")) { - if (!reopen_text(text)) - error("Could not reopen file"); - if (st->showsyntax) get_format_string(st); - } - do_draw= 1; - } - break; /* BREAK R */ - case SKEY: - if (G.qual == (LR_ALTKEY|LR_SHIFTKEY)) { - p= pupmenu("Select %t|" - "Select All %x0|" - "Select Line %x1|" - "Jump to Line %x3"); - switch(p) { - case 0: - txt_sel_all(text); - do_draw= 1; - break; - - case 1: - txt_sel_line(text); - do_draw= 1; - break; - - case 3: - do_draw= jumptoline_interactive(st); - break; - } - } - else if (G.qual & LR_ALTKEY) { - /* Event treatment CANNOT enter this if - if (G.qual & LR_SHIFTKEY) - if (text) text->flags |= TXT_ISMEM; - */ - txt_write_file(text); - do_draw= 1; - } - break; /* BREAK S */ - case UKEY: - //txt_print_undo(text); //debug buffer in console - if (G.qual == (LR_ALTKEY|LR_SHIFTKEY)) { - txt_do_redo(text); - do_draw= 1; - } - if (G.qual == LR_ALTKEY) { - txt_do_undo(text); - if (st->showsyntax) get_format_string(st); - do_draw= 1; - } - break; /* BREAK U */ - case VKEY: - if (G.qual == (LR_ALTKEY| LR_SHIFTKEY)) { - switch(pupmenu("View %t|Top of File %x0|Bottom of File %x1|Page Up %x2|Page Down %x3")) { - case 0: - txt_move_bof(text, 0); - do_draw= 1; - pop_space_text(st); - break; - case 1: - txt_move_eof(text, 0); - do_draw= 1; - pop_space_text(st); - break; - case 2: - screen_skip(st, -st->viewlines); - do_draw= 1; - break; - case 3: - screen_skip(st, st->viewlines); - do_draw= 1; - break; - } - } - /* Support for both Alt-V and Ctrl-V for Paste, for backward compatibility reasons */ - else if (G.qual & LR_ALTKEY || G.qual & LR_CTRLKEY) { - /* Throwing in the Shift modifier Paste from the OS clipboard */ - if (G.qual & LR_SHIFTKEY) - txt_paste_clipboard(text); - else - txt_paste(text); - if (st->showsyntax) get_format_string(st); - do_draw= 1; - pop_space_text(st); - } - break; /* BREAK V */ - case XKEY: - if (G.qual == LR_ALTKEY || G.qual == LR_CTRLKEY) { - txt_cut_sel(text); - if (st->showsyntax) get_format_string(st); - do_draw= 1; - pop_space_text(st); - } - break; - case ZKEY: - if (G.qual & (LR_ALTKEY|LR_CTRLKEY|LR_COMMANDKEY)) { - if (G.qual & LR_SHIFTKEY) { - txt_do_redo(text); - } else { - txt_do_undo(text); - } - if (st->showsyntax) get_format_string(st); - do_draw= 1; - } - break; - case TABKEY: - if (G.qual & LR_SHIFTKEY) { - if (txt_has_sel(text)) { - txt_order_cursors(text); - unindent(text); - - } - } else { - if ( txt_has_sel(text)) { - txt_order_cursors(text); - indent(text); - } else { - txt_add_char(text, '\t'); - } - } - if (st->showsyntax) get_format_string(st); - 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; - if (a < st->currtab_set) - { - while ( a < st->currtab_set) { - txt_add_char(text, '\t'); - a++; - } - } - } - if (st->showsyntax) get_format_string(st); - do_draw= 1; - pop_space_text(st); - break; - case BACKSPACEKEY: - txt_backspace_char(text); - set_tabs(text); - if (st->showsyntax) get_format_string(st); - do_draw= 1; - pop_space_text(st); - break; - case DELKEY: - txt_delete_char(text); - if (st->showsyntax) get_format_string(st); - do_draw= 1; - pop_space_text(st); - st->currtab_set = setcurr_tab(text); - break; - case DOWNARROWKEY: - txt_move_down(text, G.qual & LR_SHIFTKEY); - set_tabs(text); - do_draw= 1; - pop_space_text(st); - break; - case LEFTARROWKEY: - if (G.qual & LR_COMMANDKEY) - txt_move_bol(text, G.qual & LR_SHIFTKEY); - else - txt_move_left(text, G.qual & LR_SHIFTKEY); - set_tabs(text); - do_draw= 1; - pop_space_text(st); - break; - case RIGHTARROWKEY: - if (G.qual & LR_COMMANDKEY) - txt_move_eol(text, G.qual & LR_SHIFTKEY); - else - txt_move_right(text, G.qual & LR_SHIFTKEY); - set_tabs(text); - do_draw= 1; - pop_space_text(st); - break; - case UPARROWKEY: - txt_move_up(text, G.qual & LR_SHIFTKEY); - set_tabs(text); - do_draw= 1; - pop_space_text(st); - break; - case PAGEDOWNKEY: - screen_skip(st, st->viewlines); - do_draw= 1; - break; - case PAGEUPKEY: - screen_skip(st, -st->viewlines); - do_draw= 1; - break; - case HOMEKEY: - txt_move_bol(text, G.qual & LR_SHIFTKEY); - do_draw= 1; - pop_space_text(st); - break; - case ENDKEY: - txt_move_eol(text, G.qual & LR_SHIFTKEY); - do_draw= 1; - pop_space_text(st); - break; - case WHEELUPMOUSE: - screen_skip(st, -U.wheellinescroll); - do_draw= 1; - break; - case WHEELDOWNMOUSE: - screen_skip(st, U.wheellinescroll); - do_draw= 1; - break; - } - } - - if (do_draw) { - ScrArea *sa; - - for (sa= G.curscreen->areabase.first; sa; sa= sa->next) { - SpaceText *st= sa->spacedata.first; - - if (st && st->spacetype==SPACE_TEXT) { - scrarea_queue_redraw(sa); - } - } - } -} - -void do_brackets(void) -{ - SpaceText *st = curarea->spacedata.first; - Text *text = st->text; - TextLine *tmp, *start; - char test[2]; - int d, pos, open, x, y, x2, y2, h=0; - - if(!text) return; - - tmp = text->curl; - start = text->curl; - - test[0] = (unsigned char) tmp->line[text->curc]; - test[1] = '\0'; - - d = check_bracket(test); - if (!d) /* If not pri char */ - { - test[0] = (unsigned char) tmp->line[text->curc-1]; - test[1] = '\0'; - d = check_bracket(test); - if(!d) { - return; /*If the current char or prev is not a bracket then return*/ - } else { /* current char */ - h= txt_get_span(text->lines.first, start) - st->top; - x = text_draw(st, start->line, st->left, text->curc-1, 0, 0, 0, NULL); - y = text_draw(st, start->line, st->left, text->curc, 0, 0, 0, NULL); - if (d < 4) { - pos = text->curc; - } else { - pos = text->curc-2; - } - } - } else { /* is pri char */ - h= txt_get_span(text->lines.first, start) - st->top; - x = text_draw(st, start->line, st->left, text->curc, 0, 0, 0, NULL); - y = text_draw(st, start->line, st->left, text->curc+1, 0, 0, 0, NULL); - if (d < 4) { - pos = text->curc+1; - } else { - pos = text->curc-1; - } - } - - if (d < 4) /*reading forward*/ - { - open = 1; - while ( tmp ) { - while (pos <= tmp->len) { - test[0] = (unsigned char) tmp->line[pos]; - test[1] = '\0'; - if(check_bracket(test) == d) { - open++; - } else if (check_bracket(test) == d+3) { - open--; - if (open == 0) { - BIF_ThemeColorBlend(TH_BACK, TH_SHADE2, 0.5); - glRecti(x, curarea->winy-st->lheight*(h)-2, y, curarea->winy-st->lheight*(h+1)-2); - - h= txt_get_span(text->lines.first, tmp) - st->top; - x2= text_draw(st, tmp->line, st->left, pos, 0, 0, 0, NULL); - y2= text_draw(st, tmp->line, st->left, pos+1, 0, 0, 0, NULL); - glRecti(x2, curarea->winy-st->lheight*(h)-2, y2, curarea->winy-st->lheight*(h+1)-2); - BIF_ThemeColor(TH_TEXT); - return; - } - } - pos++; - } - tmp = tmp->next; - pos = 0; - } - } else { /* reading back */ - open = 1; - while ( tmp ) { - while (pos >= 0) { - test[0] = (unsigned char) tmp->line[pos]; - test[1] = '\0'; - if(check_bracket(test) == d) { - open++; - } else if (check_bracket(test) == d-3) { - open--; - if (open == 0) { - BIF_ThemeColorBlend(TH_BACK, TH_SHADE2, 0.5); - glRecti(x, curarea->winy-st->lheight*(h)-2, y, curarea->winy-st->lheight*(h+1)-2); - - h= txt_get_span(text->lines.first, tmp) - st->top; - x2= text_draw(st, tmp->line, st->left, pos, 0, 0, 0, NULL); - y2= text_draw(st, tmp->line, st->left, pos+1, 0, 0, 0, NULL); - glRecti(x2, curarea->winy-st->lheight*(h)-2, y2, curarea->winy-st->lheight*(h+1)-2); - BIF_ThemeColor(TH_TEXT); - return; - } - } - pos--; - } - tmp = tmp->prev; - if (tmp) { - pos = tmp->len; - } - } - } - -} - -int check_bracket(char *string) -{ - int number, a = 0; - char other[][3] = {"(", "[", "{", ")", "]", "}"}; - - number = 6; - - while(a < number) { - if(strcmp(other[a], string) == 0) - { - return a+1; - } - a++; - } - return 0; -} - -static int check_builtinfuncs(char *string) -{ - int number = 30, a = 0; - - char builtinfuncs[][11] = {"and", "as", "assert", "break", "class", "continue", "def", - "del", "elif", "else", "except", "exec", "finally", - "for", "from", "global", "if", "import", "in", - "is", "lambda", "not", "or", "pass", "print", - "raise", "return", "try", "while", "yield"}; - - for( a = 0; a < number; a++) { - if(!strcmp(builtinfuncs[a], string)) - return 1; - } - return 0; -} - -static int check_specialvars(char *string) -{ - int number = 2, a = 0; - char specialvars[][7] = {"def", "class"}; - - for( a = 0; a < number; a++) { - if(!strcmp(specialvars[a], string)) - return a+1; - } - return 0; -} - -static int check_delim(char *string) -{ - int number = 28, a = 0; - char other[][3] = {"(", ")", ":", "\"", "\'", " ", "~", "!", "%", "^", "&", "*", "-", "+", "=", "[", "]", "{", "}", ";", "/", "<", ">", "|", ".", "#", "\t", ","}; - - for( a = 0; a < number; a++) { - if(!strcmp(other[a], string)) - return 1; - } - return 0; -} - -static int check_numbers(char *string) -{ - int number = 10, a = 0; - char other[][2] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; - - for( a = 0; a < number; a++) { - if(!strcmp(other[a], string)) - return 1; - } - return 0; -} - -void convert_tabs (struct SpaceText *st, int tab) -{ - Text *text = st->text; - TextLine *tmp; - char *check_line, *new_line, *format; - int a, j, extra, number; //unknown for now - - if (!text) return; - - tmp = text->lines.first; - - //first convert to all space, this make it alot easier to convert to tabs because there is no mixtures of ' ' && '\t' - while(tmp) { - check_line = tmp->line; - new_line = MEM_mallocN(render_string(st, check_line)+1, "Converted_Line"); - format = MEM_mallocN(render_string(st, check_line)+1, "Converted_Syntax_format"); - j = 0; - for (a=0; a < strlen(check_line); a++) { //foreach char in line - if(check_line[a] == '\t') { //checking for tabs - //get the number of spaces this tabs is showing - //i dont like doing it this way but will look into it later - new_line[j] = '\0'; - number = render_string(st, new_line); - new_line[j] = '\t'; - new_line[j+1] = '\0'; - number = render_string(st, new_line)-number; - for(extra = 0; extra < number; extra++) { - new_line[j] = ' '; - j++; - } - } else { - new_line[j] = check_line[a]; - ++j; - } - } - new_line[j] = '\0'; - // put new_line in the tmp->line spot still need to try and set the curc correctly - if (tmp->line) MEM_freeN(tmp->line); - if(tmp->format) MEM_freeN(tmp->format); - - tmp->line = new_line; - tmp->len = strlen(new_line); - tmp->format = format; - tmp = tmp->next; - } - - if (tab) // Converting to tabs - { //start over from the begining - tmp = text->lines.first; - - while(tmp) { - check_line = tmp->line; - extra = 0; - for (a = 0; a < strlen(check_line); a++) { - number = 0; - for (j = 0; j < st->tabnumber; j++) { - if ((a+j) <= strlen(check_line)) { //check to make sure we are not pass the end of the line - if(check_line[a+j] != ' ') { - number = 1; - } - } - } - if (!number) { //found all number of space to equal a tab - a = a+(st->tabnumber-1); - extra = extra+1; - } - } - - if ( extra > 0 ) { //got tabs make malloc and do what you have to do - new_line = MEM_mallocN(strlen(check_line)-(((st->tabnumber*extra)-extra)-1), "Converted_Line"); - format = MEM_mallocN(strlen(check_line)-(((st->tabnumber*extra)-extra)-1), "Converted_Syntax_format"); - extra = 0; //reuse vars - for (a = 0; a < strlen(check_line); a++) { - number = 0; - for (j = 0; j < st->tabnumber; j++) { - if ((a+j) <= strlen(check_line)) { //check to make sure we are not pass the end of the line - if(check_line[a+j] != ' ') { - number = 1; - } - } - } - if (!number) { //found all number of space to equal a tab - new_line[extra] = '\t'; - a = a+(st->tabnumber-1); - ++extra; - - } else { //not adding a tab - new_line[extra] = check_line[a]; - ++extra; - } - } - new_line[extra] = '\0'; - // put new_line in the tmp->line spot still need to try and set the curc correctly - if (tmp->line) MEM_freeN(tmp->line); - if(tmp->format) MEM_freeN(tmp->format); - - tmp->line = new_line; - tmp->len = strlen(new_line); - tmp->format = format; - } - tmp = tmp->next; - } - } -} |