I made multitude of fixes based on the comments provided online:
[blender.git] / source / blender / makesrna / intern / rna_text.c
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * Contributor(s): Blender Foundation (2008)
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 /** \file blender/makesrna/intern/rna_text.c
26  *  \ingroup RNA
27  */
28
29
30 #include <stdlib.h>
31 #include <limits.h>
32
33 #include "MEM_guardedalloc.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);
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                 strcpy(value, "");
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(strlen(value))
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                 strcpy(value, "");
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 }
133
134 static void rna_def_text_marker(BlenderRNA *brna)
135 {
136         StructRNA *srna;
137         PropertyRNA *prop;
138         
139         srna = RNA_def_struct(brna, "TextMarker", NULL);
140         RNA_def_struct_ui_text(srna, "Text Marker", "Marker highlighting a portion of text in a Text datablock");
141
142         prop= RNA_def_property(srna, "line", PROP_INT, PROP_UNSIGNED);
143         RNA_def_property_int_sdna(prop, NULL, "lineno");
144         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
145         RNA_def_property_ui_text(prop, "Line", "Line in which the marker is located");
146         
147         prop= RNA_def_property(srna, "character_index_start", PROP_INT, PROP_UNSIGNED);
148         RNA_def_property_int_sdna(prop, NULL, "start");
149         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
150         RNA_def_property_ui_text(prop, "Start", "Start position of the marker in the line");
151
152         prop= RNA_def_property(srna, "character_index_end", PROP_INT, PROP_UNSIGNED);
153         RNA_def_property_int_sdna(prop, NULL, "end");
154         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
155         RNA_def_property_ui_text(prop, "End", "Start position of the marker in the line");
156         
157         prop= RNA_def_property(srna, "group", PROP_INT, PROP_UNSIGNED);
158         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
159         RNA_def_property_range(prop, 0, (int)0xFFFF);
160         RNA_def_property_ui_text(prop, "Group", "");
161         
162         prop= RNA_def_property(srna, "is_temporary", PROP_BOOLEAN, PROP_NONE);
163         RNA_def_property_boolean_sdna(prop, NULL, "flags", TMARK_TEMP);
164         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
165         RNA_def_property_ui_text(prop, "Temporary", "Marker is temporary");
166
167         prop= RNA_def_property(srna, "use_edit_all", PROP_BOOLEAN, PROP_NONE);
168         RNA_def_property_boolean_sdna(prop, NULL, "flags", TMARK_EDITALL);
169         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
170         RNA_def_property_ui_text(prop, "Edit All", "Edit all markers of the same group as one");
171         
172         prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA);
173         RNA_def_property_range(prop, 0.0f, 1.0f);
174         RNA_def_property_ui_text(prop, "Color", "Color to display the marker with");
175 }
176
177 static void rna_def_text(BlenderRNA *brna)
178 {
179         StructRNA *srna;
180         PropertyRNA *prop;
181         
182         srna = RNA_def_struct(brna, "Text", "ID");
183         RNA_def_struct_ui_text(srna, "Text", "Text datablock referencing an external or packed text file");
184         RNA_def_struct_ui_icon(srna, ICON_TEXT);
185         RNA_def_struct_clear_flag(srna, STRUCT_ID_REFCOUNT);
186         
187         prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_NONE);
188         RNA_def_property_string_funcs(prop, "rna_Text_filename_get", "rna_Text_filename_length", "rna_Text_filename_set");
189         RNA_def_property_ui_text(prop, "File Path", "Filename of the text file");
190
191         prop= RNA_def_property(srna, "is_dirty", PROP_BOOLEAN, PROP_NONE);
192         RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_ISDIRTY);
193         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
194         RNA_def_property_ui_text(prop, "Dirty", "Text file has been edited since last save");
195
196         prop= RNA_def_property(srna, "is_modified", PROP_BOOLEAN, PROP_NONE);
197         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
198         RNA_def_property_boolean_funcs(prop, "rna_Text_modified_get", NULL);
199         RNA_def_property_ui_text(prop, "Modified", "Text file on disk is different than the one in memory");
200
201         prop= RNA_def_property(srna, "is_in_memory", PROP_BOOLEAN, PROP_NONE);
202         RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_ISMEM);
203         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
204         RNA_def_property_ui_text(prop, "Memory", "Text file is in memory, without a corresponding file on disk");
205         
206         prop= RNA_def_property(srna, "use_module", PROP_BOOLEAN, PROP_NONE);
207         RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_ISSCRIPT);
208         RNA_def_property_ui_text(prop, "Register", "Register this text as a module on loading, Text name must end with \".py\"");
209
210         prop= RNA_def_property(srna, "use_tabs_as_spaces", PROP_BOOLEAN, PROP_NONE);
211         RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_TABSTOSPACES);
212         RNA_def_property_ui_text(prop, "Tabs as Spaces", "Automatically converts all new tabs into spaces");
213
214         prop= RNA_def_property(srna, "lines", PROP_COLLECTION, PROP_NONE);
215         RNA_def_property_struct_type(prop, "TextLine");
216         RNA_def_property_ui_text(prop, "Lines", "Lines of text");
217         
218         prop= RNA_def_property(srna, "current_line", PROP_POINTER, PROP_NONE);
219         RNA_def_property_flag(prop, PROP_NEVER_NULL);
220         RNA_def_property_pointer_sdna(prop, NULL, "curl");
221         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
222         RNA_def_property_struct_type(prop, "TextLine");
223         RNA_def_property_ui_text(prop, "Current Line", "Current line, and start line of selection if one exists");
224
225         prop= RNA_def_property(srna, "current_character", PROP_INT, PROP_UNSIGNED);
226         RNA_def_property_int_sdna(prop, NULL, "curc");
227         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
228         RNA_def_property_ui_text(prop, "Current Character", "Index of current character in current line, and also start index of character in selection if one exists");
229         
230         prop= RNA_def_property(srna, "select_end_line", PROP_POINTER, PROP_NONE);
231         RNA_def_property_flag(prop, PROP_NEVER_NULL);
232         RNA_def_property_pointer_sdna(prop, NULL, "sell");
233         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
234         RNA_def_property_struct_type(prop, "TextLine");
235         RNA_def_property_ui_text(prop, "Selection End Line", "End line of selection");
236         
237         prop= RNA_def_property(srna, "select_end_character", PROP_INT, PROP_UNSIGNED);
238         RNA_def_property_int_sdna(prop, NULL, "selc");
239         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
240         RNA_def_property_ui_text(prop, "Selection End Character", "Index of character after end of selection in the selection end line");
241         
242         prop= RNA_def_property(srna, "markers", PROP_COLLECTION, PROP_NONE);
243         RNA_def_property_struct_type(prop, "TextMarker");
244         RNA_def_property_ui_text(prop, "Markers", "Text markers highlighting part of the text");
245
246         RNA_api_text(srna);
247 }
248
249 void RNA_def_text(BlenderRNA *brna)
250 {
251         rna_def_text_line(brna);
252         rna_def_text_marker(brna);
253         rna_def_text(brna);
254 }
255
256 #endif