svn merge -r 20133:20486 https://svn.blender.org/svnroot/bf-blender/branches/blender2...
[blender.git] / source / blender / editors / space_text / text_header.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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2008 Blender Foundation.
21  * All rights reserved.
22  *
23  * 
24  * Contributor(s): Blender Foundation
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #include <stdlib.h>
30 #include <string.h>
31 #include <stdio.h>
32
33 /* file time checking */
34 #include <ctype.h>
35 #include <sys/types.h>
36 #include <sys/stat.h>
37
38 #ifndef _WIN32
39 #include <unistd.h>
40 #else
41 #include <io.h>
42 #include "BLI_winstuff.h"
43 #endif
44
45 #include "DNA_space_types.h"
46 #include "DNA_scene_types.h"
47 #include "DNA_screen_types.h"
48 #include "DNA_text_types.h"
49 #include "DNA_windowmanager_types.h"
50
51 #include "MEM_guardedalloc.h"
52
53 #include "BLI_blenlib.h"
54
55 #include "BKE_context.h"
56 #include "BKE_global.h"
57 #include "BKE_library.h"
58 #include "BKE_main.h"
59 #include "BKE_scene.h"
60 #include "BKE_screen.h"
61 #include "BKE_text.h"
62
63 #include "ED_screen.h"
64 #include "ED_types.h"
65 #include "ED_util.h"
66
67 #include "WM_api.h"
68 #include "WM_types.h"
69
70 #include "BIF_gl.h"
71 #include "BIF_glutil.h"
72
73 #include "UI_interface.h"
74 #include "UI_resources.h"
75 #include "UI_view2d.h"
76
77 #include "RNA_access.h"
78
79 #ifndef DISABLE_PYTHON
80 #include "BPY_extern.h"
81 // XXX #include "BPY_menus.h"
82 #endif
83
84 #include "text_intern.h"
85
86 #define HEADER_PATH_MAX 260
87
88 /* ************************ header area region *********************** */
89
90 #ifndef DISABLE_PYTHON
91 static void do_text_template_scriptsmenu(bContext *C, void *arg, int event)
92 {
93         // XXX BPY_menu_do_python(PYMENU_SCRIPTTEMPLATE, event);
94 }
95
96 static uiBlock *text_template_scriptsmenu(bContext *C, void *args_unused)
97 {
98         ARegion *ar= CTX_wm_region(C);
99         uiBlock *block;
100         // XXX BPyMenu *pym;
101         // int i= 0;
102         // short yco = 20, menuwidth = 120;
103         
104         block= uiBeginBlock(C, ar, "text_template_scriptsmenu", UI_EMBOSSP);
105         uiBlockSetButmFunc(block, do_text_template_scriptsmenu, NULL);
106         
107         /* note that we acount for the N previous entries with i+20: */
108         /* XXX for (pym = BPyMenuTable[PYMENU_SCRIPTTEMPLATE]; pym; pym = pym->next, i++) {
109                 
110                 uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, 
111                                                  NULL, 0.0, 0.0, 1, i, 
112                                                  pym->tooltip?pym->tooltip:pym->filename);
113         }*/
114         
115         uiBlockSetDirection(block, UI_RIGHT);
116         uiTextBoundsBlock(block, 60);
117
118         uiEndBlock(C, block);
119         uiDrawBlock(C, block);
120         
121         return block;
122 }
123
124 static void do_text_plugin_scriptsmenu(bContext *C, void *arg, int event)
125 {
126         // XXX BPY_menu_do_python(PYMENU_TEXTPLUGIN, event);
127 }
128
129 static uiBlock *text_plugin_scriptsmenu(bContext *C, void *args_unused)
130 {
131         ARegion *ar= CTX_wm_region(C);
132         uiBlock *block;
133         // XXX BPyMenu *pym;
134         // int i= 0;
135         // short yco = 20, menuwidth = 120;
136         
137         block= uiBeginBlock(C, ar, "text_plugin_scriptsmenu", UI_EMBOSSP);
138         uiBlockSetButmFunc(block, do_text_plugin_scriptsmenu, NULL);
139         
140         /* note that we acount for the N previous entries with i+20: */
141         /* XXX for (pym = BPyMenuTable[PYMENU_TEXTPLUGIN]; pym; pym = pym->next, i++) {
142                 
143                 uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, 
144                                                  NULL, 0.0, 0.0, 1, i, 
145                                                  pym->tooltip?pym->tooltip:pym->filename);
146         }*/
147         
148         uiBlockSetDirection(block, UI_RIGHT);
149         uiTextBoundsBlock(block, 60);
150
151         uiEndBlock(C, block);
152         uiDrawBlock(C, block);
153
154         return block;
155 }
156 #endif
157
158 static void text_editmenu_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
159 {
160         uiItemEnumO(layout, "Top of File", 0, "TEXT_OT_move", "type", FILE_TOP);
161         uiItemEnumO(layout, "Bottom of File", 0, "TEXT_OT_move", "type", FILE_BOTTOM);
162 }
163
164 static void text_editmenu_selectmenu(bContext *C, uiLayout *layout, void *arg_unused)
165 {
166         uiItemO(layout, NULL, 0, "TEXT_OT_select_all");
167         uiItemO(layout, NULL, 0, "TEXT_OT_select_line");
168 }
169
170 static void text_editmenu_markermenu(bContext *C, uiLayout *layout, void *arg_unused)
171 {
172         uiItemO(layout, NULL, 0, "TEXT_OT_markers_clear");
173         uiItemO(layout, NULL, 0, "TEXT_OT_next_marker");
174         uiItemO(layout, NULL, 0, "TEXT_OT_previous_marker");
175 }
176
177 static void text_formatmenu(const bContext *C, Menu *menu)
178 {
179         uiLayout *layout= menu->layout;
180
181         uiItemO(layout, NULL, 0, "TEXT_OT_indent");
182         uiItemO(layout, NULL, 0, "TEXT_OT_unindent");
183
184         uiItemS(layout);
185
186         uiItemO(layout, NULL, 0, "TEXT_OT_comment");
187         uiItemO(layout, NULL, 0, "TEXT_OT_uncomment");
188
189         uiItemS(layout);
190
191         uiItemMenuEnumO(layout, NULL, 0, "TEXT_OT_convert_whitespace", "type");
192 }
193
194 static void text_editmenu_to3dmenu(bContext *C, uiLayout *layout, void *arg_unused)
195 {
196         uiItemBooleanO(layout, "One Object", 0, "TEXT_OT_to_3d_object", "split_lines", 0);
197         uiItemBooleanO(layout, "One Object Per Line", 0, "TEXT_OT_to_3d_object", "split_lines", 1);
198 }
199
200 static int text_menu_edit_poll(bContext *C)
201 {
202         return (CTX_data_edit_text(C) != NULL);
203 }
204
205 static void text_editmenu(const bContext *C, Menu *menu)
206 {
207         uiLayout *layout= menu->layout;
208
209         uiItemO(layout, NULL, 0, "ED_OT_undo");
210         uiItemO(layout, NULL, 0, "ED_OT_redo");
211
212         uiItemS(layout);
213
214         uiItemO(layout, NULL, 0, "TEXT_OT_cut");
215         uiItemO(layout, NULL, 0, "TEXT_OT_copy");
216         uiItemO(layout, NULL, 0, "TEXT_OT_paste");
217
218         uiItemS(layout);
219
220         uiItemMenuF(layout, "View", 0, text_editmenu_viewmenu);
221         uiItemMenuF(layout, "Select", 0, text_editmenu_selectmenu);
222         uiItemMenuF(layout, "Markers", 0, text_editmenu_markermenu);
223
224         uiItemS(layout);
225
226         uiItemO(layout, NULL, 0, "TEXT_OT_jump");
227         uiItemO(layout, NULL, 0, "TEXT_OT_properties");
228
229         uiItemS(layout);
230
231         uiItemMenuF(layout, "Text to 3D Object", 0, text_editmenu_to3dmenu);
232 }
233
234 /********************** header buttons ***********************/
235
236 void text_header_register(ARegionType *art)
237 {
238         MenuType *mt;
239
240         mt= MEM_callocN(sizeof(MenuType), "spacetype text menu edit");
241         strcpy(mt->idname, "TEXT_MT_edit");
242         strcpy(mt->label, "Edit");
243         mt->draw= text_editmenu;
244         BLI_addhead(&art->menutypes, mt);
245
246         mt= MEM_callocN(sizeof(MenuType), "spacetype text menu format");
247         strcpy(mt->idname, "TEXT_MT_format");
248         strcpy(mt->label, "Format");
249         mt->draw= text_formatmenu;
250         BLI_addhead(&art->menutypes, mt);
251 }
252
253 /************************** properties ******************************/
254
255 ARegion *text_has_properties_region(ScrArea *sa)
256 {
257         ARegion *ar, *arnew;
258         
259         for(ar= sa->regionbase.first; ar; ar= ar->next)
260                 if(ar->regiontype==RGN_TYPE_UI)
261                         return ar;
262         
263         /* add subdiv level; after header */
264         for(ar= sa->regionbase.first; ar; ar= ar->next)
265                 if(ar->regiontype==RGN_TYPE_HEADER)
266                         break;
267         
268         /* is error! */
269         if(ar==NULL) return NULL;
270         
271         arnew= MEM_callocN(sizeof(ARegion), "properties region");
272         
273         BLI_insertlinkafter(&sa->regionbase, ar, arnew);
274         arnew->regiontype= RGN_TYPE_UI;
275         arnew->alignment= RGN_ALIGN_LEFT;
276         
277         arnew->flag = RGN_FLAG_HIDDEN;
278         
279         return arnew;
280 }
281
282 static int properties_poll(bContext *C)
283 {
284         SpaceText *st= CTX_wm_space_text(C);
285         Text *text= CTX_data_edit_text(C);
286
287         return (st && text);
288 }
289
290 static int properties_exec(bContext *C, wmOperator *op)
291 {
292         ScrArea *sa= CTX_wm_area(C);
293         ARegion *ar= text_has_properties_region(sa);
294         
295         if(ar) {
296                 ar->flag ^= RGN_FLAG_HIDDEN;
297                 ar->v2d.flag &= ~V2D_IS_INITIALISED; /* XXX should become hide/unhide api? */
298                 
299                 ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
300                 ED_area_tag_redraw(sa);
301         }
302
303         return OPERATOR_FINISHED;
304 }
305
306 void TEXT_OT_properties(wmOperatorType *ot)
307 {
308         /* identifiers */
309         ot->name= "Properties";
310         ot->idname= "TEXT_OT_properties";
311         
312         /* api callbacks */
313         ot->exec= properties_exec;
314         ot->poll= properties_poll;
315 }
316
317 /******************** XXX popup menus *******************/
318
319 #if 0
320 {
321         // RMB
322
323         uiPopupMenu *pup;
324
325         if(text) {
326                 pup= uiPupMenuBegin(C, "Text", 0);
327                 if(txt_has_sel(text)) {
328                         uiItemO(layout, NULL, 0, "TEXT_OT_cut");
329                         uiItemO(layout, NULL, 0, "TEXT_OT_copy");
330                 }
331                 uiItemO(layout, NULL, 0, "TEXT_OT_paste");
332                 uiItemO(layout, NULL, 0, "TEXT_OT_new");
333                 uiItemO(layout, NULL, 0, "TEXT_OT_open");
334                 uiItemO(layout, NULL, 0, "TEXT_OT_save");
335                 uiItemO(layout, NULL, 0, "TEXT_OT_save_as");
336                 uiItemO(layout, NULL, 0, "TEXT_OT_run_script");
337                 uiPupMenuEnd(C, pup);
338         }
339         else {
340                 pup= uiPupMenuBegin(C, "File", 0);
341                 uiItemO(layout, NULL, 0, "TEXT_OT_new");
342                 uiItemO(layout, NULL, 0, "TEXT_OT_open");
343                 uiPupMenuEnd(C, pup);
344         }
345 }
346
347 {
348         // Alt+Shift+E
349
350         uiPopupMenu *pup;
351
352         pup= uiPupMenuBegin(C, "Edit", 0);
353         uiItemO(layout, NULL, 0, "TEXT_OT_cut");
354         uiItemO(layout, NULL, 0, "TEXT_OT_copy");
355         uiItemO(layout, NULL, 0, "TEXT_OT_paste");
356         uiPupMenuEnd(C, pup);
357 }
358
359 {
360         // Alt+Shift+F
361
362         uiPopupMenu *pup;
363
364         if(text) {
365                 pup= uiPupMenuBegin(C, "Text", 0);
366                 uiItemO(layout, NULL, 0, "TEXT_OT_new");
367                 uiItemO(layout, NULL, 0, "TEXT_OT_open");
368                 uiItemO(layout, NULL, 0, "TEXT_OT_save");
369                 uiItemO(layout, NULL, 0, "TEXT_OT_save_as");
370                 uiItemO(layout, NULL, 0, "TEXT_OT_run_script");
371                 uiPupMenuEnd(C, pup);
372         }
373         else {
374                 pup= uiPupMenuBegin(C, "File", 0);
375                 uiItemO(layout, NULL, 0, "TEXT_OT_new");
376                 uiItemO(layout, NULL, 0, "TEXT_OT_open");
377                 uiPupMenuEnd(C, pup);
378         }
379 }
380
381 {
382         // Alt+Shift+V
383
384         uiPopupMenu *pup;
385
386         pup= uiPupMenuBegin(C, "Text", 0);
387         uiItemEnumO(layout, "Top of File", 0, "TEXT_OT_move", "type", FILE_TOP);
388         uiItemEnumO(layout, "Bottom of File", 0, "TEXT_OT_move", "type", FILE_BOTTOM);
389         uiItemEnumO(layout, "Page Up", 0, "TEXT_OT_move", "type", PREV_PAGE);
390         uiItemEnumO(layout,  "Page Down", 0, "TEXT_OT_move", "type", NEXT_PAGE);
391         uiPupMenuEnd(C, pup);
392 }
393 #endif
394