b1eb0bb2228f7dce2abfce9aded06ae907b847f2
[blender.git] / source / blender / makesrna / intern / rna_text.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Blender Foundation (2008)
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file blender/makesrna/intern/rna_text.c
24  *  \ingroup RNA
25  */
26
27
28 #include <stdlib.h>
29 #include <limits.h>
30
31 #include "MEM_guardedalloc.h"
32
33 #include "BLF_translation.h"
34
35 #include "BKE_text.h"
36
37 #include "RNA_define.h"
38
39 #include "rna_internal.h"
40
41 #include "DNA_text_types.h"
42
43 #include "WM_types.h"
44
45 #ifdef RNA_RUNTIME
46
47 int text_file_modified(Text *text); /* XXX bad level call */
48
49 static void rna_Text_filename_get(PointerRNA *ptr, char *value)
50 {
51         Text *text = (Text *)ptr->data;
52
53         if (text->name)
54                 strcpy(value, text->name);
55         else
56                 value[0] = '\0';
57 }
58
59 static int rna_Text_filename_length(PointerRNA *ptr)
60 {
61         Text *text = (Text *)ptr->data;
62         return (text->name) ? strlen(text->name) : 0;
63 }
64
65 static void rna_Text_filename_set(PointerRNA *ptr, const char *value)
66 {
67         Text *text = (Text *)ptr->data;
68
69         if (text->name)
70                 MEM_freeN(text->name);
71
72         if (value[0])
73                 text->name = BLI_strdup(value);
74         else
75                 text->name = NULL;
76 }
77
78 static int rna_Text_modified_get(PointerRNA *ptr)
79 {
80         Text *text = (Text *)ptr->data;
81         return text_file_modified(text);
82 }
83
84 static void rna_TextLine_body_get(PointerRNA *ptr, char *value)
85 {
86         TextLine *line = (TextLine *)ptr->data;
87
88         if (line->line)
89                 strcpy(value, line->line);
90         else
91                 value[0] = '\0';
92 }
93
94 static int rna_TextLine_body_length(PointerRNA *ptr)
95 {
96         TextLine *line = (TextLine *)ptr->data;
97         return line->len;
98 }
99
100 static void rna_TextLine_body_set(PointerRNA *ptr, const char *value)
101 {
102         TextLine *line = (TextLine *)ptr->data;
103         int len = strlen(value);
104
105         if (line->line)
106                 MEM_freeN(line->line);
107
108         line->line = MEM_mallocN((len + 1) * sizeof(char), "rna_text_body");
109         line->len = len;
110         memcpy(line->line, value, len + 1);
111
112         if (line->format) {
113                 MEM_freeN(line->format);
114                 line->format = NULL;
115         }
116 }
117
118 #else
119
120 static void rna_def_text_line(BlenderRNA *brna)
121 {
122         StructRNA *srna;
123         PropertyRNA *prop;
124         
125         srna = RNA_def_struct(brna, "TextLine", NULL);
126         RNA_def_struct_ui_text(srna, "Text Line", "Line of text in a Text datablock");
127         
128         prop = RNA_def_property(srna, "body", PROP_STRING, PROP_NONE);
129         RNA_def_property_string_funcs(prop, "rna_TextLine_body_get", "rna_TextLine_body_length", "rna_TextLine_body_set");
130         RNA_def_property_ui_text(prop, "Line", "Text in the line");
131         RNA_def_property_update(prop, NC_TEXT | NA_EDITED, NULL);
132         RNA_def_property_translation_context(prop, BLF_I18NCONTEXT_ID_TEXT);
133 }
134
135 static void rna_def_text(BlenderRNA *brna)
136 {
137         StructRNA *srna;
138         PropertyRNA *prop;
139         
140         srna = RNA_def_struct(brna, "Text", "ID");
141         RNA_def_struct_ui_text(srna, "Text", "Text datablock referencing an external or packed text file");
142         RNA_def_struct_ui_icon(srna, ICON_TEXT);
143         RNA_def_struct_clear_flag(srna, STRUCT_ID_REFCOUNT);
144         
145         prop = RNA_def_property(srna, "filepath", PROP_STRING, PROP_NONE);
146         RNA_def_property_string_funcs(prop, "rna_Text_filename_get", "rna_Text_filename_length", "rna_Text_filename_set");
147         RNA_def_property_ui_text(prop, "File Path", "Filename of the text file");
148
149         prop = RNA_def_property(srna, "is_dirty", PROP_BOOLEAN, PROP_NONE);
150         RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_ISDIRTY);
151         RNA_def_property_ui_text(prop, "Dirty", "Text file has been edited since last save");
152
153         prop = RNA_def_property(srna, "is_modified", PROP_BOOLEAN, PROP_NONE);
154         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
155         RNA_def_property_boolean_funcs(prop, "rna_Text_modified_get", NULL);
156         RNA_def_property_ui_text(prop, "Modified", "Text file on disk is different than the one in memory");
157
158         prop = RNA_def_property(srna, "is_in_memory", PROP_BOOLEAN, PROP_NONE);
159         RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_ISMEM);
160         RNA_def_property_ui_text(prop, "Memory", "Text file is in memory, without a corresponding file on disk");
161         
162         prop = RNA_def_property(srna, "use_module", PROP_BOOLEAN, PROP_NONE);
163         RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_ISSCRIPT);
164         RNA_def_property_ui_text(prop, "Register",
165                                  "Register this text as a module on loading, Text name must end with \".py\"");
166
167         prop = RNA_def_property(srna, "use_tabs_as_spaces", PROP_BOOLEAN, PROP_NONE);
168         RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_TABSTOSPACES);
169         RNA_def_property_ui_text(prop, "Tabs as Spaces", "Automatically converts all new tabs into spaces");
170
171         prop = RNA_def_property(srna, "lines", PROP_COLLECTION, PROP_NONE);
172         RNA_def_property_struct_type(prop, "TextLine");
173         RNA_def_property_ui_text(prop, "Lines", "Lines of text");
174         
175         prop = RNA_def_property(srna, "current_line", PROP_POINTER, PROP_NONE);
176         RNA_def_property_flag(prop, PROP_NEVER_NULL);
177         RNA_def_property_pointer_sdna(prop, NULL, "curl");
178         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
179         RNA_def_property_struct_type(prop, "TextLine");
180         RNA_def_property_ui_text(prop, "Current Line", "Current line, and start line of selection if one exists");
181
182         prop = RNA_def_property(srna, "current_character", PROP_INT, PROP_UNSIGNED);
183         RNA_def_property_int_sdna(prop, NULL, "curc");
184         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
185         RNA_def_property_ui_text(prop, "Current Character",
186                                  "Index of current character in current line, and also start index of "
187                                  "character in selection if one exists");
188         
189         prop = RNA_def_property(srna, "select_end_line", PROP_POINTER, PROP_NONE);
190         RNA_def_property_flag(prop, PROP_NEVER_NULL);
191         RNA_def_property_pointer_sdna(prop, NULL, "sell");
192         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
193         RNA_def_property_struct_type(prop, "TextLine");
194         RNA_def_property_ui_text(prop, "Selection End Line", "End line of selection");
195         
196         prop = RNA_def_property(srna, "select_end_character", PROP_INT, PROP_UNSIGNED);
197         RNA_def_property_int_sdna(prop, NULL, "selc");
198         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
199         RNA_def_property_ui_text(prop, "Selection End Character",
200                                  "Index of character after end of selection in the selection end line");
201         
202         RNA_api_text(srna);
203 }
204
205 void RNA_def_text(BlenderRNA *brna)
206 {
207         rna_def_text_line(brna);
208         rna_def_text(brna);
209 }
210
211 #endif