Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/src/drawtext.c')
-rw-r--r--source/blender/src/drawtext.c3493
1 files changed, 0 insertions, 3493 deletions
diff --git a/source/blender/src/drawtext.c b/source/blender/src/drawtext.c
deleted file mode 100644
index 1c8380c7a7d..00000000000
--- a/source/blender/src/drawtext.c
+++ /dev/null
@@ -1,3493 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL 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.
- *
- * 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 LICENSE BLOCK *****
- */
-
-#include <stdlib.h>
-#include <math.h>
-#include <string.h>
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "MEM_guardedalloc.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 "BKE_node.h"
-#include "BKE_suggestions.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 "BIF_mainqueue.h"
-
-#include "BSE_filesel.h"
-
-#ifndef DISABLE_PYTHON
-#include "BPY_extern.h"
-#include "BPY_menus.h"
-#endif
-
-#include "mydevice.h"
-#include "blendef.h"
-#include "winlay.h"
-#include "PIL_time.h"
-#include <ctype.h> /* ispunct */
-#include <sys/stat.h>
-
-/***********************/ /*
-
-Notes on word-wrap
---
-All word-wrap functions follow the algorithm below to maintain consistency.
- line The line to wrap (tabs converted to spaces)
- view_width The maximum number of characters displayable in the region
- This equals region_width/font_width for the region
- wrap_chars Characters that allow wrapping. This equals [' ', '\t', '-']
-
-def wrap(line, view_width, wrap_chars):
- draw_start = 0
- draw_end = view_width
- pos = 0
- for c in line:
- if pos-draw_start >= view_width:
- print line[draw_start:draw_end]
- draw_start = draw_end
- draw_end += view_width
- elif c in wrap_chars:
- draw_end = pos+1
- pos += 1
- print line[draw_start:]
-
-*/ /***********************/
-
-#define TEXTXLOC 38
-
-#define SUGG_LIST_SIZE 7
-#define SUGG_LIST_WIDTH 20
-#define DOC_WIDTH 40
-#define DOC_HEIGHT 10
-
-#define TOOL_SUGG_LIST 0x01
-#define TOOL_DOCUMENT 0x02
-
-#define TMARK_GRP_CUSTOM 0x00010000 /* Lower 2 bytes used for Python groups */
-#define TMARK_GRP_FINDALL 0x00020000
-
-/* forward declarations */
-
-void drawtextspace(ScrArea *sa, void *spacedata);
-void winqreadtextspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
-void redraw_alltext(void);
-
-static void txt_copy_selectbuffer(Text *text);
-static void draw_brackets(SpaceText *st);
-static void get_selection_buffer(Text *text);
-static int check_bracket(char ch);
-static int check_delim(char ch);
-static int check_digit(char ch);
-static int check_identifier(char ch);
-static int check_whitespace(char ch);
-
-static int get_wrap_width(SpaceText *st);
-static void get_suggest_prefix(Text *text, int offset);
-static void confirm_suggestion(Text *text, int skipleft);
-
-#define TXT_MAXFINDSTR 255
-static int g_find_flags= TXT_FIND_WRAP;
-static char *g_find_str= NULL;
-static char *g_replace_str= NULL;
-
-static int doc_scroll= 0;
-static int jump_to= 0;
-static double last_jump= 0;
-
-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 (g_find_str) MEM_freeN(g_find_str);
- if (g_replace_str) MEM_freeN(g_replace_str);
- 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;
-}
-
-/* Checks the specified source string for a Python built-in function name. This
- name must start at the beginning of the source string and must be followed by
- a non-identifier (see check_identifier(char)) or null character.
-
- If a built-in function is found, the length of the matching name is returned.
- Otherwise, -1 is returned.
- */
-static int find_builtinfunc(char *string)
-{
- int a, i;
- 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<30; a++) {
- i = 0;
- while (1) {
- /* If we hit the end of a keyword... (eg. "def") */
- if (builtinfuncs[a][i]=='\0') {
- /* If we still have identifier chars in the source (eg. "definate") */
- if (check_identifier(string[i]))
- i = -1; /* No match */
- break; /* Next keyword if no match, otherwise we're done */
-
- /* If chars mismatch, move on to next keyword */
- } else if (string[i]!=builtinfuncs[a][i]) {
- i = -1;
- break; /* Break inner loop, start next keyword */
- }
- i++;
- }
- if (i>0) break; /* If we have a match, we're done */
- }
- return i;
-}
-
-/* Checks the specified source string for a Python special name. This name must
- start at the beginning of the source string and must be followed by a non-
- identifier (see check_identifier(char)) or null character.
-
- If a special name is found, the length of the matching name is returned.
- Otherwise, -1 is returned.
- */
-static int find_specialvar(char *string)
-{
- int i = 0;
- /* Check for "def" */
- if (string[0]=='d' && string[1]=='e' && string[2]=='f')
- i = 3;
- /* Check for "class" */
- else if (string[0]=='c' && string[1]=='l' && string[2]=='a' && string[3]=='s' && string[4]=='s')
- i = 5;
- /* If next source char is an identifier (eg. 'i' in "definate") no match */
- if (i==0 || check_identifier(string[i]))
- return -1;
- return i;
-}
-
-/* Ensures the format string for the given line is long enough, reallocating
- as needed. Allocation is done here, alone, to ensure consitency.
- */
-static int check_format_len(TextLine *line, unsigned int len)
-{
- if (line->format) {
- if (strlen(line->format) < len) {
- MEM_freeN(line->format);
- line->format = MEM_mallocN(len+2, "SyntaxFormat");
- if (!line->format) return 0;
- }
- } else {
- line->format = MEM_mallocN(len+2, "SyntaxFormat");
- if (!line->format) return 0;
- }
- return 1;
-}
-
-/* Formats the specified line. If do_next is set, the process will move on to
- the succeeding line if it is affected (eg. multiline strings). Format strings
- may contain any of the following characters:
- '_' Whitespace
- '#' Comment text
- '!' Punctuation and other symbols
- 'n' Numerals
- 'l' String letters
- 'v' Special variables (class, def)
- 'b' Built-in names (print, for, etc.)
- 'q' Other text (identifiers, etc.)
- It is terminated with a null-terminator '\0' followed by a continuation
- flag indicating whether the line is part of a multi-line string.
- */
-void txt_format_line(SpaceText *st, TextLine *line, int do_next)
-{
- char *str, *fmt, orig, cont, find, prev = ' ';
- int len, i;
-
- /* Get continuation from previous line */
- if (line->prev && line->prev->format != NULL) {
- fmt= line->prev->format;
- cont = fmt[strlen(fmt)+1]; /* Just after the null-terminator */
- } else cont = 0;
-
- /* Get original continuation from this line */
- if (line->format != NULL) {
- fmt= line->format;
- orig = fmt[strlen(fmt)+1]; /* Just after the null-terminator */
- } else orig = 0xFF;
-
- render_string(st, line->line);
- str = temp_char_buf;
- len = strlen(str);
- if (!check_format_len(line, len)) return;
- fmt = line->format;
-
- while (*str) {
- /* Handle escape sequences by skipping both \ and next char */
- if (*str == '\\') {
- *fmt = prev; fmt++; str++;
- if (*str == '\0') break;
- *fmt = prev; fmt++; str++;
- continue;
- }
- /* Handle continuations */
- else if (cont) {
- /* Triple strings ("""...""" or '''...''') */
- if (cont & TXT_TRISTR) {
- find = (cont & TXT_DBLQUOTSTR) ? '"' : '\'';
- if (*str==find && *(str+1)==find && *(str+2)==find) {
- *fmt = 'l'; fmt++; str++;
- *fmt = 'l'; fmt++; str++;
- cont = 0;
- }
- /* Handle other strings */
- } else {
- find = (cont & TXT_DBLQUOTSTR) ? '"' : '\'';
- if (*str == find) cont = 0;
- }
- *fmt = 'l';
- }
- /* Not in a string... */
- else {
- /* Deal with comments first */
- if (prev == '#' || *str == '#')
- *fmt = '#';
- /* Strings */
- else if (*str == '"' || *str == '\'') {
- find = *str;
- cont = (*str== '"') ? TXT_DBLQUOTSTR : TXT_SNGQUOTSTR;
- if (*(str+1) == find && *(str+2) == find) {
- *fmt = 'l'; fmt++; str++;
- *fmt = 'l'; fmt++; str++;
- cont |= TXT_TRISTR;
- }
- *fmt = 'l';
- }
- /* Whitespace (all ws. has been converted to spaces) */
- else if (*str == ' ')
- *fmt = '_';
- /* Numbers (digits not part of an identifier and periods followed by digits) */
- else if ((prev != 'q' && check_digit(*str)) || (*str == '.' && check_digit(*(str+1))))
- *fmt = 'n';
- /* Punctuation */
- else if (check_delim(*str))
- *fmt = '!';
- /* Identifiers and other text (no previous ws. or delims. so text continues) */
- else if (prev == 'q')
- *fmt = 'q';
- /* Not ws, a digit, punct, or continuing text. Must be new, check for special words */
- else {
- /* Special vars(v) or built-in keywords(b) */
- if ((i=find_specialvar(str)) != -1)
- prev = 'v';
- else if ((i=find_builtinfunc(str)) != -1)
- prev = 'b';
- if (i>0) {
- while (i>1) {
- *fmt = prev; fmt++; str++;
- i--;
- }
- *fmt = prev;
- } else
- *fmt = 'q';
- }
- }
- prev = *fmt;
- fmt++;
- str++;
- }
-
- /* Terminate and add continuation char */
- *fmt = '\0'; fmt++;
- *fmt = cont;
-
- /* Debugging */
- //print_format(st, line);
-
- /* If continuation has changed and we're allowed, process the next line */
- if (cont!=orig && do_next && line->next) {
- txt_format_line(st, line->next, do_next);
- }
-}
-
-/* Formats every line of the current text */
-void txt_format_text(SpaceText *st)
-{
- TextLine *linep;
-
- if (!st->text) return;
-
- for (linep=st->text->lines.first; linep; linep=linep->next)
- txt_format_line(st, linep, 0);
-}
-
-/* Sets the current drawing color based on the format character specified */
-static void format_draw_color(char formatchar)
-{
- switch (formatchar) {
- case '_': /* Whitespace */
- break;
- case '!': /* Symbols */
- BIF_ThemeColorBlend(TH_TEXT, TH_BACK, 0.5f);
- break;
- case '#': /* Comments */
- BIF_ThemeColor(TH_SYNTAX_C);
- break;
- case 'n': /* Numerals */
- BIF_ThemeColor(TH_SYNTAX_N);
- break;
- case 'l': /* Strings */
- BIF_ThemeColor(TH_SYNTAX_L);
- break;
- case 'v': /* Specials: class, def */
- BIF_ThemeColor(TH_SYNTAX_V);
- break;
- case 'b': /* Keywords: for, print, etc. */
- BIF_ThemeColor(TH_SYNTAX_B);
- break;
- case 'q': /* Other text (identifiers) */
- default:
- BIF_ThemeColor(TH_TEXT);
- break;
- }
-}
-
-static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char *format)
-{
- int basex, i, a, len, start, end, max, lines;
-
- len= render_string(st, str);
- str= temp_char_buf;
- max= w/spacetext_get_fontwidth(st);
- if (max<8) max= 8;
- basex= x;
-
- lines= 1;
- start= 0;
- end= max;
- for (i=0; i<len; i++) {
- if (i-start >= max) {
- /* Draw the visible portion of text on the overshot line */
- for (a=start; a<end; a++) {
- if (st->showsyntax && format) format_draw_color(format[a]);
- glRasterPos2i(x, y);
- BMF_DrawCharacter(spacetext_get_font(st), str[a]);
- x += BMF_GetCharacterWidth(spacetext_get_font(st), str[a]);
- }
- y -= st->lheight;
- x= basex;
- lines++;
- start= end;
- end += max;
- } else if (str[i]==' ' || str[i]=='-') {
- end = i+1;
- }
- }
- /* Draw the remaining text */
- for (a=start; a<len; a++) {
- if (st->showsyntax && format) format_draw_color(format[a]);
- glRasterPos2i(x, y);
- BMF_DrawCharacter(spacetext_get_font(st), str[a]);
- x += BMF_GetCharacterWidth(spacetext_get_font(st), str[a]);
- }
- return lines;
-}
-
-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;
- int *acc;
- char *in;
-
- 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;
- format = format+cshift;
-
- amount = strlen(in);
-
- for(a = 0; a < amount; a++) {
- format_draw_color(format[a]);
- glRasterPos2i(x, y);
- BMF_DrawCharacter(spacetext_get_font(st), in[a]);
- x = x+BMF_GetCharacterWidth(spacetext_get_font(st), in[a]);
- }
- } 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;
-
- if(st->showlinenrs)
- x-= TXT_OFFSET+TEXTXLOC;
- else
- x-= TXT_OFFSET;
-
- if (x<0) x= 0;
- x = (x/spacetext_get_fontwidth(st)) + st->left;
-
- if (st->wordwrap) {
- int i, j, endj, curs, max, chop, start, end, chars, loop;
- char ch;
-
- /* Point to first visible line */
- *linep= text->lines.first;
- for (i=0; i<st->top && (*linep)->next; i++) *linep= (*linep)->next;
-
- max= get_wrap_width(st);
-
- loop= 1;
- while (loop && *linep) {
- start= 0;
- end= max;
- chop= 1;
- chars= 0;
- curs= 0;
- endj= 0;
- for (i=0, j=0; loop; j++) {
-
- /* Mimic replacement of tabs */
- ch= (*linep)->line[j];
- if (ch=='\t') {
- chars= st->tabnumber-i%st->tabnumber;
- ch= ' ';
- } else
- chars= 1;
-
- while (chars--) {
- /* Gone too far, go back to last wrap point */
- if (y<0) {
- *charp= endj;
- loop= 0;
- break;
- /* Exactly at the cursor, done */
- } else if (y==0 && i-start==x) {
- *charp= curs= j;
- loop= 0;
- break;
- /* Prepare curs for next wrap */
- } else if (i-end==x) {
- curs= j;
- }
- if (i-start>=max) {
- if (chop) endj= j;
- y--;
- start= end;
- end += max;
- chop= 1;
- if (y==0 && i-start>=x) {
- *charp= curs;
- loop= 0;
- break;
- }
- } else if (ch==' ' || ch=='-' || ch=='\0') {
- if (y==0 && i-start>=x) {
- *charp= curs;
- loop= 0;
- break;
- }
- end = i+1;
- endj = j;
- chop= 0;
- }
- i++;
- }
- if (ch=='\0') break;
- }
- if (!loop || y<0) break;
-
- if (!(*linep)->next) {
- *charp= (*linep)->len;
- break;
- }
-
- /* On correct line but didn't meet cursor, must be at end */
- if (y==0) {
- *charp= (*linep)->len;
- break;
- }
- *linep= (*linep)->next;
- y--;
- }
-
- } else {
- 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;
- }
-
-
- 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 int get_wrap_width(SpaceText *st)
-{
- int x, max;
-
- x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
- max= (curarea->winx-x)/spacetext_get_fontwidth(st);
- return max>8 ? max : 8;
-}
-
-/* Sets (offl, offc) for transforming (line, curs) to its wrapped position */
-static void wrap_offset(SpaceText *st, TextLine *linein, int cursin, int *offl, int *offc)
-{
- Text *text;
- TextLine *linep;
- int i, j, start, end, chars, max, chop;
- char ch;
-
- *offl= *offc= 0;
-
- if (!st->text) return;
- if (!st->wordwrap) return;
-
- text= st->text;
-
- /* Move pointer to first visible line (top) */
- linep= text->lines.first;
- i= st->top;
- while (i>0 && linep) {
- if (linep == linein) return; /* Line before top */
- linep= linep->next;
- i--;
- }
-
- max= get_wrap_width(st);
-
- while (linep) {
- start= 0;
- end= max;
- chop= 1;
- chars= 0;
- *offc= 0;
- for (i=0, j=0; linep->line[j]!='\0'; j++) {
-
- /* Mimic replacement of tabs */
- ch= linep->line[j];
- if (ch=='\t') {
- chars= st->tabnumber-i%st->tabnumber;
- if (linep==linein && i<cursin) cursin += chars-1;
- ch= ' ';
- } else
- chars= 1;
-
- while (chars--) {
- if (i-start>=max) {
- if (chop && linep==linein && i >= cursin)
- return;
- (*offl)++;
- *offc -= end-start;
- start= end;
- end += max;
- chop= 1;
- } else if (ch==' ' || ch=='-') {
- end = i+1;
- chop= 0;
- if (linep==linein && i >= cursin)
- return;
- }
- i++;
- }
- }
- if (linep==linein) break;
- linep= linep->next;
- }
-}
-
-static int get_char_pos(SpaceText *st, char *line, int cur)
-{
- int a=0, i;
-
- for (i=0; i<cur && line[i]; i++) {
- if (line[i]=='\t')
- a += st->tabnumber-a%st->tabnumber;
- else
- a++;
- }
- return a;
-}
-
-static void draw_markers(SpaceText *st)
-{
- Text *text= st->text;
- TextMarker *marker, *next;
- TextLine *top, *bottom, *line;
- int offl, offc, i, cy, x1, x2, y1, y2, x, y;
-
- for (i=st->top, top= text->lines.first; top->next && i>0; i--) top= top->next;
- for (i=st->viewlines-1, bottom=top; bottom->next && i>0; i--) bottom= bottom->next;
-
- for (marker= text->markers.first; marker; marker= next) {
- next= marker->next;
- for (cy= 0, line= top; line; cy++, line= line->next) {
- if (cy+st->top==marker->lineno) {
- /* Remove broken markers */
- if (marker->end>line->len || marker->start>marker->end) {
- BLI_freelinkN(&text->markers, marker);
- break;
- }
-
- wrap_offset(st, line, marker->start, &offl, &offc);
- x1= get_char_pos(st, line->line, marker->start) - st->left + offc;
- y1= cy + offl;
- wrap_offset(st, line, marker->end, &offl, &offc);
- x2= get_char_pos(st, line->line, marker->end) - st->left + offc;
- y2= cy + offl;
-
- glColor3ub(marker->color[0], marker->color[1], marker->color[2]);
- x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
- y= curarea->winy-3;
-
- if (y1==y2) {
- y -= y1*st->lheight;
- glBegin(GL_LINE_LOOP);
- glVertex2i(x+x2*spacetext_get_fontwidth(st)+1, y);
- glVertex2i(x+x1*spacetext_get_fontwidth(st)-2, y);
- glVertex2i(x+x1*spacetext_get_fontwidth(st)-2, y-st->lheight);
- glVertex2i(x+x2*spacetext_get_fontwidth(st)+1, y-st->lheight);
- glEnd();
- } else {
- y -= y1*st->lheight;
- glBegin(GL_LINE_STRIP);
- glVertex2i(curarea->winx, y);
- glVertex2i(x+x1*spacetext_get_fontwidth(st)-2, y);
- glVertex2i(x+x1*spacetext_get_fontwidth(st)-2, y-st->lheight);
- glVertex2i(curarea->winx, y-st->lheight);
- glEnd();
- y-=st->lheight;
- for (i=y1+1; i<y2; i++) {
- glBegin(GL_LINES);
- glVertex2i(x, y);
- glVertex2i(curarea->winx, y);
- glVertex2i(x, y-st->lheight);
- glVertex2i(curarea->winx, y-st->lheight);
- glEnd();
- y-=st->lheight;
- }
- glBegin(GL_LINE_STRIP);
- glVertex2i(x, y);
- glVertex2i(x+x2*spacetext_get_fontwidth(st)+1, y);
- glVertex2i(x+x2*spacetext_get_fontwidth(st)+1, y-st->lheight);
- glVertex2i(x, y-st->lheight);
- glEnd();
- }
-
- break;
- }
- if (line==bottom) break;
- }
- }
-}
-
-static void draw_cursor(SpaceText *st)
-{
- Text *text= st->text;
- int vcurl, vcurc, vsell, vselc, hidden=0;
- int offl, offc, x, y, w, i;
-
- /* Draw the selection */
- if (text->curl!=text->sell || text->curc!=text->selc) {
-
- /* Convert all to view space character coordinates */
- wrap_offset(st, text->curl, text->curc, &offl, &offc);
- vcurl = txt_get_span(text->lines.first, text->curl) - st->top + offl;
- vcurc = get_char_pos(st, text->curl->line, text->curc) - st->left + offc;
- wrap_offset(st, text->sell, text->selc, &offl, &offc);
- vsell = txt_get_span(text->lines.first, text->sell) - st->top + offl;
- vselc = get_char_pos(st, text->sell->line, text->selc) - st->left + offc;
-
- if (vcurc<0) vcurc=0;
- if (vselc<0) vselc=0, hidden=1;
-
- BIF_ThemeColor(TH_SHADE2);
- x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
- y= curarea->winy-2;
-
- if (vcurl==vsell) {
- y -= vcurl*st->lheight;
- if (vcurc < vselc)
- glRecti(x+vcurc*spacetext_get_fontwidth(st)-1, y, x+vselc*spacetext_get_fontwidth(st), y-st->lheight);
- else
- glRecti(x+vselc*spacetext_get_fontwidth(st)-1, y, x+vcurc*spacetext_get_fontwidth(st), y-st->lheight);
- } else {
- int froml, fromc, tol, toc;
- if (vcurl < vsell) {
- froml= vcurl; tol= vsell;
- fromc= vcurc; toc= vselc;
- } else {
- froml= vsell; tol= vcurl;
- fromc= vselc; toc= vcurc;
- }
- y -= froml*st->lheight;
- glRecti(x+fromc*spacetext_get_fontwidth(st)-1, y, curarea->winx, y-st->lheight); y-=st->lheight;
- for (i=froml+1; i<tol; i++)
- glRecti(x-4, y, curarea->winx, y-st->lheight), y-=st->lheight;
- glRecti(x-4, y, x+toc*spacetext_get_fontwidth(st), y-st->lheight); y-=st->lheight;
- }
- } else {
- wrap_offset(st, text->sell, text->selc, &offl, &offc);
- vsell = txt_get_span(text->lines.first, text->sell) - st->top + offl;
- vselc = get_char_pos(st, text->sell->line, text->selc) - st->left + offc;
- if (vselc<0) vselc=0, hidden=1;
- }
-
- if (!hidden) {
- /* Draw the cursor itself (we draw the sel. cursor as this is the leading edge) */
- x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
- x += vselc*spacetext_get_fontwidth(st);
- y= curarea->winy-2 - vsell*st->lheight;
-
- if (st->overwrite) {
- char ch= text->sell->line[text->selc];
- if (!ch) ch= ' ';
- w= BMF_GetCharacterWidth(spacetext_get_font(st), ch);
- BIF_ThemeColor(TH_HILITE);
- glRecti(x, y-st->lheight-1, x+w, y-st->lheight+1);
- } else {
- BIF_ThemeColor(TH_HILITE);
- glRecti(x-1, y, x+1, y-st->lheight);
- }
- }
-}
-
-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 = (ltexth > 0)? (st->viewlines*pix_available)/ltexth: 0;
- pix_bardiff = 0;
- if (barheight < 20) {
- pix_bardiff = 20 - barheight; /* take into account the now non-linear sizing of the bar */
- barheight = 20;
- }
- barstart = (ltexth > 0)? ((pix_available - pix_bardiff) * st->top)/ltexth: 0;
-
- 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= (pix_available > 0)? (float) ltexth/pix_available: 0;
- 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));
-
- if(ltexth > 0) {
- 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 (ltexth && st->viewlines && 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 (ltexth && st->viewlines && 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;
- }
- }
- }
- else {
- hlstart = 0;
- hlend = 0;
- }
-
- 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);
-}
-
-/* Moves the view vertically by the specified number of lines */
-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;
-}
-
-/* Moves the cursor vertically by the specified number of lines.
- If the destination line is shorter than the current cursor position, the
- cursor will be positioned at the end of this line.
-
- This is to replace screen_skip for PageUp/Down operations.
- */
-static void cursor_skip(SpaceText *st, int lines, int sel)
-{
- Text *text;
- TextLine **linep;
- int oldl, oldc, *charp;
-
- if (!st) return;
- if (st->spacetype != SPACE_TEXT) return;
- if (!st->text) return;
-
- text= st->text;
-
- if (sel) linep= &text->sell, charp= &text->selc;
- else linep= &text->curl, charp= &text->curc;
- oldl= txt_get_span(text->lines.first, *linep);
- oldc= *charp;
-
- while (lines>0 && (*linep)->next) {
- *linep= (*linep)->next;
- lines--;
- }
- while (lines<0 && (*linep)->prev) {
- *linep= (*linep)->prev;
- lines++;
- }
-
- if (*charp > (*linep)->len) *charp= (*linep)->len;
-
- if (!sel) txt_pop_sel(st->text);
- txt_undo_add_toop(st->text, sel?UNDO_STO:UNDO_CTO, oldl, oldc, txt_get_span(text->lines.first, *linep), *charp);
-}
-
-/* Handles text scrolling via grabbing the view (MMB, mode 1) or with the
- scrollbar (mode 2)
- */
-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;
-
- scrarea_do_windraw(curarea);
- screen_swapbuffers();
-
- 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]);
- if (st->wordwrap) {
- st->left= 0;
- } else {
- 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;
-
- scrarea_do_windraw(curarea);
- screen_swapbuffers();
-}
-
-static void do_selection(SpaceText *st, int selecting)
-{
- int sell, selc;
- int linep2, charp2;
- int first= 1;
- short mval[2], old[2];
-
- 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 (!st->wordwrap && (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);
-
- pop_space_text(st);
-}
-
-static int do_suggest_select(SpaceText *st)
-{
- SuggItem *item, *first, *last, *sel;
- TextLine *tmp;
- int l, x, y, w, h, i;
- int tgti, *top;
- short mval[2];
-
- if (!st || !st->text) return 0;
- if (!texttool_text_is_active(st->text)) return 0;
-
- first = texttool_suggest_first();
- last = texttool_suggest_last();
- sel = texttool_suggest_selected();
- top = texttool_suggest_top();
-
- if (!last || !first)
- return 0;
-
- /* Count the visible lines to the cursor */
- for (tmp=st->text->curl, l=-st->top; tmp; tmp=tmp->prev, l++);
- if (l<0) return 0;
-
- if(st->showlinenrs) {
- x = spacetext_get_fontwidth(st)*(st->text->curc-st->left) + TXT_OFFSET + TEXTXLOC - 4;
- } else {
- x = spacetext_get_fontwidth(st)*(st->text->curc-st->left) + TXT_OFFSET - 4;
- }
- y = curarea->winy - st->lheight*l - 2;
-
- w = SUGG_LIST_WIDTH*spacetext_get_fontwidth(st) + 20;
- h = SUGG_LIST_SIZE*st->lheight + 8;
-
- getmouseco_areawin(mval);
-
- if (mval[0]<x || x+w<mval[0] || mval[1]<y-h || y<mval[1])
- return 0;
-
- /* Work out which of the items is at the top of the visible list */
- for (i=0, item=first; i<*top && item->next; i++, item=item->next);
-
- /* Work out the target item index in the visible list */
- tgti = (y-mval[1]-4) / st->lheight;
- if (tgti<0 || tgti>SUGG_LIST_SIZE)
- return 1;
-
- for (i=tgti; i>0 && item->next; i--, item=item->next);
- if (item)
- texttool_suggest_select(item);
- return 1;
-}
-
-static void pop_suggest_list()
-{
- SuggItem *item, *sel;
- int *top, i;
-
- item= texttool_suggest_first();
- sel= texttool_suggest_selected();
- top= texttool_suggest_top();
-
- i= 0;
- while (item && item != sel) {
- item= item->next;
- i++;
- }
- if (i > *top+SUGG_LIST_SIZE-1)
- *top= i-SUGG_LIST_SIZE+1;
- else if (i < *top)
- *top= i;
-}
-
-void draw_documentation(SpaceText *st)
-{
- TextLine *tmp;
- char *docs, buf[DOC_WIDTH+1], *p;
- int len, i, br, lines;
- int boxw, boxh, l, x, y, top;
-
- if (!st || !st->text) return;
- if (!texttool_text_is_active(st->text)) return;
-
- docs = texttool_docs_get();
-
- if (!docs) return;
-
- /* Count the visible lines to the cursor */
- for (tmp=st->text->curl, l=-st->top; tmp; tmp=tmp->prev, l++);
- if (l<0) return;
-
- if(st->showlinenrs) {
- x= spacetext_get_fontwidth(st)*(st->text->curc-st->left) + TXT_OFFSET + TEXTXLOC - 4;
- } else {
- x= spacetext_get_fontwidth(st)*(st->text->curc-st->left) + TXT_OFFSET - 4;
- }
- if (texttool_suggest_first()) {
- x += SUGG_LIST_WIDTH*spacetext_get_fontwidth(st) + 50;
- }
-
- top= y= curarea->winy - st->lheight*l - 2;
- len= strlen(docs);
- boxw= DOC_WIDTH*spacetext_get_fontwidth(st) + 20;
- boxh= (DOC_HEIGHT+1)*st->lheight;
-
- /* Draw panel */
- BIF_ThemeColor(TH_BACK);
- glRecti(x, y, x+boxw, y-boxh);
- BIF_ThemeColor(TH_SHADE1);
- glBegin(GL_LINE_LOOP);
- glVertex2i(x, y);
- glVertex2i(x+boxw, y);
- glVertex2i(x+boxw, y-boxh);
- glVertex2i(x, y-boxh);
- glEnd();
- glBegin(GL_LINE_LOOP);
- glVertex2i(x+boxw-10, y-7);
- glVertex2i(x+boxw-4, y-7);
- glVertex2i(x+boxw-7, y-2);
- glEnd();
- glBegin(GL_LINE_LOOP);
- glVertex2i(x+boxw-10, y-boxh+7);
- glVertex2i(x+boxw-4, y-boxh+7);
- glVertex2i(x+boxw-7, y-boxh+2);
- glEnd();
- BIF_ThemeColor(TH_TEXT);
-
- i= 0; br= DOC_WIDTH; lines= -doc_scroll;
- for (p=docs; *p; p++) {
- if (*p == '\r' && *(++p) != '\n') *(--p)= '\n'; /* Fix line endings */
- if (*p == ' ' || *p == '\t')
- br= i;
- else if (*p == '\n') {
- buf[i]= '\0';
- if (lines>=0) {
- y -= st->lheight;
- text_draw(st, buf, 0, 0, 1, x+4, y-3, NULL);
- }
- i= 0; br= DOC_WIDTH; lines++;
- }
- buf[i++]= *p;
- if (i == DOC_WIDTH) { /* Reached the width, go to last break and wrap there */
- buf[br]= '\0';
- if (lines>=0) {
- y -= st->lheight;
- text_draw(st, buf, 0, 0, 1, x+4, y-3, NULL);
- }
- p -= i-br-1; /* Rewind pointer to last break */
- i= 0; br= DOC_WIDTH; lines++;
- }
- if (lines >= DOC_HEIGHT) break;
- }
- if (doc_scroll > 0 && lines < DOC_HEIGHT) {
- doc_scroll--;
- draw_documentation(st);
- }
-}
-
-void draw_suggestion_list(SpaceText *st)
-{
- SuggItem *item, *first, *last, *sel;
- TextLine *tmp;
- char str[SUGG_LIST_WIDTH+1];
- int w, boxw=0, boxh, i, l, x, y, b, *top;
-
- if (!st || !st->text) return;
- if (!texttool_text_is_active(st->text)) return;
-
- first = texttool_suggest_first();
- last = texttool_suggest_last();
-
- if (!first || !last) return;
-
- pop_suggest_list();
- sel = texttool_suggest_selected();
- top = texttool_suggest_top();
-
- /* Count the visible lines to the cursor */
- for (tmp=st->text->curl, l=-st->top; tmp; tmp=tmp->prev, l++);
- if (l<0) return;
-
- if(st->showlinenrs) {
- x = spacetext_get_fontwidth(st)*(st->text->curc-st->left) + TXT_OFFSET + TEXTXLOC - 4;
- } else {
- x = spacetext_get_fontwidth(st)*(st->text->curc-st->left) + TXT_OFFSET - 4;
- }
- y = curarea->winy - st->lheight*l - 2;
-
- boxw = SUGG_LIST_WIDTH*spacetext_get_fontwidth(st) + 20;
- boxh = SUGG_LIST_SIZE*st->lheight + 8;
-
- BIF_ThemeColor(TH_SHADE1);
- glRecti(x-1, y+1, x+boxw+1, y-boxh-1);
- BIF_ThemeColor(TH_BACK);
- glRecti(x, y, x+boxw, y-boxh);
-
- /* Set the top 'item' of the visible list */
- for (i=0, item=first; i<*top && item->next; i++, item=item->next);
-
- for (i=0; i<SUGG_LIST_SIZE && item; i++, item=item->next) {
-
- y -= st->lheight;
-
- strncpy(str, item->name, SUGG_LIST_WIDTH);
- str[SUGG_LIST_WIDTH] = '\0';
-
- w = BMF_GetStringWidth(spacetext_get_font(st), str);
-
- if (item == sel) {
- BIF_ThemeColor(TH_SHADE2);
- glRecti(x+16, y-3, x+16+w, y+st->lheight-3);
- }
- b=1; /* b=1 colour block, text is default. b=0 no block, colour text */
- switch (item->type) {
- case 'k': BIF_ThemeColor(TH_SYNTAX_B); b=0; break;
- case 'm': BIF_ThemeColor(TH_TEXT); break;
- case 'f': BIF_ThemeColor(TH_SYNTAX_L); break;
- case 'v': BIF_ThemeColor(TH_SYNTAX_N); break;
- case '?': BIF_ThemeColor(TH_TEXT); b=0; break;
- }
- if (b) {
- glRecti(x+8, y+2, x+11, y+5);
- BIF_ThemeColor(TH_TEXT);
- }
- text_draw(st, str, 0, 0, 1, x+16, y-1, NULL);
-
- if (item == last) break;
- }
-}
-
-static short check_blockhandler(SpaceText *st, short handler)
-{
- short a;
-
- for(a=0; a<SPACE_MAXHANDLER; a+=2)
- if (st->blockhandler[a]==handler) return 1;
- return 0;
-}
-
-/* Find and replace GUI panel */
-static void text_panel_find(short cntrl) // TEXT_HANDLER_FIND
-{
- uiBlock *block;
-
- /* Ensure that find and replace buffers have been allocated */
- if (!g_find_str || !g_replace_str) {
- g_find_str= MEM_mallocN(TXT_MAXFINDSTR+1, "find_string");
- g_replace_str= MEM_mallocN(TXT_MAXFINDSTR+1, "replace_string");
- g_find_str[0]= g_replace_str[0]= '\0';
- }
-
- block= uiNewBlock(&curarea->uiblocks, "text_panel_find", UI_EMBOSS, UI_HELV, curarea->win);
- uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | cntrl);
- uiSetPanelHandler(TEXT_HANDLER_FIND); // for close and esc
- if(uiNewPanel(curarea, block, "Find & Replace", "Text", curarea->winx-230, curarea->winy-130, 260, 120)==0) return;
-
- uiBlockBeginAlign(block);
- uiDefButC(block, TEX, 0, "Find: ", 0,80,220,20, g_find_str, 0,(float)TXT_MAXFINDSTR, 0,0, "");
- uiDefIconBut(block, BUT, B_PASTEFIND, ICON_TEXT, 220,80,20,20, NULL, 0,0,0,0, "Copy from selection");
- uiDefButC(block, TEX, 0, "Replace: ", 0,60,220,20, g_replace_str, 0,(float)TXT_MAXFINDSTR, 0,0, "");
- uiDefIconBut(block, BUT, B_PASTEREPLACE, ICON_TEXT, 220,60,20,20, NULL, 0,0,0,0, "Copy from selection");
- uiBlockEndAlign(block);
- uiDefButBitI(block, TOG, TXT_FIND_WRAP, 0,"Wrap Around", 0,30,110,20,&g_find_flags,0,0,0,0,"Wrap search around current text");
- uiDefButBitI(block, TOG, TXT_FIND_ALLTEXTS,0,"Search All Texts", 110,30,130,20,&g_find_flags,0,0,0,0,"Search in each text");
- uiDefBut(block, BUT, B_TEXTFIND, "Find", 0,0,50,20, NULL, 0,0,0,0, "Find next");
- uiDefBut(block, BUT, B_TEXTREPLACE, "Replace/Find", 50,0,110,20, NULL, 0,0,0,0, "Replace then find next");
- uiDefBut(block, BUT, B_TEXTMARKALL, "Mark All", 160,0,80,20, NULL, 0,0,0,0, "Mark each occurrence to edit all from one");
-}
-
-/* mode: 0 find only, 1 replace/find, 2 mark all occurrences */
-void find_and_replace(SpaceText *st, short mode)
-{
- Text *start= NULL, *text= st->text;
- int flags, first= 1;
- char *tmp;
-
- if (!check_blockhandler(st, TEXT_HANDLER_FIND)) {
- toggle_blockhandler(st->area, TEXT_HANDLER_FIND, UI_PNL_TO_MOUSE);
- return;
- }
-
- if (!g_find_str || !g_replace_str) return;
- if (g_find_str[0] == '\0') return;
- flags= g_find_flags;
- if (flags & TXT_FIND_ALLTEXTS) flags ^= TXT_FIND_WRAP;
-
- do {
- if (first)
- txt_clear_markers(text, TMARK_GRP_FINDALL, 0);
- first= 0;
-
- /* Replace current */
- if (mode && txt_has_sel(text)) {
- tmp= txt_sel_to_buf(text);
- if (strcmp(g_find_str, tmp)==0) {
- if (mode==1) {
- txt_insert_buf(text, g_replace_str);
- if (st->showsyntax) txt_format_line(st, text->curl, 1);
- } else if (mode==2) {
- char color[4];
- BIF_GetThemeColor4ubv(TH_SHADE2, color);
- if (txt_find_marker(text, text->curl, text->selc, TMARK_GRP_FINDALL, 0)) {
- if (tmp) MEM_freeN(tmp), tmp=NULL;
- break;
- }
- txt_add_marker(text, text->curl, text->curc, text->selc, color, TMARK_GRP_FINDALL, TMARK_EDITALL);
- }
- }
- MEM_freeN(tmp);
- tmp= NULL;
- }
-
- /* Find next */
- if (txt_find_string(text, g_find_str, flags & TXT_FIND_WRAP)) {
- pop_space_text(st);
- } else if (flags & TXT_FIND_ALLTEXTS) {
- if (text==start) break;
- if (!start) start= text;
- if (text->id.next)
- text= st->text= text->id.next;
- else
- text= st->text= G.main->text.first;
- txt_move_toline(text, 0, 0);
- pop_space_text(st);
- first= 1;
- } else {
- okee("Text not found: %s", g_find_str);
- break;
- }
- } while (mode==2);
-}
-
-static void do_find_buttons(val)
-{
- Text *text;
- SpaceText *st;
- char *tmp;
-
- st= curarea->spacedata.first;
- if (!st || st->spacetype != SPACE_TEXT) return;
- text= st->text;
- if (!text) return;
-
- switch (val) {
- case B_PASTEFIND:
- if (!g_find_str) break;
- tmp= txt_sel_to_buf(text);
- strncpy(g_find_str, tmp, TXT_MAXFINDSTR);
- MEM_freeN(tmp);
- break;
- case B_PASTEREPLACE:
- if (!g_replace_str) break;
- tmp= txt_sel_to_buf(text);
- strncpy(g_replace_str, tmp, TXT_MAXFINDSTR);
- MEM_freeN(tmp);
- break;
- case B_TEXTFIND:
- find_and_replace(st, 0);
- break;
- case B_TEXTREPLACE:
- find_and_replace(st, 1);
- break;
- case B_TEXTMARKALL:
- find_and_replace(st, 2);
- break;
- }
-}
-
-static void text_blockhandlers(ScrArea *sa)
-{
- SpaceText *st= sa->spacedata.first;
- short a;
-
- /* warning; blocks need to be freed each time, handlers dont remove */
- uiFreeBlocksWin(&sa->uiblocks, sa->win);
-
- for(a=0; a<SPACE_MAXHANDLER; a+=2) {
- /* clear action value for event */
- switch(st->blockhandler[a]) {
- case TEXT_HANDLER_FIND:
- text_panel_find(st->blockhandler[a+1]);
- break;
- }
- }
- uiDrawBlocksPanels(sa, 0);
-}
-
-void drawtextspace(ScrArea *sa, void *spacedata)
-{
- SpaceText *st= curarea->spacedata.first;
- Text *text;
- TextLine *tmp;
- float col[3];
- int i, x, y;
- int linecount = 0;
- char linenr[12];
-
- if (st==NULL || st->spacetype != SPACE_TEXT) return;
-
- bwin_clear_viewmat(sa->win); /* clear buttons view */
- glLoadIdentity();
-
- 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) {
- BIF_ThemeColor(TH_GRID);
- glRecti(23, 0, (st->lheight==15)?63:59, curarea->winy - 2);
- }
-
- draw_cursor(st);
-
- tmp= text->lines.first;
- for (i= 0; i<st->top && tmp; i++) {
- if (st->showsyntax && !tmp->format) txt_format_line(st, tmp, 0);
- tmp= tmp->next;
- linecount++;
- }
-
- y= curarea->winy-st->lheight;
- x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
-
- BIF_ThemeColor(TH_TEXT);
- for (i=0; y>0 && i<st->viewlines && tmp; i++, tmp= tmp->next) {
- if (st->showsyntax && !tmp->format) {
- txt_format_line(st, tmp, 0);
- }
- if(st->showlinenrs) {
- /*Change the color of the current line the cursor is on*/
- if(tmp == text->curl) {
- BIF_ThemeColor(TH_HILITE);
- } else {
- BIF_ThemeColor(TH_TEXT);
- }
- if(((float)(i + linecount + 1)/10000.0) < 1.0) {
- sprintf(linenr, "%4d", i + linecount + 1);
- glRasterPos2i(TXT_OFFSET - 7, y);
- } else {
- sprintf(linenr, "%5d", i + linecount + 1);
- glRasterPos2i(TXT_OFFSET - 11, y);
- }
- BIF_ThemeColor(TH_TEXT);
- BMF_DrawString(spacetext_get_font(st), linenr);
- }
- if (st->wordwrap) {
- int lines = text_draw_wrapped(st, tmp->line, x, y, curarea->winx-x, tmp->format);
- y -= lines*st->lheight;
- } else {
- text_draw(st, tmp->line, st->left, 0, 1, x, y, tmp->format);
- y -= st->lheight;
- }
- }
-
- draw_brackets(st);
- draw_markers(st);
-
- draw_textscroll(st);
- draw_documentation(st);
- draw_suggestion_list(st);
-
- bwin_scalematrix(sa->win, st->blockscale, st->blockscale, st->blockscale);
- text_blockhandlers(sa);
-
- 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->sell);
- if (st->top+st->viewlines <= i || st->top > i) {
- st->top= i - st->viewlines/2;
- }
-
- if (st->wordwrap) {
- st->left= 0;
- } else {
- x= text_draw(st, st->text->sell->line, st->left, st->text->selc, 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) txt_format_text(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;
- struct stat st;
- int res;
- char file[FILE_MAXDIR+FILE_MAXFILE];
-
- /* 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;
- }
-
- BLI_strncpy(file, text->name, FILE_MAXDIR+FILE_MAXFILE);
- BLI_convertstringcode(file, G.sce);
-
- /* Should we ask to save over? */
- if (text->flags & TXT_ISTMP) {
- if (BLI_exists(file)) {
- if (!okee("Save over")) return;
- } else if (!okee("Create new file")) return;
-
- text->flags ^= TXT_ISTMP;
- }
-
- fp= fopen(file, "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);
-
- res= stat(file, &st);
- text->mtime= st.st_mtime;
-
- if (text->flags & TXT_ISDIRTY) text->flags ^= TXT_ISDIRTY;
-}
-
-void unlink_text(Text *text)
-{
- bScreen *scr;
- ScrArea *area;
- SpaceLink *sl;
-
-#ifndef DISABLE_PYTHON
- /* 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);
- }
- /* equivalently for pynodes: */
- if (nodeDynamicUnlinkText ((ID*)text)) {
- allqueue(REDRAWNODE, 0);
- }
-#endif
-
- 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;
-
-static 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;
-}
-
-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);
-}
-
-void txt_paste_clipboard(Text *text)
-{
- char * buff;
- char *temp_buff;
-
- buff = (char*)getClipboard(0);
- if(buff) {
- temp_buff = unixNewLine(buff);
-
- txt_insert_buf(text, temp_buff);
- if(buff){free((void*)buff);}
- if(temp_buff){MEM_freeN(temp_buff);}
- }
-}
-
-void get_selection_buffer(Text *text)
-{
- char *buff = getClipboard(1);
-
- txt_insert_buf(text, buff);
-}
-
-void txt_copy_clipboard(Text *text)
-{
- char *temp;
-
- txt_copy_selectbuffer(text);
-
- if (copybuffer) {
- copybuffer[bufferlength] = '\0';
- temp = winNewLine(copybuffer);
-
- putClipboard(temp, 0);
- MEM_freeN(temp);
- MEM_freeN(copybuffer);
- copybuffer= NULL;
- }
-}
-
-void run_python_script(SpaceText *st)
-{
- Text *text=st->text;
- char *py_filename;
-#ifdef DISABLE_PYTHON
- error("python disabled in this build");
-#else
- 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_pyscript( );
- 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");
- }
- }
-#endif
-}
-
-static void set_tabs(Text *text)
-{
- SpaceText *st = curarea->spacedata.first;
-
- st->currtab_set = setcurr_tab(text);
-}
-
-static void wrap_move_bol(SpaceText *st, short sel)
-{
- Text *text= st->text;
- int offl, offc, lin;
-
- lin= txt_get_span(text->lines.first, text->sell);
- wrap_offset(st, text->sell, text->selc, &offl, &offc);
-
- if (sel) {
- txt_undo_add_toop(text, UNDO_STO, lin, text->selc, lin, -offc);
- text->selc= -offc;
- } else {
- txt_undo_add_toop(text, UNDO_CTO, lin, text->curc, lin, -offc);
- text->curc= -offc;
- txt_pop_sel(text);
- }
-}
-
-static void wrap_move_eol(SpaceText *st, short sel)
-{
- Text *text= st->text;
- int offl, offc, lin, startl, c;
-
- lin= txt_get_span(text->lines.first, text->sell);
- wrap_offset(st, text->sell, text->selc, &offl, &offc);
- startl= offl;
- c= text->selc;
- while (offl==startl && text->sell->line[c]!='\0') {
- c++;
- wrap_offset(st, text->sell, c, &offl, &offc);
- } if (offl!=startl) c--;
-
- if (sel) {
- txt_undo_add_toop(text, UNDO_STO, lin, text->selc, lin, c);
- text->selc= c;
- } else {
- txt_undo_add_toop(text, UNDO_CTO, lin, text->curc, lin, c);
- text->curc= c;
- txt_pop_sel(text);
- }
-}
-
-static void wrap_move_up(SpaceText *st, short sel)
-{
- Text *text= st->text;
- int offl, offl_1, offc, fromline, toline, c, target;
-
- wrap_offset(st, text->sell, 0, &offl_1, &offc);
- wrap_offset(st, text->sell, text->selc, &offl, &offc);
- fromline= toline= txt_get_span(text->lines.first, text->sell);
- target= text->selc + offc;
-
- if (offl==offl_1) {
- if (!text->sell->prev) {
- txt_move_bol(text, sel);
- return;
- }
- toline--;
- c= text->sell->prev->len; /* End of prev. line */
- wrap_offset(st, text->sell->prev, c, &offl, &offc);
- c= -offc+target;
- } else {
- c= -offc-1; /* End of prev. line */
- wrap_offset(st, text->sell, c, &offl, &offc);
- c= -offc+target;
- }
- if (c<0) c=0;
-
- if (sel) {
- txt_undo_add_toop(text, UNDO_STO, fromline, text->selc, toline, c);
- if (toline<fromline) text->sell= text->sell->prev;
- if(text->sell) {
- if (c>text->sell->len) c= text->sell->len;
- text->selc= c;
- }
- }
- else if(text->curl) {
- txt_undo_add_toop(text, UNDO_CTO, fromline, text->curc, toline, c);
- if (toline<fromline) text->curl= text->curl->prev;
- if(text->curl) {
- if (c>text->curl->len) c= text->curl->len;
- text->curc= c;
- txt_pop_sel(text);
- }
- }
-}
-
-static void wrap_move_down(SpaceText *st, short sel)
-{
- Text *text= st->text;
- int offl, startoff, offc, fromline, toline, c, target;
-
- wrap_offset(st, text->sell, text->selc, &offl, &offc);
- fromline= toline= txt_get_span(text->lines.first, text->sell);
- target= text->selc + offc;
- startoff= offl;
- c= text->selc;
- while (offl==startoff && text->sell->line[c]!='\0') {
- c++;
- wrap_offset(st, text->sell, c, &offl, &offc);
- }
-
- if (text->sell->line[c]=='\0') {
- if (!text->sell->next) {
- txt_move_eol(text, sel);
- return;
- }
- toline++;
- c= target;
- } else {
- c += target;
- if (c > text->sell->len) c= text->sell->len;
- }
- if (c<0) c=0;
-
- if (sel) {
- txt_undo_add_toop(text, UNDO_STO, fromline, text->selc, toline, c);
- if (toline>fromline) text->sell= text->sell->next;
- if(text->sell) {
- if (c>text->sell->len) c= text->sell->len;
- text->selc= c;
- }
- }
- else if(text->curl) {
- txt_undo_add_toop(text, UNDO_CTO, fromline, text->curc, toline, c);
- if (toline>fromline) text->curl= text->curl->next;
- if(text->curl) {
- if (c > text->curl->len) c= text->curl->len;
- text->curc= c;
- txt_pop_sel(text);
- }
- }
-}
-
-static void get_suggest_prefix(Text *text, int offset)
-{
- int i, len;
- char *line, tmp[256];
-
- if (!text) return;
- if (!texttool_text_is_active(text)) return;
-
- line= text->curl->line;
- for (i=text->curc-1+offset; i>=0; i--)
- if (!check_identifier(line[i]))
- break;
- i++;
- len= text->curc-i+offset;
- if (len > 255) {
- printf("Suggestion prefix too long\n");
- len = 255;
- }
- strncpy(tmp, line+i, len);
- tmp[len]= '\0';
- texttool_suggest_prefix(tmp);
-}
-
-static void confirm_suggestion(Text *text, int skipleft)
-{
- SuggItem *sel;
- int i, over=0;
- char *line;
-
- if (!text) return;
- if (!texttool_text_is_active(text)) return;
-
- sel = texttool_suggest_selected();
- if (!sel) return;
-
- line= text->curl->line;
- i=text->curc-skipleft-1;
- while (i>=0) {
- if (!check_identifier(line[i]))
- break;
- over++;
- i--;
- }
-
- for (i=0; i<skipleft; i++)
- txt_move_left(text, 0);
- for (i=0; i<over; i++)
- txt_move_left(text, 1);
-
- txt_insert_buf(text, sel->name);
-
- for (i=0; i<skipleft; i++)
- txt_move_right(text, 0);
-
- texttool_text_clear();
-}
-
-static short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val)
-{
- int draw=0, tools=0, swallow=0, scroll=1;
- if (!texttool_text_is_active(st->text)) return 0;
- if (!st->text || st->text->id.lib) return 0;
-
- if (st->doplugins && texttool_text_is_active(st->text)) {
- if (texttool_suggest_first()) tools |= TOOL_SUGG_LIST;
- if (texttool_docs_get()) tools |= TOOL_DOCUMENT;
- }
-
- if (ascii) {
- if (tools & TOOL_SUGG_LIST) {
- if ((ascii != '_' && ascii != '*' && ispunct(ascii)) || check_whitespace(ascii)) {
- confirm_suggestion(st->text, 0);
- if (st->showsyntax) txt_format_line(st, st->text->curl, 1);
- } else if ((st->overwrite && txt_replace_char(st->text, ascii)) || txt_add_char(st->text, ascii)) {
- get_suggest_prefix(st->text, 0);
- pop_suggest_list();
- swallow= 1;
- draw= 1;
- }
- }
- if (tools & TOOL_DOCUMENT) texttool_docs_clear(), doc_scroll= 0, draw= 1;
-
- } else if (val==1 && evnt) {
- switch (evnt) {
- case LEFTMOUSE:
- if (do_suggest_select(st))
- swallow= 1;
- else {
- if (tools & TOOL_SUGG_LIST) texttool_suggest_clear();
- if (tools & TOOL_DOCUMENT) texttool_docs_clear(), doc_scroll= 0;
- }
- draw= 1;
- break;
- case MIDDLEMOUSE:
- if (do_suggest_select(st)) {
- confirm_suggestion(st->text, 0);
- if (st->showsyntax) txt_format_line(st, st->text->curl, 1);
- swallow= 1;
- } else {
- if (tools & TOOL_SUGG_LIST) texttool_suggest_clear();
- if (tools & TOOL_DOCUMENT) texttool_docs_clear(), doc_scroll= 0;
- }
- draw= 1;
- break;
- case ESCKEY:
- draw= swallow= 1;
- if (tools & TOOL_SUGG_LIST) texttool_suggest_clear();
- else if (tools & TOOL_DOCUMENT) texttool_docs_clear(), doc_scroll= 0;
- else draw= swallow= 0;
- break;
- case RETKEY:
- if (tools & TOOL_SUGG_LIST) {
- confirm_suggestion(st->text, 0);
- if (st->showsyntax) txt_format_line(st, st->text->curl, 1);
- swallow= 1;
- draw= 1;
- }
- if (tools & TOOL_DOCUMENT) texttool_docs_clear(), doc_scroll= 0, draw= 1;
- break;
- case LEFTARROWKEY:
- case BACKSPACEKEY:
- if (tools & TOOL_SUGG_LIST) {
- if (G.qual)
- texttool_suggest_clear();
- else {
- /* Work out which char we are about to delete/pass */
- if (st->text->curl && st->text->curc > 0) {
- char ch= st->text->curl->line[st->text->curc-1];
- if ((ch=='_' || !ispunct(ch)) && !check_whitespace(ch)) {
- get_suggest_prefix(st->text, -1);
- pop_suggest_list();
- }
- else
- texttool_suggest_clear();
- } else
- texttool_suggest_clear();
- }
- }
- if (tools & TOOL_DOCUMENT) texttool_docs_clear(), doc_scroll= 0;
- break;
- case RIGHTARROWKEY:
- if (tools & TOOL_SUGG_LIST) {
- if (G.qual)
- texttool_suggest_clear();
- else {
- /* Work out which char we are about to pass */
- if (st->text->curl && st->text->curc < st->text->curl->len) {
- char ch= st->text->curl->line[st->text->curc+1];
- if ((ch=='_' || !ispunct(ch)) && !check_whitespace(ch)) {
- get_suggest_prefix(st->text, 1);
- pop_suggest_list();
- }
- else
- texttool_suggest_clear();
- } else
- texttool_suggest_clear();
- }
- }
- if (tools & TOOL_DOCUMENT) texttool_docs_clear(), doc_scroll= 0;
- break;
- case PAGEDOWNKEY:
- scroll= SUGG_LIST_SIZE-1;
- case WHEELDOWNMOUSE:
- case DOWNARROWKEY:
- if (tools & TOOL_DOCUMENT) {
- doc_scroll++;
- swallow= 1;
- draw= 1;
- break;
- } else if (tools & TOOL_SUGG_LIST) {
- SuggItem *sel = texttool_suggest_selected();
- if (!sel) {
- texttool_suggest_select(texttool_suggest_first());
- } else while (sel && sel!=texttool_suggest_last() && sel->next && scroll--) {
- texttool_suggest_select(sel->next);
- sel= sel->next;
- }
- pop_suggest_list();
- swallow= 1;
- draw= 1;
- break;
- }
- case PAGEUPKEY:
- scroll= SUGG_LIST_SIZE-1;
- case WHEELUPMOUSE:
- case UPARROWKEY:
- if (tools & TOOL_DOCUMENT) {
- if (doc_scroll>0) doc_scroll--;
- swallow= 1;
- draw= 1;
- break;
- } else if (tools & TOOL_SUGG_LIST) {
- SuggItem *sel = texttool_suggest_selected();
- while (sel && sel!=texttool_suggest_first() && sel->prev && scroll--) {
- texttool_suggest_select(sel->prev);
- sel= sel->prev;
- }
- pop_suggest_list();
- swallow= 1;
- draw= 1;
- break;
- }
- case RIGHTSHIFTKEY:
- case LEFTSHIFTKEY:
- break;
- default:
- if (tools & TOOL_SUGG_LIST) texttool_suggest_clear(), draw= 1;
- if (tools & TOOL_DOCUMENT) texttool_docs_clear(), doc_scroll= 0, draw= 1;
- }
- }
-
- if (draw)
- redraw_alltext();
-
- return swallow;
-}
-
-static short do_markers(SpaceText *st, char ascii, unsigned short evnt, short val)
-{
- Text *text;
- TextMarker *marker, *mrk, *nxt;
- int c, s, draw=0, swallow=0;
-
- text= st->text;
- if (!text || text->id.lib || text->curl != text->sell) return 0;
-
- marker= txt_find_marker(text, text->sell, text->selc, 0, 0);
- if (marker && (marker->start > text->curc || marker->end < text->curc))
- marker= NULL;
-
- if (!marker) {
- /* Find the next temporary marker */
- if (evnt==TABKEY) {
- int lineno= txt_get_span(text->lines.first, text->curl);
- TextMarker *mrk= text->markers.first;
- while (mrk) {
- if (!marker && (mrk->flags & TMARK_TEMP)) marker= mrk;
- if ((mrk->flags & TMARK_TEMP) && (mrk->lineno > lineno || (mrk->lineno==lineno && mrk->end > text->curc))) {
- marker= mrk;
- break;
- }
- mrk= mrk->next;
- }
- if (marker) {
- txt_move_to(text, marker->lineno, marker->start, 0);
- txt_move_to(text, marker->lineno, marker->end, 1);
- pop_space_text(st);
- evnt= ascii= val= 0;
- draw= 1;
- swallow= 1;
- }
- } else if (evnt==ESCKEY) {
- if (txt_clear_markers(text, 0, TMARK_TEMP)) swallow= 1;
- else if (txt_clear_markers(text, 0, 0)) swallow= 1;
- else return 0;
- evnt= ascii= val= 0;
- draw= 1;
- }
- if (!swallow) return 0;
- }
-
- if (ascii) {
- if (marker->flags & TMARK_EDITALL) {
- c= text->curc-marker->start;
- s= text->selc-marker->start;
- if (s<0 || s>marker->end-marker->start) return 0;
-
- mrk= txt_next_marker(text, marker);
- while (mrk) {
- nxt=txt_next_marker(text, mrk); /* mrk may become invalid */
- txt_move_to(text, mrk->lineno, mrk->start+c, 0);
- if (s!=c) txt_move_to(text, mrk->lineno, mrk->start+s, 1);
- if (st->overwrite) {
- if (txt_replace_char(text, ascii))
- if (st->showsyntax) txt_format_line(st, text->curl, 1);
- } else {
- if (txt_add_char(text, ascii)) {
- if (st->showsyntax) txt_format_line(st, text->curl, 1);
- }
- }
-
- if (mrk==marker || mrk==nxt) break;
- mrk=nxt;
- }
- swallow= 1;
- draw= 1;
- }
- } else if (val) {
- switch(evnt) {
- case BACKSPACEKEY:
- if (marker->flags & TMARK_EDITALL) {
- c= text->curc-marker->start;
- s= text->selc-marker->start;
- if (s<0 || s>marker->end-marker->start) return 0;
-
- mrk= txt_next_marker(text, marker);
- while (mrk) {
- nxt= txt_next_marker(text, mrk); /* mrk may become invalid */
- txt_move_to(text, mrk->lineno, mrk->start+c, 0);
- if (s!=c) txt_move_to(text, mrk->lineno, mrk->start+s, 1);
- txt_backspace_char(text);
- if (st->showsyntax) txt_format_line(st, text->curl, 1);
- if (mrk==marker || mrk==nxt) break;
- mrk= nxt;
- }
- swallow= 1;
- draw= 1;
- }
- break;
- case DELKEY:
- if (marker->flags & TMARK_EDITALL) {
- c= text->curc-marker->start;
- s= text->selc-marker->start;
- if (s<0 || s>marker->end-marker->start) return 0;
-
- mrk= txt_next_marker(text, marker);
- while (mrk) {
- nxt= txt_next_marker(text, mrk); /* mrk may become invalid */
- txt_move_to(text, mrk->lineno, mrk->start+c, 0);
- if (s!=c) txt_move_to(text, mrk->lineno, mrk->start+s, 1);
- txt_delete_char(text);
- if (st->showsyntax) txt_format_line(st, text->curl, 1);
- if (mrk==marker || mrk==nxt) break;
- mrk= nxt;
- }
- swallow= 1;
- draw= 1;
- }
- break;
- case TABKEY:
- if (G.qual & LR_SHIFTKEY) {
- nxt= marker->prev;
- if (!nxt) nxt= text->markers.last;
- } else {
- nxt= marker->next;
- if (!nxt) nxt= text->markers.first;
- }
- if (marker->flags & TMARK_TEMP) {
- if (nxt==marker) nxt= NULL;
- BLI_freelinkN(&text->markers, marker);
- }
- mrk= nxt;
- if (mrk) {
- txt_move_to(text, mrk->lineno, mrk->start, 0);
- txt_move_to(text, mrk->lineno, mrk->end, 1);
- pop_space_text(st);
- }
- swallow= 1;
- draw= 1;
- break;
-
- /* Events that should clear markers */
- case UKEY: if (!(G.qual & LR_ALTKEY)) break;
- case ZKEY: if (evnt==ZKEY && !(G.qual & LR_CTRLKEY)) break;
- case RETKEY:
- case ESCKEY:
- if (marker->flags & (TMARK_EDITALL | TMARK_TEMP))
- txt_clear_markers(text, marker->group, 0);
- else
- BLI_freelinkN(&text->markers, marker);
- swallow= 1;
- draw= 1;
- break;
- case RIGHTMOUSE: /* Marker context menu? */
- case LEFTMOUSE:
- break;
- case FKEY: /* Allow find */
- if (G.qual & LR_SHIFTKEY) swallow= 1;
- break;
-
- default:
- if (G.qual!=0 && G.qual!=LR_SHIFTKEY)
- swallow= 1; /* Swallow all other shortcut events */
- }
- }
-
- if (draw)
- redraw_alltext();
-
- return swallow;
-}
-
-
-void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
-{
- SpaceText *st= curarea->spacedata.first;
- Text *text;
- int do_draw=0, p;
- unsigned short event= evt->event;
- short val= evt->val;
- char ascii= evt->ascii;
-
- 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 (val && uiDoBlocks(&curarea->uiblocks, event, 1)!=UI_NOTHING) event= 0;
-
- if (st->doplugins && do_texttools(st, ascii, event, val)) return;
- if (do_markers(st, ascii, event, val)) return;
-
- if (event==UI_BUT_EVENT) {
- do_find_buttons(val);
- do_draw= 1;
- } else if (event==LEFTMOUSE) {
- if (val) {
- short mval[2];
- char *buffer;
- 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);
- if (txt_has_sel(text)) {
- buffer = txt_sel_to_buf(text);
- putClipboard(buffer, 1);
- MEM_freeN(buffer);
- }
- do_draw= 1;
- }
- }
- } else if (event==MIDDLEMOUSE) {
- if (val) {
- if (U.uiflag & USER_MMB_PASTE) {
- do_selection(st, G.qual&LR_SHIFTKEY);
- get_selection_buffer(text);
- do_draw= 1;
- } else {
- do_textscroll(st, 1);
- }
- }
- } else if (event==RIGHTMOUSE) {
- if (val) {
- if (txt_has_sel(text))
- p= pupmenu("Text %t|Cut%x10|Copy%x11|Paste%x12|New %x0|Open... %x1|Save %x2|Save As...%x3|Execute Script%x4");
- else
- p= pupmenu("Text %t|Paste%x12|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;
- case 10:
- if (text && text->id.lib) {
- error_libdata();
- break;
- }
- txt_copy_clipboard(text);
- txt_cut_sel(text);
- pop_space_text(st);
- do_draw= 1;
- break;
- case 11:
- //txt_copy_sel(text);
- txt_copy_clipboard(text);
- break;
- case 12:
- if (text && text->id.lib) {
- error_libdata();
- break;
- }
- txt_paste_clipboard(text);
- if (st->showsyntax) txt_format_text(st);
- do_draw= 1;
- break;
- }
- }
- } else if (ascii) {
- if (text && text->id.lib) {
- error_libdata();
- } else {
- short mval[2];
- getmouseco_areawin(mval);
- if (st->showlinenrs && mval[0]>2 && mval[0]<60 && mval[1]>2 && mval[1]<curarea->winy-2) {
- if (ascii>='0' && ascii<='9') {
- double time = PIL_check_seconds_timer();
- if (last_jump < time-1) jump_to= 0;
- jump_to *= 10; jump_to += (int)(ascii-'0');
- txt_move_toline(text, jump_to-1, 0);
- last_jump= time;
- }
- } else if ((st->overwrite && txt_replace_char(text, ascii)) || txt_add_char(text, ascii)) {
- if (st->showsyntax) txt_format_line(st, text->curl, 1);
- }
- 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_clipboard(text);
-
- do_draw= 1;
- }
- break; /* BREAK C */
- case DKEY:
- if (text && text->id.lib) {
- error_libdata();
- break;
- }
- if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY)) {
- //uncommenting
- txt_order_cursors(text);
- uncomment(text);
- do_draw = 1;
- if (st->showsyntax) txt_format_text(st);
- break;
- } else if (G.qual == LR_CTRLKEY) {
- txt_delete_char(text);
- if (st->showsyntax) txt_format_line(st, text->curl, 1);
- 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:
- if (text && text->id.lib) {
- error_libdata();
- break;
- }
- txt_copy_clipboard(text); //First copy to clipboard
- txt_cut_sel(text);
- do_draw= 1;
- break;
- case 1:
- txt_copy_clipboard(text);
- //txt_copy_sel(text);
- do_draw= 1;
- break;
- case 2:
- if (text && text->id.lib) {
- error_libdata();
- break;
- }
- //txt_paste(text);
- txt_paste_clipboard(text);
- if (st->showsyntax) txt_format_text(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|LR_CTRLKEY)) {
- find_and_replace(st, 0);
- do_draw= 1;
- }
- break; /* BREAK F */
- case HKEY:
- if (G.qual & (LR_ALTKEY|LR_CTRLKEY)) {
- find_and_replace(st, 1);
- do_draw= 1;
- }
- break; /* BREAK H */
- 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) {
-#ifndef DISABLE_PYTHON
- if (text->compiled) BPY_free_compiled_text(text);
- text->compiled = NULL;
-#endif
- if (okee("Reopen text")) {
- if (!reopen_text(text))
- error("Could not reopen file");
- if (st->showsyntax) txt_format_text(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);
- pop_space_text(st);
- do_draw= 1;
- }
- if (G.qual == LR_ALTKEY) {
- txt_do_undo(text);
- if (st->showsyntax) txt_format_text(st);
- pop_space_text(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) {
- if (text && text->id.lib) {
- error_libdata();
- break;
- }
- /* Throwing in the Shift modifier Paste from the OS clipboard */
- if (G.qual & LR_SHIFTKEY)
- txt_paste_clipboard(text);
- else
- txt_paste_clipboard(text);
- if (st->showsyntax) txt_format_text(st);
- do_draw= 1;
- pop_space_text(st);
- }
- break; /* BREAK V */
- case XKEY:
- if (G.qual == LR_ALTKEY || G.qual == LR_CTRLKEY) {
- if (text && text->id.lib) {
- error_libdata();
- break;
- }
- txt_cut_sel(text);
- if (st->showsyntax) txt_format_text(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) txt_format_text(st);
- pop_space_text(st);
- do_draw= 1;
- }
- break;
- case TABKEY:
- if (text && text->id.lib) {
- error_libdata();
- break;
- } else {
- if (txt_has_sel(text)) {
- if (G.qual & LR_SHIFTKEY) {
- txt_order_cursors(text);
- unindent(text);
- if (st->showsyntax) txt_format_text(st);
- } else {
- txt_order_cursors(text);
- indent(text);
- if (st->showsyntax) txt_format_text(st);
- }
- } else {
- txt_add_char(text, '\t');
- if (st->showsyntax) txt_format_line(st, text->curl, 1);
- }
- }
- pop_space_text(st);
- do_draw= 1;
- st->currtab_set = setcurr_tab(text);
- break;
- case RETKEY:
- if (text && text->id.lib) {
- error_libdata();
- break;
- }
- //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) {
- if (text->curl->prev) txt_format_line(st, text->curl->prev, 0);
- txt_format_line(st, text->curl, 1);
- }
- do_draw= 1;
- pop_space_text(st);
- break;
- case BACKSPACEKEY:
- if (text && text->id.lib) {
- error_libdata();
- break;
- }
- if (G.qual & (LR_ALTKEY | LR_CTRLKEY)) {
- txt_backspace_word(text);
- } else {
- txt_backspace_char(text);
- }
- set_tabs(text);
- if (st->showsyntax) txt_format_line(st, text->curl, 1);
- do_draw= 1;
- pop_space_text(st);
- break;
- case DELKEY:
- if (text && text->id.lib) {
- error_libdata();
- break;
- }
- if (G.qual & (LR_ALTKEY | LR_CTRLKEY)) {
- txt_delete_word(text);
- } else {
- txt_delete_char(text);
- }
- if (st->showsyntax) txt_format_line(st, text->curl, 1);
- do_draw= 1;
- pop_space_text(st);
- st->currtab_set = setcurr_tab(text);
- break;
- case INSERTKEY:
- st->overwrite= !st->overwrite;
- do_draw= 1;
- break;
- case LEFTARROWKEY:
- if (G.qual & LR_COMMANDKEY)
- txt_move_bol(text, G.qual & LR_SHIFTKEY);
- else if (G.qual & LR_ALTKEY)
- txt_jump_left(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 if (G.qual & LR_ALTKEY)
- txt_jump_right(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:
- if (st->wordwrap) wrap_move_up(st, G.qual & LR_SHIFTKEY);
- else txt_move_up(text, G.qual & LR_SHIFTKEY);
- set_tabs(text);
- do_draw= 1;
- pop_space_text(st);
- break;
- case DOWNARROWKEY:
- if (st->wordwrap) wrap_move_down(st, G.qual & LR_SHIFTKEY);
- else txt_move_down(text, G.qual & LR_SHIFTKEY);
- set_tabs(text);
- do_draw= 1;
- pop_space_text(st);
- break;
- case PAGEDOWNKEY:
- cursor_skip(st, st->viewlines, G.qual & LR_SHIFTKEY);
- pop_space_text(st);
- do_draw= 1;
- break;
- case PAGEUPKEY:
- cursor_skip(st, -st->viewlines, G.qual & LR_SHIFTKEY);
- pop_space_text(st);
- do_draw= 1;
- break;
- case HOMEKEY:
- if (st->wordwrap) wrap_move_bol(st, G.qual & LR_SHIFTKEY);
- else txt_move_bol(text, G.qual & LR_SHIFTKEY);
- do_draw= 1;
- pop_space_text(st);
- break;
- case ENDKEY:
- if (st->wordwrap) wrap_move_eol(st, G.qual & LR_SHIFTKEY);
- else 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;
- }
- }
-
-#ifndef DISABLE_PYTHON
- /* Run text plugin scripts if enabled */
- if (st->doplugins && event && val) {
- if (BPY_menu_do_shortcut(PYMENU_TEXTPLUGIN, event, G.qual)) {
- do_draw= 1;
- }
- }
-#endif
- if (do_draw)
- redraw_alltext();
-}
-
-static void draw_brackets(SpaceText *st)
-{
- TextLine *startl, *endl, *linep;
- Text *text = st->text;
- int b, c, startc, endc, find, stack;
- int viewc, viewl, offl, offc, x, y;
- char ch;
-
- if (!text || !text->curl) return;
-
- startl= text->curl;
- startc= text->curc;
- b= check_bracket(startl->line[startc]);
- if (b==0 && startc>0) b = check_bracket(startl->line[--startc]);
- if (b==0) return;
-
- linep= startl;
- c= startc;
- endl= NULL;
- endc= -1;
- find= -b;
- stack= 0;
-
- /* Opening bracket, search forward for close */
- if (b>0) {
- c++;
- while (linep) {
- while (c<linep->len) {
- b= check_bracket(linep->line[c]);
- if (b==find) {
- if (stack==0) {
- endl= linep;
- endc= c;
- break;
- }
- stack--;
- } else if (b==-find) {
- stack++;
- }
- c++;
- }
- if (endl) break;
- linep= linep->next;
- c= 0;
- }
- }
- /* Closing bracket, search backward for open */
- else {
- c--;
- while (linep) {
- while (c>=0) {
- b= check_bracket(linep->line[c]);
- if (b==find) {
- if (stack==0) {
- endl= linep;
- endc= c;
- break;
- }
- stack--;
- } else if (b==-find) {
- stack++;
- }
- c--;
- }
- if (endl) break;
- linep= linep->prev;
- if (linep) c= linep->len-1;
- }
- }
-
- if (!endl || endc==-1) return;
-
- BIF_ThemeColor(TH_HILITE);
- x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
- y= curarea->winy - st->lheight;
-
- ch= startl->line[startc];
- wrap_offset(st, startl, startc, &offl, &offc);
- viewc= get_char_pos(st, startl->line, startc) - st->left + offc;
- if (viewc >= 0){
- viewl= txt_get_span(text->lines.first, startl) - st->top + offl;
- glRasterPos2i(x+viewc*spacetext_get_fontwidth(st), y-viewl*st->lheight);
- BMF_DrawCharacter(spacetext_get_font(st), ch);
- glRasterPos2i(x+viewc*spacetext_get_fontwidth(st)+1, y-viewl*st->lheight);
- BMF_DrawCharacter(spacetext_get_font(st), ch);
- }
- ch= endl->line[endc];
- wrap_offset(st, endl, endc, &offl, &offc);
- viewc= get_char_pos(st, endl->line, endc) - st->left + offc;
- if (viewc >= 0) {
- viewl= txt_get_span(text->lines.first, endl) - st->top + offl;
- glRasterPos2i(x+viewc*spacetext_get_fontwidth(st), y-viewl*st->lheight);
- BMF_DrawCharacter(spacetext_get_font(st), ch);
- glRasterPos2i(x+viewc*spacetext_get_fontwidth(st)+1, y-viewl*st->lheight);
- BMF_DrawCharacter(spacetext_get_font(st), ch);
- }
-}
-
-static int check_bracket(char ch)
-{
- int a;
- char opens[] = "([{";
- char close[] = ")]}";
-
- for (a=0; a<3; a++) {
- if(ch==opens[a])
- return a+1;
- else if (ch==close[a])
- return -(a+1);
- }
- return 0;
-}
-
-static int check_delim(char ch)
-{
- int a;
- char delims[] = "():\"\' ~!%^&*-+=[]{};/<>|.#\t,";
-
- for (a=0; a<28; a++) {
- if (ch==delims[a])
- return 1;
- }
- return 0;
-}
-
-static int check_digit(char ch)
-{
- if (ch < '0') return 0;
- if (ch <= '9') return 1;
- return 0;
-}
-
-static int check_identifier(char ch)
-{
- if (ch < '0') return 0;
- if (ch <= '9') return 1;
- if (ch < 'A') return 0;
- if (ch <= 'Z' || ch == '_') return 1;
- if (ch < 'a') return 0;
- if (ch <= 'z') return 1;
- return 0;
-}
-
-static int check_whitespace(char ch)
-{
- if (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n')
- return 1;
- return 0;
-}
-
-void convert_tabs (struct SpaceText *st, int tab)
-{
- Text *text = st->text;
- TextLine *tmp;
- size_t a, j;
- char *check_line, *new_line;
- int 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");
- 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 = NULL;
- 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 < (size_t)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");
- extra = 0; //reuse vars
- for (a = 0; a < strlen(check_line); a++) {
- number = 0;
- for (j = 0; j < (size_t)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 = NULL;
- }
- tmp = tmp->next;
- }
- }
-
- if (st->showsyntax) txt_format_text(st);
-}
-
-void redraw_alltext(void)
-{
- ScrArea *sa;
-
- if(!G.curscreen)
- return;
-
- 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);
- }
- }
-}