Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/space_text/text_header.c')
-rw-r--r--source/blender/editors/space_text/text_header.c582
1 files changed, 555 insertions, 27 deletions
diff --git a/source/blender/editors/space_text/text_header.c b/source/blender/editors/space_text/text_header.c
index b8898e40f01..ea0005fd716 100644
--- a/source/blender/editors/space_text/text_header.c
+++ b/source/blender/editors/space_text/text_header.c
@@ -26,12 +26,26 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stdlib.h>
#include <string.h>
#include <stdio.h>
+/* file time checking */
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifndef _WIN32
+#include <unistd.h>
+#else
+#include <io.h>
+#include "BLI_winstuff.h"
+#endif
+
#include "DNA_space_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
+#include "DNA_text_types.h"
#include "DNA_windowmanager_types.h"
#include "MEM_guardedalloc.h"
@@ -39,7 +53,11 @@
#include "BLI_blenlib.h"
#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_screen.h"
+#include "BKE_text.h"
#include "ED_screen.h"
#include "ED_types.h"
@@ -53,81 +71,591 @@
#include "UI_interface.h"
#include "UI_resources.h"
+#include "UI_text.h"
#include "UI_view2d.h"
+#include "RNA_access.h"
+
+#ifndef DISABLE_PYTHON
+#include "BPY_extern.h"
+// XXX #include "BPY_menus.h"
+#endif
+
#include "text_intern.h"
+#define HEADER_PATH_MAX 260
/* ************************ header area region *********************** */
-static void do_viewmenu(bContext *C, void *arg, int event)
+#ifndef DISABLE_PYTHON
+static void do_text_template_scriptsmenu(bContext *C, void *arg, int event)
{
-
+ // XXX BPY_menu_do_python(PYMENU_SCRIPTTEMPLATE, event);
}
-static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
+uiBlock *text_template_scriptsmenu(bContext *C, void *args_unused)
{
- ScrArea *curarea= CTX_wm_area(C);
+ ARegion *ar= CTX_wm_region(C);
uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "dummy_viewmenu", UI_EMBOSSP, UI_HELV);
- uiBlockSetButmFunc(block, do_viewmenu, NULL);
+ // XXX BPyMenu *pym;
+ // int i= 0;
+ // short yco = 20, menuwidth = 120;
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Nothing yet", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+ block= uiBeginBlock(C, ar, "text_template_scriptsmenu", UI_EMBOSSP, UI_HELV);
+ uiBlockSetButmFunc(block, do_text_template_scriptsmenu, NULL);
- if(curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
+ /* note that we acount for the N previous entries with i+20: */
+ /* XXX for (pym = BPyMenuTable[PYMENU_SCRIPTTEMPLATE]; pym; pym = pym->next, i++) {
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19,
+ NULL, 0.0, 0.0, 1, i,
+ pym->tooltip?pym->tooltip:pym->filename);
+ }*/
- uiTextBoundsBlock(block, 50);
+ uiBlockSetDirection(block, UI_RIGHT);
+ uiTextBoundsBlock(block, 60);
+
uiEndBlock(C, block);
+ uiDrawBlock(C, block);
+
+ return block;
+}
+
+static void do_text_plugin_scriptsmenu(bContext *C, void *arg, int event)
+{
+ // XXX BPY_menu_do_python(PYMENU_TEXTPLUGIN, event);
+}
+
+uiBlock *text_plugin_scriptsmenu(bContext *C, void *args_unused)
+{
+ ARegion *ar= CTX_wm_region(C);
+ uiBlock *block;
+ // XXX BPyMenu *pym;
+ // int i= 0;
+ // short yco = 20, menuwidth = 120;
+
+ block= uiBeginBlock(C, ar, "text_plugin_scriptsmenu", UI_EMBOSSP, UI_HELV);
+ uiBlockSetButmFunc(block, do_text_plugin_scriptsmenu, NULL);
+ /* note that we acount for the N previous entries with i+20: */
+ /* XXX for (pym = BPyMenuTable[PYMENU_TEXTPLUGIN]; pym; pym = pym->next, i++) {
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19,
+ NULL, 0.0, 0.0, 1, i,
+ pym->tooltip?pym->tooltip:pym->filename);
+ }*/
+
+ uiBlockSetDirection(block, UI_RIGHT);
+ uiTextBoundsBlock(block, 60);
+
+ uiEndBlock(C, block);
+ uiDrawBlock(C, block);
+
return block;
}
+#endif
+
+static void text_editmenu_viewmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+{
+ uiMenuItemEnumO(head, "Top of File", 0, "TEXT_OT_move", "type", FILE_TOP);
+ uiMenuItemEnumO(head, "Bottom of File", 0, "TEXT_OT_move", "type", FILE_BOTTOM);
+}
+
+static void text_editmenu_selectmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+{
+ uiMenuItemO(head, 0, "TEXT_OT_select_all");
+ uiMenuItemO(head, 0, "TEXT_OT_select_line");
+}
+
+static void text_editmenu_markermenu(bContext *C, uiMenuItem *head, void *arg_unused)
+{
+ uiMenuItemO(head, 0, "TEXT_OT_clear_all_markers");
+ uiMenuItemO(head, 0, "TEXT_OT_next_marker");
+ uiMenuItemO(head, 0, "TEXT_OT_previous_marker");
+}
+
+static void text_formatmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+{
+ uiMenuItemO(head, 0, "TEXT_OT_indent");
+ uiMenuItemO(head, 0, "TEXT_OT_unindent");
+
+ uiMenuSeparator(head);
+
+ uiMenuItemO(head, 0, "TEXT_OT_comment");
+ uiMenuItemO(head, 0, "TEXT_OT_uncomment");
+
+ uiMenuSeparator(head);
+
+ uiMenuLevelEnumO(head, "TEXT_OT_convert_whitespace", "type");
+}
-static void do_text_buttons(bContext *C, void *arg, int event)
+static void text_editmenu_to3dmenu(bContext *C, uiMenuItem *head, void *arg_unused)
{
+ uiMenuItemBooleanO(head, "One Object", 0, "TEXT_OT_to_3d_object", "split_lines", 0);
+ uiMenuItemBooleanO(head, "One Object Per Line", 0, "TEXT_OT_to_3d_object", "split_lines", 1);
+}
+
+static void text_editmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+{
+ uiMenuItemO(head, 0, "ED_OT_undo");
+ uiMenuItemO(head, 0, "ED_OT_redo");
+
+ uiMenuSeparator(head);
+
+ uiMenuItemO(head, 0, "TEXT_OT_cut");
+ uiMenuItemO(head, 0, "TEXT_OT_copy");
+ uiMenuItemO(head, 0, "TEXT_OT_paste");
+
+ uiMenuSeparator(head);
+
+ uiMenuLevel(head, "View", text_editmenu_viewmenu);
+ uiMenuLevel(head, "Select", text_editmenu_selectmenu);
+ uiMenuLevel(head, "Markers", text_editmenu_markermenu);
+
+ uiMenuSeparator(head);
+
+ uiMenuItemO(head, 0, "TEXT_OT_jump");
+ uiMenuItemO(head, 0, "TEXT_OT_find_and_replace");
+
+ uiMenuSeparator(head);
+
+ uiMenuLevel(head, "Text to 3D Object", text_editmenu_to3dmenu);
+}
+
+static void text_filemenu(bContext *C, uiMenuItem *head, void *arg_unused)
+{
+ SpaceText *st= (SpaceText*)CTX_wm_space_data(C);
+ Text *text= st->text;
+
+ uiMenuItemO(head, 0, "TEXT_OT_new");
+ uiMenuItemO(head, 0, "TEXT_OT_open");
+
+ if(text) {
+ uiMenuItemO(head, 0, "TEXT_OT_reload");
+
+ uiMenuSeparator(head);
+
+ uiMenuItemO(head, 0, "TEXT_OT_save");
+ uiMenuItemO(head, 0, "TEXT_OT_save_as");
+
+ if(text->name)
+ uiMenuItemO(head, 0, "TEXT_OT_make_internal");
+
+ uiMenuSeparator(head);
+
+ uiMenuItemO(head, 0, "TEXT_OT_run_script");
+
+#ifndef DISABLE_PYTHON
+ if(BPY_is_pyconstraint(text))
+ uiMenuItemO(head, 0, "TEXT_OT_refresh_pyconstraints");
+#endif
+ }
+
+#ifndef DISABLE_PYTHON
+ // XXX uiMenuSeparator(head);
+
+ // XXX uiDefIconTextBlockBut(block, text_template_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Script Templates", 0, yco-=20, 120, 19, "");
+ // XXX uiDefIconTextBlockBut(block, text_plugin_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Text Plugins", 0, yco-=20, 120, 19, "");
+#endif
+}
+
+/*********************** datablock browse *************************/
+
+static void text_unlink(Main *bmain, Text *text)
+{
+ bScreen *scr;
+ ScrArea *area;
+ SpaceLink *sl;
+
+ /* XXX this ifdef is in fact dangerous, if python is
+ * disabled it will leave invalid pointers in files! */
+
+#ifndef DISABLE_PYTHON
+ // XXX BPY_clear_bad_scriptlinks(text);
+ // XXX BPY_free_pyconstraint_links(text);
+ // XXX free_text_controllers(text);
+
+ /* check if this text was used as script link:
+ * this check function unsets the pointers and returns how many
+ * script links used this Text */
+ if(0) // XXX BPY_text_check_all_scriptlinks (text))
+ ; // XXX notifier: allqueue(REDRAWBUTSSCRIPT, 0);
+
+ /* equivalently for pynodes: */
+ if(0) // XXX nodeDynamicUnlinkText ((ID*)text))
+ ; // XXX notifier: allqueue(REDRAWNODE, 0);
+#endif
+
+ for(scr= bmain->screen.first; scr; scr= scr->id.next) {
+ for(area= scr->areabase.first; area; area= area->next) {
+ for(sl= area->spacedata.first; sl; sl= sl->next) {
+ if(sl->spacetype==SPACE_TEXT) {
+ SpaceText *st= (SpaceText*) sl;
+
+ if(st->text==text) {
+ st->text= NULL;
+ st->top= 0;
+
+ if(st==area->spacedata.first)
+ ED_area_tag_redraw(area);
+ }
+ }
+ }
+ }
+ }
+
+ free_libblock(&bmain->text, text);
+}
+
+static void text_idpoin_handle(bContext *C, ID *id, int event)
+{
+ SpaceText *st= (SpaceText*)CTX_wm_space_data(C);
+ Text *text;
+
switch(event) {
+ case UI_ID_BROWSE:
+ st->text= (Text*)id;
+ st->top= 0;
+
+ text_update_edited(st->text);
+ WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text);
+
+ ED_undo_push(C, "Browse Text");
+ break;
+ case UI_ID_DELETE:
+ text= st->text;
+
+ /* make the previous text active, if its not there make the next text active */
+ if(text->id.prev) {
+ st->text = text->id.prev;
+ WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text);
+ }
+ else if(text->id.next) {
+ st->text = text->id.next;
+ WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text);
+ }
+
+ text_unlink(CTX_data_main(C), text);
+ WM_event_add_notifier(C, NC_TEXT|NA_REMOVED, text);
+
+ ED_undo_push(C, "Delete Text");
+ break;
+ case UI_ID_RENAME:
+ break;
+ case UI_ID_ADD_NEW:
+ WM_operator_name_call(C, "TEXT_OT_new", WM_OP_INVOKE_REGION_WIN, NULL);
+ break;
+ case UI_ID_OPEN:
+ WM_operator_name_call(C, "TEXT_OT_open", WM_OP_INVOKE_REGION_WIN, NULL);
+ break;
}
}
+/********************** header buttons ***********************/
void text_header_buttons(const bContext *C, ARegion *ar)
{
+ bScreen *sc= CTX_wm_screen(C);
+ SpaceText *st= (SpaceText*)CTX_wm_space_data(C);
+ PointerRNA spaceptr;
+ Text *text= st->text;
ScrArea *sa= CTX_wm_area(C);
uiBlock *block;
- int xco, yco= 3;
+ int xco, yco= 3, xmax, oldcol;
+ RNA_pointer_create(&sc->id, &RNA_SpaceTextEditor, st, &spaceptr);
+
block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS, UI_HELV);
- uiBlockSetHandleFunc(block, do_text_buttons, NULL);
xco= ED_area_header_standardbuttons(C, block, yco);
if((sa->flag & HEADER_NO_PULLDOWN)==0) {
- int xmax;
-
/* pull down menus */
uiBlockSetEmboss(block, UI_EMBOSSP);
- xmax= GetButStringLength("View");
- uiDefPulldownBut(block, dummy_viewmenu, CTX_wm_area(C),
- "View", xco, yco-2, xmax-3, 24, "");
- xco+=XIC+xmax;
+ xmax= GetButStringLength("Text");
+ uiDefMenuBut(block, text_filemenu, NULL, "Text", xco, yco-2, xmax-3, 24, "");
+ xco+=xmax;
+
+ if(text) {
+ xmax= GetButStringLength("Edit");
+ uiDefMenuBut(block, text_editmenu, NULL, "Edit", xco, yco-2, xmax-3, 24, "");
+ xco+=xmax;
+
+ xmax= GetButStringLength("Format");
+ uiDefMenuBut(block, text_formatmenu, NULL, "Format", xco, yco-2, xmax-3, 24, "");
+ xco+=xmax;
+ }
}
uiBlockSetEmboss(block, UI_EMBOSS);
+ uiBlockBeginAlign(block);
+ uiDefIconButR(block, ICONTOG, 0, ICON_LINENUMBERS_OFF, xco, yco,XIC,YIC, &spaceptr, "line_numbers", 0, 0, 0, 0, 0, NULL);
+ uiDefIconButR(block, ICONTOG, 0, ICON_WORDWRAP_OFF, xco+=XIC, yco,XIC,YIC, &spaceptr, "word_wrap", 0, 0, 0, 0, 0, NULL);
+ uiDefIconButR(block, ICONTOG, 0, ICON_SYNTAX_OFF, xco+=XIC, yco,XIC,YIC, &spaceptr, "syntax_highlight", 0, 0, 0, 0, 0, NULL);
+ // uiDefIconButR(block, ICONTOG, 0, ICON_SCRIPTPLUGINS, xco+=XIC, yco,XIC,YIC, &spaceptr, "do_python_plugins", 0, 0, 0, 0, 0, "Enables Python text plugins");
+ uiBlockEndAlign(block);
+
+ /* warning button if text is out of date */
+ if(text && text_file_modified(text)) {
+ xco+= XIC;
+
+ oldcol= uiBlockGetCol(block);
+ uiBlockSetCol(block, TH_REDALERT);
+ uiDefIconButO(block, BUT, "TEXT_OT_resolve_conflict", WM_OP_INVOKE_DEFAULT, ICON_HELP, xco+=XIC,yco,XIC,YIC, "External text is out of sync, click for options to resolve the conflict");
+ uiBlockSetCol(block, oldcol);
+ }
+
+ /* browse text datablock */
+ xco+= 2*XIC;
+ xco= uiDefIDPoinButs(block, CTX_data_main(C), NULL, (ID*)st->text, ID_TXT, NULL, xco, yco,
+ text_idpoin_handle, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_OPEN|UI_ID_DELETE);
+ xco+=XIC;
+
+ /*
+ if(st->text) {
+ if(st->text->flags & TXT_ISDIRTY && (st->text->flags & TXT_ISEXT || !(st->text->flags & TXT_ISMEM)))
+ uiDefIconBut(block, BUT,0, ICON_ERROR, xco+=XIC,yco,XIC,YIC, 0, 0, 0, 0, 0, "The text has been changed");
+ if(st->text->flags & TXT_ISEXT)
+ uiDefBut(block, BUT,B_TEXTSTORE, ICON(), xco+=XIC,yco,XIC,YIC, 0, 0, 0, 0, 0, "Stores text in project file");
+ else
+ uiDefBut(block, BUT,B_TEXTSTORE, ICON(), xco+=XIC,yco,XIC,YIC, 0, 0, 0, 0, 0, "Disables storing of text in project file");
+ xco+=10;
+ }
+ */
+
+ /* display settings */
+ if(st->font_id>1) st->font_id= 0;
+ uiDefButR(block, MENU, 0, NULL, xco,yco,100,YIC, &spaceptr, "font_size", 0, 0, 0, 0, 0, NULL);
+ xco+=105;
+
+ uiDefButR(block, NUM, 0, "Tab:", xco,yco,XIC+50,YIC, &spaceptr, "tab_width", 0, 0, 0, 0, 0, NULL);
+ xco+= XIC+50;
+
+ /* file info */
+ if(text) {
+ char fname[HEADER_PATH_MAX], headtxt[HEADER_PATH_MAX+17];
+ int len;
+
+ if(text->name) {
+ len = strlen(text->name);
+ if(len > HEADER_PATH_MAX-1)
+ len = HEADER_PATH_MAX-1;
+ strncpy(fname, text->name, len);
+ fname[len]='\0';
+ if(text->flags & TXT_ISDIRTY)
+ sprintf(headtxt, "File: *%s (unsaved)", fname);
+ else
+ sprintf(headtxt, "File: %s", fname);
+ }
+ else
+ sprintf(headtxt, text->id.lib? "Text: External": "Text: Internal");
+
+ UI_ThemeColor(TH_MENU_TEXT);
+ UI_RasterPos(xco+=XIC, yco+6);
+
+ UI_DrawString(G.font, headtxt, 0);
+ xco += UI_GetStringWidth(G.font, headtxt, 0);
+ }
+
+ uiEndBlock(C, block);
+ uiDrawBlock(C, block);
+
/* always as last */
UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin);
+}
+
+/************************* find & replace ***************************/
+
+void text_find_buttons(const bContext *C, ARegion *ar)
+{
+ bScreen *sc= CTX_wm_screen(C);
+ SpaceText *st= CTX_wm_space_text(C);
+ PointerRNA spaceptr;
+ uiBlock *block;
+ int xco= 5, yco= 3;
+
+ RNA_pointer_create(&sc->id, &RNA_SpaceTextEditor, st, &spaceptr);
+
+ block= uiBeginBlock(C, ar, "find buttons", UI_EMBOSS, UI_HELV);
+
+ /* find */
+ uiBlockBeginAlign(block);
+ uiDefButR(block, TEX, 0, "Find: ", xco, yco,220,20, &spaceptr, "find_text", 0, 0, 0, 0, 0, NULL);
+ xco += 220;
+ uiDefIconButO(block, BUT, "TEXT_OT_find_set_selected", WM_OP_INVOKE_DEFAULT, ICON_TEXT, xco,yco,20,20, "Copy from selection");
+ xco += 20+XIC;
+ uiBlockEndAlign(block);
+
+ /* replace */
+ uiBlockBeginAlign(block);
+ uiDefButR(block, TEX, 0, "Replace: ", xco, yco,220,20, &spaceptr, "replace_text", 0, 0, 0, 0, 0, NULL);
+ xco += 220;
+ uiDefIconButO(block, BUT, "TEXT_OT_replace_set_selected", WM_OP_INVOKE_DEFAULT, ICON_TEXT, xco,yco,20,20, "Copy from selection");
+ xco += 20+XIC;
+ uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
+ uiDefButR(block, TOG, 0, "Wrap", xco, yco,60,20, &spaceptr, "find_wrap", 0, 0, 0, 0, 0, NULL);
+ xco += 60;
+ uiDefButR(block, TOG, 0, "All", xco, yco,60,20, &spaceptr, "find_all", 0, 0, 0, 0, 0, NULL);
+ xco += 50+XIC;
+ uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
+ uiDefButO(block, BUT, "TEXT_OT_find", WM_OP_INVOKE_REGION_WIN, "Find", xco,yco,50,20, "Find next.");
+ xco += 50;
+ uiDefButO(block, BUT, "TEXT_OT_replace", WM_OP_INVOKE_REGION_WIN, "Replace", xco,yco,70,20, "Replace then find next.");
+ xco += 70;
+ uiDefButO(block, BUT, "TEXT_OT_mark_all", WM_OP_INVOKE_REGION_WIN, "Mark All", xco,yco,80,20, "Mark each occurrence to edit all from one");
+ xco += 80;
+ uiBlockEndAlign(block);
uiEndBlock(C, block);
uiDrawBlock(C, block);
+
+ /* always as last */
+ UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin);
}
+ARegion *text_has_find_region(ScrArea *sa)
+{
+ ARegion *ar, *arnew;
+
+ for(ar= sa->regionbase.first; ar; ar= ar->next)
+ if(ar->regiontype==RGN_TYPE_UI)
+ return ar;
+
+ /* add subdiv level; after header */
+ for(ar= sa->regionbase.first; ar; ar= ar->next)
+ if(ar->regiontype==RGN_TYPE_HEADER)
+ break;
+
+ /* is error! */
+ if(ar==NULL) return NULL;
+
+ arnew= MEM_callocN(sizeof(ARegion), "find and replace region");
+
+ BLI_insertlinkafter(&sa->regionbase, ar, arnew);
+ arnew->regiontype= RGN_TYPE_UI;
+ arnew->alignment= RGN_ALIGN_BOTTOM;
+
+ arnew->flag = RGN_FLAG_HIDDEN;
+
+ return arnew;
+}
+
+static int find_and_replace_poll(bContext *C)
+{
+ SpaceText *st= CTX_wm_space_text(C);
+ Text *text= CTX_data_edit_text(C);
+
+ return (st && text);
+}
+
+static int find_and_replace_exec(bContext *C, wmOperator *op)
+{
+ ScrArea *sa= CTX_wm_area(C);
+ ARegion *ar= text_has_find_region(sa);
+
+ if(ar) {
+ ar->flag ^= RGN_FLAG_HIDDEN;
+ ar->v2d.flag &= ~V2D_IS_INITIALISED; /* XXX should become hide/unhide api? */
+
+ ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
+ ED_area_tag_redraw(sa);
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void TEXT_OT_find_and_replace(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Find and Replace";
+ ot->idname= "TEXT_OT_find_and_replace";
+
+ /* api callbacks */
+ ot->exec= find_and_replace_exec;
+ ot->poll= find_and_replace_poll;
+}
+
+/******************** XXX popup menus *******************/
+
+#if 0
+{
+ // RMB
+
+ uiMenuItem *head;
+
+ if(text) {
+ head= uiPupMenuBegin("Text", 0);
+ if(txt_has_sel(text)) {
+ uiMenuItemO(head, 0, "TEXT_OT_cut");
+ uiMenuItemO(head, 0, "TEXT_OT_copy");
+ }
+ uiMenuItemO(head, 0, "TEXT_OT_paste");
+ uiMenuItemO(head, 0, "TEXT_OT_new");
+ uiMenuItemO(head, 0, "TEXT_OT_open");
+ uiMenuItemO(head, 0, "TEXT_OT_save");
+ uiMenuItemO(head, 0, "TEXT_OT_save_as");
+ uiMenuItemO(head, 0, "TEXT_OT_run_script");
+ uiPupMenuEnd(C, head);
+ }
+ else {
+ head= uiPupMenuBegin("File", 0);
+ uiMenuItemO(head, 0, "TEXT_OT_new");
+ uiMenuItemO(head, 0, "TEXT_OT_open");
+ uiPupMenuEnd(C, head);
+ }
+}
+
+{
+ // Alt+Shift+E
+
+ uiMenuItem *head;
+
+ head= uiPupMenuBegin("Edit", 0);
+ uiMenuItemO(head, 0, "TEXT_OT_cut");
+ uiMenuItemO(head, 0, "TEXT_OT_copy");
+ uiMenuItemO(head, 0, "TEXT_OT_paste");
+ uiPupMenuEnd(C, head);
+}
+
+{
+ // Alt+Shift+F
+
+ uiMenuItem *head;
+
+ if(text) {
+ head= uiPupMenuBegin("Text", 0);
+ uiMenuItemO(head, 0, "TEXT_OT_new");
+ uiMenuItemO(head, 0, "TEXT_OT_open");
+ uiMenuItemO(head, 0, "TEXT_OT_save");
+ uiMenuItemO(head, 0, "TEXT_OT_save_as");
+ uiMenuItemO(head, 0, "TEXT_OT_run_script");
+ uiPupMenuEnd(C, head);
+ }
+ else {
+ head= uiPupMenuBegin("File", 0);
+ uiMenuItemO(head, 0, "TEXT_OT_new");
+ uiMenuItemO(head, 0, "TEXT_OT_open");
+ uiPupMenuEnd(C, head);
+ }
+}
+
+{
+ // Alt+Shift+V
+
+ uiMenuItem *head;
+
+ head= uiPupMenuBegin("Text", 0);
+ uiMenuItemEnumO(head, "Top of File", 0, "TEXT_OT_move", "type", FILE_TOP);
+ uiMenuItemEnumO(head, "Bottom of File", 0, "TEXT_OT_move", "type", FILE_BOTTOM);
+ uiMenuItemEnumO(head, "Page Up", 0, "TEXT_OT_move", "type", PREV_PAGE);
+ uiMenuItemEnumO(head, "Page Down", 0, "TEXT_OT_move", "type", NEXT_PAGE);
+ uiPupMenuEnd(C, head);
+}
+#endif