NLA SoC: Start of 'Meta' Strips
[blender.git] / source / blender / blenkernel / intern / text.c
index 12133fc4fff4aa583196bd7bf7cf0ddab1c55612..8e3d59bbc5869985a5ac92170d3fd27562640bfc 100644 (file)
 #include "DNA_scene_types.h"
 #include "DNA_text_types.h"
 
-#include "BKE_bad_level_calls.h"
 #include "BKE_utildefines.h"
 #include "BKE_text.h"
 #include "BKE_library.h"
 #include "BKE_global.h"
 #include "BKE_main.h"
 
+#ifndef DISABLE_PYTHON
 #include "BPY_extern.h"
+#endif
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
@@ -64,9 +65,6 @@ A text should relate to a file as follows -
 (Text *)->flags has the following bits
        TXT_ISDIRTY - should always be set if the file in mem. differs from
                                        the file on disk, or if there is no file on disk.
-       TXT_ISTMP - should always be set if the (Text *)->name file has not
-                                       been written before, and attempts to save should result
-                                       in "Save over?"
        TXT_ISMEM - should always be set if the Text has not been mapped to
                                        a file, in which case (Text *)->name may be NULL or garbage.                    
        TXT_ISEXT - should always be set if the Text is not to be written into
@@ -129,7 +127,6 @@ static void txt_delete_line(Text *text, TextLine *line);
 
 /***/
 
-static char *txt_cut_buffer= NULL;
 static unsigned char undoing;
 
 /* allow to switch off undoing externally */
@@ -158,7 +155,9 @@ void free_text(Text *text)
 
        if(text->name) MEM_freeN(text->name);
        MEM_freeN(text->undo_buf);
+#ifndef DISABLE_PYTHON
        if (text->compiled) BPY_free_compiled_text(text);
+#endif
 }
 
 Text *add_empty_text(char *name) 
@@ -176,7 +175,7 @@ Text *add_empty_text(char *name)
        ta->undo_buf= MEM_mallocN(ta->undo_len, "undo buf");
                
        ta->nlines=1;
-       ta->flags= TXT_ISDIRTY | TXT_ISTMP | TXT_ISMEM;
+       ta->flags= TXT_ISDIRTY | TXT_ISMEM;
 
        ta->lines.first= ta->lines.last= NULL;
        ta->markers.first= ta->markers.last= NULL;
@@ -254,8 +253,6 @@ int reopen_text(Text *text)
        text->undo_len= TXT_INIT_UNDO;
        text->undo_buf= MEM_mallocN(text->undo_len, "undo buf");
        
-       text->flags= TXT_ISTMP; 
-       
        fseek(fp, 0L, SEEK_END);
        len= ftell(fp);
        fseek(fp, 0L, SEEK_SET);        
@@ -319,7 +316,7 @@ int reopen_text(Text *text)
        return 1;
 }
 
