4 * ***** BEGIN GPL LICENSE BLOCK *****
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.
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.
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.
20 * The Original Code is Copyright (C) 2008 Blender Foundation.
21 * All rights reserved.
24 * Contributor(s): Blender Foundation
26 * ***** END GPL LICENSE BLOCK *****
33 /* file time checking */
35 #include <sys/types.h>
42 #include "BLI_winstuff.h"
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"
51 #include "MEM_guardedalloc.h"
53 #include "BLI_blenlib.h"
55 #include "BKE_context.h"
56 #include "BKE_global.h"
57 #include "BKE_library.h"
59 #include "BKE_scene.h"
60 #include "BKE_screen.h"
63 #include "ED_screen.h"
71 #include "BIF_glutil.h"
73 #include "UI_interface.h"
74 #include "UI_resources.h"
75 #include "UI_view2d.h"
77 #include "RNA_access.h"
79 #ifndef DISABLE_PYTHON
80 #include "BPY_extern.h"
81 // XXX #include "BPY_menus.h"
84 #include "text_intern.h"
86 #define HEADER_PATH_MAX 260
88 /* ************************ header area region *********************** */
90 #ifndef DISABLE_PYTHON
91 static void do_text_template_scriptsmenu(bContext *C, void *arg, int event)
93 // XXX BPY_menu_do_python(PYMENU_SCRIPTTEMPLATE, event);
96 static uiBlock *text_template_scriptsmenu(bContext *C, void *args_unused)
98 ARegion *ar= CTX_wm_region(C);
102 // short yco = 20, menuwidth = 120;
104 block= uiBeginBlock(C, ar, "text_template_scriptsmenu", UI_EMBOSSP);
105 uiBlockSetButmFunc(block, do_text_template_scriptsmenu, NULL);
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++) {
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);
115 uiBlockSetDirection(block, UI_RIGHT);
116 uiTextBoundsBlock(block, 60);
118 uiEndBlock(C, block);
119 uiDrawBlock(C, block);
124 static void do_text_plugin_scriptsmenu(bContext *C, void *arg, int event)
126 // XXX BPY_menu_do_python(PYMENU_TEXTPLUGIN, event);
129 static uiBlock *text_plugin_scriptsmenu(bContext *C, void *args_unused)
131 ARegion *ar= CTX_wm_region(C);
135 // short yco = 20, menuwidth = 120;
137 block= uiBeginBlock(C, ar, "text_plugin_scriptsmenu", UI_EMBOSSP);
138 uiBlockSetButmFunc(block, do_text_plugin_scriptsmenu, NULL);
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++) {
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);
148 uiBlockSetDirection(block, UI_RIGHT);
149 uiTextBoundsBlock(block, 60);
151 uiEndBlock(C, block);
152 uiDrawBlock(C, block);
158 static void text_editmenu_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
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);
164 static void text_editmenu_selectmenu(bContext *C, uiLayout *layout, void *arg_unused)
166 uiItemO(layout, NULL, 0, "TEXT_OT_select_all");
167 uiItemO(layout, NULL, 0, "TEXT_OT_select_line");
170 static void text_editmenu_markermenu(bContext *C, uiLayout *layout, void *arg_unused)
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");
177 static void text_formatmenu(const bContext *C, Menu *menu)
179 uiLayout *layout= menu->layout;
181 uiItemO(layout, NULL, 0, "TEXT_OT_indent");
182 uiItemO(layout, NULL, 0, "TEXT_OT_unindent");
186 uiItemO(layout, NULL, 0, "TEXT_OT_comment");
187 uiItemO(layout, NULL, 0, "TEXT_OT_uncomment");
191 uiItemMenuEnumO(layout, NULL, 0, "TEXT_OT_convert_whitespace", "type");
194 static void text_editmenu_to3dmenu(bContext *C, uiLayout *layout, void *arg_unused)
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);
200 static int text_menu_edit_poll(bContext *C)
202 return (CTX_data_edit_text(C) != NULL);
205 static void text_editmenu(const bContext *C, Menu *menu)
207 uiLayout *layout= menu->layout;
209 uiItemO(layout, NULL, 0, "ED_OT_undo");
210 uiItemO(layout, NULL, 0, "ED_OT_redo");
214 uiItemO(layout, NULL, 0, "TEXT_OT_cut");
215 uiItemO(layout, NULL, 0, "TEXT_OT_copy");
216 uiItemO(layout, NULL, 0, "TEXT_OT_paste");
220 uiItemMenuF(layout, "View", 0, text_editmenu_viewmenu);
221 uiItemMenuF(layout, "Select", 0, text_editmenu_selectmenu);
222 uiItemMenuF(layout, "Markers", 0, text_editmenu_markermenu);
226 uiItemO(layout, NULL, 0, "TEXT_OT_jump");
227 uiItemO(layout, NULL, 0, "TEXT_OT_properties");
231 uiItemMenuF(layout, "Text to 3D Object", 0, text_editmenu_to3dmenu);
234 /********************** header buttons ***********************/
236 void text_header_register(ARegionType *art)
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);
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);
253 /************************** properties ******************************/
255 ARegion *text_has_properties_region(ScrArea *sa)
259 for(ar= sa->regionbase.first; ar; ar= ar->next)
260 if(ar->regiontype==RGN_TYPE_UI)
263 /* add subdiv level; after header */
264 for(ar= sa->regionbase.first; ar; ar= ar->next)
265 if(ar->regiontype==RGN_TYPE_HEADER)
269 if(ar==NULL) return NULL;
271 arnew= MEM_callocN(sizeof(ARegion), "properties region");
273 BLI_insertlinkafter(&sa->regionbase, ar, arnew);
274 arnew->regiontype= RGN_TYPE_UI;
275 arnew->alignment= RGN_ALIGN_LEFT;
277 arnew->flag = RGN_FLAG_HIDDEN;
282 static int properties_poll(bContext *C)
284 SpaceText *st= CTX_wm_space_text(C);
285 Text *text= CTX_data_edit_text(C);
290 static int properties_exec(bContext *C, wmOperator *op)
292 ScrArea *sa= CTX_wm_area(C);
293 ARegion *ar= text_has_properties_region(sa);
296 ar->flag ^= RGN_FLAG_HIDDEN;
297 ar->v2d.flag &= ~V2D_IS_INITIALISED; /* XXX should become hide/unhide api? */
299 ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
300 ED_area_tag_redraw(sa);
303 return OPERATOR_FINISHED;
306 void TEXT_OT_properties(wmOperatorType *ot)
309 ot->name= "Properties";
310 ot->idname= "TEXT_OT_properties";
313 ot->exec= properties_exec;
314 ot->poll= properties_poll;
317 /******************** XXX popup menus *******************/
326 pup= uiPupMenuBegin("Text", 0);
327 if(txt_has_sel(text)) {
328 uiItemO(layout, NULL, 0, "TEXT_OT_cut");
329 uiItemO(layout, NULL, 0, "TEXT_OT_copy");
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);
340 pup= uiPupMenuBegin("File", 0);
341 uiItemO(layout, NULL, 0, "TEXT_OT_new");
342 uiItemO(layout, NULL, 0, "TEXT_OT_open");
343 uiPupMenuEnd(C, pup);
352 pup= uiPupMenuBegin("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);
365 pup= uiPupMenuBegin("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);
374 pup= uiPupMenuBegin("File", 0);
375 uiItemO(layout, NULL, 0, "TEXT_OT_new");
376 uiItemO(layout, NULL, 0, "TEXT_OT_open");
377 uiPupMenuEnd(C, pup);
386 pup= uiPupMenuBegin("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);