-Text *add_text(char *file) 
+Text *add_text(char *file, const char *relpath
 {
        FILE *fp;
        int i, llen, len, res;
@@ -331,8 +328,8 @@ Text *add_text(char *file)
        struct stat st;
 
        BLI_strncpy(str, file, FILE_MAXDIR+FILE_MAXFILE);
-       if (G.scene) /* can be NULL (bg mode) */
-               BLI_convertstringcode(str, G.sce);
+       if (relpath) /* can be NULL (bg mode) */
+               BLI_convertstringcode(str, relpath);
        BLI_split_dirfile_basic(str, NULL, sfile);
        
        fp= fopen(str, "r");
@@ -344,9 +341,6 @@ Text *add_text(char *file)
        ta->lines.first= ta->lines.last= NULL;
        ta->markers.first= ta->markers.last= NULL;
        ta->curl= ta->sell= NULL;
-
-/*     ta->flags= TXT_ISTMP | TXT_ISEXT; */
-       ta->flags= TXT_ISTMP;
        
        fseek(fp, 0L, SEEK_END);
        len= ftell(fp);
@@ -427,7 +421,7 @@ Text *copy_text(Text *ta)
        tan->name= MEM_mallocN(strlen(ta->name)+1, "text_name");
        strcpy(tan->name, ta->name);
        
-       tan->flags = ta->flags | TXT_ISDIRTY | TXT_ISTMP;
+       tan->flags = ta->flags | TXT_ISDIRTY;
        
        tan->lines.first= tan->lines.last= NULL;
        tan->markers.first= tan->markers.last= NULL;
@@ -571,19 +565,22 @@ int txt_get_span (TextLine *from, TextLine *to)
 static void txt_make_dirty (Text *text)
 {
        text->flags |= TXT_ISDIRTY;
+#ifndef DISABLE_PYTHON
        if (text->compiled) BPY_free_compiled_text(text);
+#endif
 }
 
 /* 0:whitespace, 1:punct, 2:alphanumeric */
 static short txt_char_type (char ch)
 {
-       if (ch <= ' ') return 0;
-       if (ch <= '/') return 1;
-       if (ch <= '9') return 2;
-       if (ch <= '@') return 1;
-       if (ch <= 'Z') return 2;
-       if (ch <= '`') return 1;
-       if (ch <= 'z') return 2;
+       if (ch <= ' ') return 0; /* 32 */
+       if (ch <= '/') return 1; /* 47 */
+       if (ch <= '9') return 2; /* 57 */
+       if (ch <= '@') return 1; /* 64 */
+       if (ch <= 'Z') return 2; /* 90 */
+       if (ch == '_') return 2; /* 95, dont delimit '_' */
+       if (ch <= '`') return 1; /* 96 */
+       if (ch <= 'z') return 2; /* 122 */
        return 1;
 }
 
@@ -1050,11 +1047,6 @@ void txt_sel_line (Text *text)
 /* Cut and paste functions */
 /***************************/
 
-void txt_print_cutbuffer (void) 
-{
-       printf ("Cut buffer\n--\n%s\n--\n", txt_cut_buffer);    
-}
-
 char *txt_to_buf (Text *text)
 {
        int length;
@@ -1159,15 +1151,6 @@ int txt_find_string(Text *text, char *findstr, int wrap)
                return 0;
 }
 
-void txt_cut_sel (Text *text)
-{
-       if (!G.background) /* Python uses txt_cut_sel, which it should not, working around for now  */
-               txt_copy_clipboard(text);
-       
-       txt_delete_sel(text);
-       txt_make_dirty(text);
-}
-
 char *txt_sel_to_buf (Text *text)
 {
        char *buf;
@@ -1245,85 +1228,6 @@ char *txt_sel_to_buf (Text *text)
        return buf;
 }
 
-void txt_copy_sel (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 (txt_cut_buffer) MEM_freeN(txt_cut_buffer);
-       txt_cut_buffer= 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;
-
-               txt_cut_buffer= MEM_mallocN(length+1, "cut buffera");
-               
-               BLI_strncpy(txt_cut_buffer, 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;
-               }
-               
-               txt_cut_buffer= MEM_mallocN(length+1, "cut bufferb");
-               
-               strncpy(txt_cut_buffer, linef->line+ charf, linef->len-charf);
-               length= linef->len-charf;
-               
-               txt_cut_buffer[length++]='\n';
-               
-               tmp= linef->next;
-               while (tmp && tmp!=linel) {
-                       strncpy(txt_cut_buffer+length, tmp->line, tmp->len);
-                       length+= tmp->len;
-                       
-                       txt_cut_buffer[length++]='\n';                  
-                       
-                       tmp= tmp->next;
-               }
-               strncpy(txt_cut_buffer+length, linel->line, charl);
-               length+= charl;
-               
-               txt_cut_buffer[length]=0;
-       }
-}
-
 void txt_insert_buf(Text *text, char *in_buffer)
 {
        int i=0, l=0, j, u, len;
@@ -1374,38 +1278,32 @@ void txt_insert_buf(Text *text, char *in_buffer)
        undoing= u;
 }
 
-void txt_free_cut_buffer(void) 
-{
-       if (txt_cut_buffer) MEM_freeN(txt_cut_buffer);
-}
-
-void txt_paste(Text *text)
-{
-       txt_insert_buf(text, txt_cut_buffer);
-}
-
 /******************/
 /* Undo functions */
 /******************/
 
-#define MAX_UNDO_TEST(x) \
-       while (text->undo_pos+x >= text->undo_len) { \
-               if(text->undo_len*2 > TXT_MAX_UNDO) { \
-                       error("Undo limit reached, buffer cleared\n"); \
-                       MEM_freeN(text->undo_buf); \
-                       text->undo_len= TXT_INIT_UNDO; \
-                       text->undo_buf= MEM_mallocN(text->undo_len, "undo buf"); \
-                       text->undo_pos=-1; \
-                       return; \
-               } else { \
-                       void *tmp= text->undo_buf; \
-                       text->undo_buf= MEM_callocN(text->undo_len*2, "undo buf"); \
-                       memcpy(text->undo_buf, tmp, text->undo_len); \
-                       text->undo_len*=2; \
-                       MEM_freeN(tmp); \
-               } \
+static int max_undo_test(Text *text, int x)
+{
+       while (text->undo_pos+x >= text->undo_len) {
+               if(text->undo_len*2 > TXT_MAX_UNDO) {
+                       /* XXX error("Undo limit reached, buffer cleared\n"); */
+                       MEM_freeN(text->undo_buf);
+                       text->undo_len= TXT_INIT_UNDO;
+                       text->undo_buf= MEM_mallocN(text->undo_len, "undo buf");
+                       text->undo_pos=-1;
+                       return 0;
+               } else {
+                       void *tmp= text->undo_buf;
+                       text->undo_buf= MEM_callocN(text->undo_len*2, "undo buf");
+                       memcpy(text->undo_buf, tmp, text->undo_len);
+                       text->undo_len*=2;
+                       MEM_freeN(tmp);
+               }
        }
 
+       return 1;
+}
+
 static void dump_buffer(Text *text) 
 {
        int i= 0;
@@ -1551,7 +1449,8 @@ void txt_print_undo(Text *text)
 
 static void txt_undo_add_op(Text *text, int op)
 {
-       MAX_UNDO_TEST(2);
+       if(!max_undo_test(text, 2))
+               return;
        
        text->undo_pos++;
        text->undo_buf[text->undo_pos]= op;
@@ -1564,7 +1463,8 @@ static void txt_undo_add_block(Text *text, int op, char *buf)
        
        length= strlen(buf);
        
-       MAX_UNDO_TEST(length+11);
+       if(!max_undo_test(text, length+11))
+               return;
 
        text->undo_pos++;
        text->undo_buf[text->undo_pos]= op;
@@ -1598,7 +1498,8 @@ static void txt_undo_add_block(Text *text, int op, char *buf)
 
 void txt_undo_add_toop(Text *text, int op, unsigned int froml, unsigned short fromc, unsigned int tol, unsigned short toc)
 {
-       MAX_UNDO_TEST(15);
+       if(!max_undo_test(text, 15))
+               return;
 
        if (froml==tol && fromc==toc) return;
 
@@ -1641,7 +1542,8 @@ void txt_undo_add_toop(Text *text, int op, unsigned int froml, unsigned short fr
 
 static void txt_undo_add_charop(Text *text, int op, char c)
 {
-       MAX_UNDO_TEST(4);
+       if(!max_undo_test(text, 4))
+               return;
 
        text->undo_pos++;
        text->undo_buf[text->undo_pos]= op;
@@ -1862,7 +1764,7 @@ void txt_do_undo(Text *text)
                        text->undo_pos--;
                        break;
                default:
-                       error("Undo buffer error - resetting");
+                       //XXX error("Undo buffer error - resetting");
                        text->undo_pos= -1;
                        
                        break;
@@ -2075,7 +1977,7 @@ void txt_do_redo(Text *text)
                        }
                        break;
                default:
-                       error("Undo buffer error - resetting");
+                       //XXX error("Undo buffer error - resetting");
                        text->undo_pos= -1;
 
                        break;
@@ -2243,7 +2145,6 @@ void txt_delete_char (Text *text)
                                if ((mrk->flags & TMARK_TEMP) && !(mrk->flags & TMARK_EDITALL)) {
                                        txt_clear_markers(text, mrk->group, TMARK_TEMP);
                                } else {
-                                       TextMarker *nxt= mrk->next;
                                        BLI_freelinkN(&text->markers, mrk);
                                }
                                return;
@@ -2308,7 +2209,6 @@ void txt_backspace_char (Text *text)
                                if ((mrk->flags & TMARK_TEMP) && !(mrk->flags & TMARK_EDITALL)) {
                                        txt_clear_markers(text, mrk->group, TMARK_TEMP);
                                } else {
-                                       TextMarker *nxt= mrk->next;
                                        BLI_freelinkN(&text->markers, mrk);
                                }
                                return;
@@ -2390,6 +2290,12 @@ int txt_add_char (Text *text, char add)
        return 1;
 }
 
+void txt_delete_selected(Text *text)
+{
+       txt_delete_sel(text);
+       txt_make_dirty(text);
+}
+
 int txt_replace_char (Text *text, char add)
 {
        char del;
@@ -2681,13 +2587,6 @@ int setcurr_tab (Text *text)
 /* Text marker utility functions */
 /*********************************/
 
-static int color_match(TextMarker *a, TextMarker *b) {
-       return (a->color[0]==b->color[0] &&
-                       a->color[1]==b->color[1] &&
-                       a->color[2]==b->color[2] &&
-                       a->color[3]==b->color[3]);
-}
-
 /* Creates and adds a marker to the list maintaining sorted order */
 void txt_add_marker(Text *text, TextLine *line, int start, int end, char color[4], int group, int flags) {
        TextMarker *tmp, *marker;