2076 lines
61 KiB
C
2076 lines
61 KiB
C
#ifndef lint
|
|
#ifdef sccs
|
|
static char sccsid[] = "@(#)textsw_menu.c 1.1 94/10/31";
|
|
#endif
|
|
#endif
|
|
|
|
/*
|
|
* Copyright (c) 1986 by Sun Microsystems, Inc.
|
|
*/
|
|
|
|
/*
|
|
* Text subwindow menu creation and support.
|
|
*/
|
|
|
|
#include <suntool/primal.h>
|
|
|
|
#include <suntool/textsw_impl.h>
|
|
#include <errno.h>
|
|
#include <pixrect/pr_util.h>
|
|
#include <pixrect/memvar.h>
|
|
#include <pixrect/pixfont.h>
|
|
#include <sunwindow/defaults.h>
|
|
#include <sunwindow/win_cursor.h>
|
|
#include <sunwindow/win_input.h>
|
|
#include <sunwindow/win_struct.h>
|
|
#include "sunwindow/sv_malloc.h"
|
|
#include <suntool/alert.h>
|
|
#include <suntool/frame.h>
|
|
#include <suntool/fullscreen.h>
|
|
#include <suntool/tool_struct.h>
|
|
#include <suntool/walkmenu.h>
|
|
#include <suntool/window.h>
|
|
|
|
#define HELP_INFO(s) HELP_DATA,s,
|
|
|
|
extern Ev_handle ev_resolve_xy_to_view();
|
|
extern Ev_handle ev_nearest_view();
|
|
extern Es_index ev_index_for_line();
|
|
|
|
static void stuff_clipboard();
|
|
static Seln_result read_proc();
|
|
static FILE *output;
|
|
|
|
static Menu_item show_clipboard();
|
|
|
|
static char *put_then_get = "Copy then Paste";
|
|
static char *put_then = "Copy then";
|
|
|
|
#define MAX_SIZE_MENU_STRING 30
|
|
|
|
static struct pixrect *textsw_get_only_pr;
|
|
|
|
static int textsw_menu_refcount; /* refcount for textsw_menu */
|
|
static Menu textsw_menu; /* Let default to NULL */
|
|
static Textsw_enum textsw_menu_style; /* default to organized */
|
|
static int textsw_menu_style_already_set; /* default = 0 */
|
|
static Menu_item *textsw_menu_items; /* [TEXTSW_MENU_LAST_CMD] */
|
|
pkg_private void textsw_alert_for_old_interface();
|
|
|
|
extern int textsw_has_been_modified();
|
|
extern void tool_expand_neighbors();
|
|
pkg_private void textsw_get_extend_to_edge();
|
|
pkg_private void textsw_set_extend_to_edge();
|
|
|
|
extern Textsw textsw_split_view();
|
|
pkg_private int await_neg_event();
|
|
extern Textsw_enum textsw_get_menu_style_internal();
|
|
extern void textsw_set_menu_style_internal();
|
|
pkg_private int textsw_menu_prompt();
|
|
extern void textsw_destroy_split();
|
|
extern Menu_item * textsw_new_menu_table();
|
|
extern Menu textsw_menu_init();
|
|
extern void textsw_do_menu();
|
|
extern Menu textsw_get_unique_menu();
|
|
extern Menu textsw_build_extras_menu();
|
|
extern Menu_item textsw_toggle_extras_item();
|
|
|
|
/* VARARGS0 */
|
|
static Menu
|
|
textsw_new_menu(folio)
|
|
Textsw_folio folio;
|
|
{
|
|
Menu edit_cmd, top_menu, save_file, break_mode, old_break_mode,
|
|
find_pattern,
|
|
file_cmds, display_cmds, find_cmds, fast_exits_cmds,
|
|
select_field_cmds, find_sel_cmds, build_clipboard,
|
|
find_clipboard_cmds, undo_cmds, paste_cmds, save_cmds, old_edit_cmd;
|
|
|
|
char *string_for_menu_item = sv_malloc(MAX_SIZE_MENU_STRING + 1);
|
|
|
|
old_break_mode = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Clip Lines",
|
|
MENU_VALUE, TEXTSW_MENU_CLIP_LINES,
|
|
HELP_INFO("textsw:mcliplines")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Wrap at Character",
|
|
MENU_VALUE, TEXTSW_MENU_WRAP_LINES_AT_CHAR,
|
|
HELP_INFO("textsw:mwrapchars")
|
|
0,
|
|
HELP_INFO("textsw:moldbreakmode")
|
|
0);
|
|
|
|
break_mode = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Wrap at Character",
|
|
MENU_VALUE, TEXTSW_MENU_WRAP_LINES_AT_CHAR,
|
|
HELP_INFO("textsw:mwrapchars")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Wrap at Word",
|
|
MENU_VALUE, TEXTSW_MENU_WRAP_LINES_AT_WORD,
|
|
HELP_INFO("textsw:mwrapwords")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Clip Lines",
|
|
MENU_VALUE, TEXTSW_MENU_CLIP_LINES,
|
|
HELP_INFO("textsw:mcliplines")
|
|
0,
|
|
HELP_INFO("textsw:mbreakmode")
|
|
0);
|
|
|
|
undo_cmds = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Undo Last Edit",
|
|
MENU_VALUE, TEXTSW_MENU_UNDO,
|
|
HELP_INFO("textsw:mundolast")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Undo All Edits",
|
|
MENU_VALUE, TEXTSW_MENU_UNDO_ALL,
|
|
HELP_INFO("textsw:mundoall")
|
|
0,
|
|
HELP_INFO("textsw:mundocmds")
|
|
0);
|
|
|
|
if (textsw_menu_style == TEXTSW_STYLE_ORGANIZED) {
|
|
fast_exits_cmds = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Close, then Save Current File",
|
|
MENU_VALUE, TEXTSW_MENU_SAVE_CLOSE,
|
|
HELP_INFO("textsw:msaveclose")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Save Current File, then Quit",
|
|
MENU_VALUE, TEXTSW_MENU_SAVE_QUIT,
|
|
HELP_INFO("textsw:msavequit")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Save, then Empty document",
|
|
MENU_VALUE, TEXTSW_MENU_SAVE_RESET,
|
|
MENU_LINE_AFTER_ITEM, MENU_HORIZONTAL_LINE,
|
|
HELP_INFO("textsw:msavereset")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Close, then Store as New File",
|
|
MENU_VALUE, TEXTSW_MENU_STORE_CLOSE,
|
|
HELP_INFO("textsw:mstoreclose")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Store as New File, then Quit",
|
|
MENU_VALUE, TEXTSW_MENU_STORE_QUIT,
|
|
HELP_INFO("textsw:mstorequit")
|
|
0,
|
|
HELP_INFO("textsw:mfastexitcmds")
|
|
0);
|
|
|
|
select_field_cmds = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Expand",
|
|
MENU_VALUE, TEXTSW_MENU_SEL_ENCLOSE_FIELD,
|
|
HELP_INFO("textsw:mselexpand")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Next",
|
|
MENU_VALUE, TEXTSW_MENU_SEL_NEXT_FIELD,
|
|
HELP_INFO("textsw:mselnext")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Previous",
|
|
MENU_VALUE, TEXTSW_MENU_SEL_PREV_FIELD,
|
|
HELP_INFO("textsw:mselprevious")
|
|
0,
|
|
HELP_INFO("textsw:mselfieldcmds")
|
|
0);
|
|
|
|
find_sel_cmds = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Forward",
|
|
MENU_VALUE, TEXTSW_MENU_FIND,
|
|
HELP_INFO("textsw:mfindforward")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Backward",
|
|
MENU_VALUE, TEXTSW_MENU_FIND_BACKWARD,
|
|
HELP_INFO("textsw:mfindbackward")
|
|
0,
|
|
HELP_INFO("textsw:mfindselcmds")
|
|
0);
|
|
|
|
find_clipboard_cmds = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Forward",
|
|
MENU_VALUE, TEXTSW_MENU_FIND_SHELF,
|
|
HELP_INFO("textsw:mfindcbforward")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Backward",
|
|
MENU_VALUE, TEXTSW_MENU_FIND_SHELF_BACKWARD,
|
|
HELP_INFO("textsw:mfindcbbackward")
|
|
0,
|
|
HELP_INFO("textsw:mfindcbcmds")
|
|
0);
|
|
/*
|
|
paste_cmds = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_STRING_ITEM, "Paste", TEXTSW_MENU_PASTE,
|
|
MENU_STRING_ITEM, "Paste from File", TEXTSW_MENU_FILE_STUFF,
|
|
0);
|
|
|
|
save_cmds = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_STRING_ITEM, "Save File", TEXTSW_MENU_SAVE,
|
|
MENU_STRING_ITEM, "Store to Named file", TEXTSW_MENU_STORE,
|
|
MENU_PULLRIGHT_ITEM, "Fast Exits", fast_exits_cmds,
|
|
0);
|
|
*/
|
|
file_cmds = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Save Current File",
|
|
MENU_VALUE, TEXTSW_MENU_SAVE,
|
|
HELP_INFO("textsw:msavefile")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Store as New File",
|
|
MENU_VALUE, TEXTSW_MENU_STORE,
|
|
MENU_LINE_AFTER_ITEM, MENU_HORIZONTAL_LINE,
|
|
HELP_INFO("textsw:mstorefile")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Load File",
|
|
MENU_VALUE, TEXTSW_MENU_LOAD,
|
|
HELP_INFO("textsw:mloadfile")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Include File",
|
|
MENU_VALUE, TEXTSW_MENU_FILE_STUFF,
|
|
HELP_INFO("textsw:mincludefile")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Set Directory",
|
|
MENU_VALUE, TEXTSW_MENU_CD,
|
|
MENU_LINE_AFTER_ITEM, MENU_HORIZONTAL_LINE,
|
|
HELP_INFO("textsw:msetdir")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Empty Document",
|
|
MENU_VALUE, TEXTSW_MENU_RESET,
|
|
HELP_INFO("textsw:memptydoc")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Finishing Up",
|
|
MENU_PULLRIGHT, fast_exits_cmds,
|
|
HELP_INFO("textsw:mfastexit")
|
|
0,
|
|
HELP_INFO("textsw:mfilecmds")
|
|
0);
|
|
|
|
build_clipboard = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_ITEM,
|
|
MENU_GEN_PROC, show_clipboard,
|
|
MENU_STRING, string_for_menu_item,
|
|
MENU_VALUE, TEXTSW_MENU_SHOW_CLIPBOARD,
|
|
HELP_INFO("textsw:mclipboard")
|
|
0,
|
|
HELP_INFO("textsw:mclipboard")
|
|
0);
|
|
|
|
edit_cmd = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Again",
|
|
MENU_VALUE, TEXTSW_MENU_AGAIN,
|
|
HELP_INFO("textsw:meditagain")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Undo",
|
|
MENU_PULLRIGHT, undo_cmds,
|
|
MENU_LINE_AFTER_ITEM, MENU_HORIZONTAL_LINE,
|
|
HELP_INFO("textsw:meditundo")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Copy",
|
|
MENU_VALUE, TEXTSW_MENU_COPY,
|
|
HELP_INFO("textsw:meditcopy")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Paste",
|
|
MENU_VALUE, TEXTSW_MENU_PASTE,
|
|
HELP_INFO("textsw:meditpaste")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Cut",
|
|
MENU_VALUE, TEXTSW_MENU_CUT,
|
|
MENU_LINE_AFTER_ITEM, MENU_HORIZONTAL_LINE,
|
|
HELP_INFO("textsw:meditcut")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Show Clipboard",
|
|
MENU_VALUE, TEXTSW_MENU_SHOW_CLIPBOARD_FROM_EDIT,
|
|
MENU_PULLRIGHT, build_clipboard,
|
|
HELP_INFO("textsw:mclipboard")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Copy, then Paste",
|
|
MENU_VALUE, TEXTSW_MENU_PUT_THEN_GET,
|
|
HELP_INFO("textsw:meditcopypaste")
|
|
0,
|
|
HELP_INFO("textsw:meditcmds")
|
|
0);
|
|
|
|
display_cmds = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Select Line at Number",
|
|
MENU_VALUE, TEXTSW_MENU_NORMALIZE_LINE,
|
|
HELP_INFO("textsw:mselectline")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "What Line Number?",
|
|
MENU_VALUE, TEXTSW_MENU_COUNT_TO_LINE,
|
|
MENU_LINE_AFTER_ITEM, MENU_HORIZONTAL_LINE,
|
|
HELP_INFO("textsw:mwhatline")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Split View",
|
|
MENU_VALUE, TEXTSW_MENU_CREATE_VIEW,
|
|
HELP_INFO("textsw:msplitview")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Destroy View",
|
|
MENU_VALUE, TEXTSW_MENU_DESTROY_VIEW,
|
|
MENU_LINE_AFTER_ITEM, MENU_HORIZONTAL_LINE,
|
|
HELP_INFO("textsw:mdestroyview")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Show Caret at Top",
|
|
MENU_VALUE, TEXTSW_MENU_NORMALIZE_INSERTION,
|
|
HELP_INFO("textsw:mshowcaret")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Move Caret to Start",
|
|
MENU_VALUE, TEXTSW_MENU_NORMALIZE_TOP,
|
|
HELP_INFO("textsw:mcaretstart")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Move Caret to End",
|
|
MENU_VALUE, TEXTSW_MENU_NORMALIZE_BOTTOM,
|
|
MENU_LINE_AFTER_ITEM, MENU_HORIZONTAL_LINE,
|
|
HELP_INFO("textsw:mcaretend")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Change Line Wrap",
|
|
MENU_PULLRIGHT, break_mode,
|
|
HELP_INFO("textsw:mchangelinewrap")
|
|
0,
|
|
HELP_INFO("textsw:mdisplaycmds")
|
|
0);
|
|
|
|
find_cmds = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Find and Replace",
|
|
MENU_VALUE, TEXTSW_MENU_FIND_AND_REPLACE,
|
|
MENU_LINE_AFTER_ITEM, MENU_HORIZONTAL_LINE,
|
|
HELP_INFO("textsw:mfindreplace")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Find Selection",
|
|
MENU_PULLRIGHT, find_sel_cmds,
|
|
HELP_INFO("textsw:mfindselcmds")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Find Clipboard",
|
|
MENU_PULLRIGHT, find_clipboard_cmds,
|
|
HELP_INFO("textsw:findcbcmds")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Show Clipboard",
|
|
MENU_VALUE, TEXTSW_MENU_SHOW_CLIPBOARD_FROM_FIND,
|
|
MENU_PULLRIGHT, build_clipboard,
|
|
MENU_LINE_AFTER_ITEM, MENU_HORIZONTAL_LINE,
|
|
HELP_INFO("textsw:mclipboard")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Find Marked Text",
|
|
MENU_VALUE, TEXTSW_MENU_SEL_MARK_TEXT,
|
|
HELP_INFO("textsw:mfindtext")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Match Delimiter",
|
|
MENU_VALUE, TEXTSW_MENU_MATCH_FIELD,
|
|
HELP_INFO("textsw:mmatchdelim")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Replace |>field<| ",
|
|
MENU_PULLRIGHT, select_field_cmds,
|
|
HELP_INFO("textsw:mselfieldcmds")
|
|
0,
|
|
HELP_INFO("textsw:mfindcmds")
|
|
0);
|
|
|
|
top_menu = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_ITEM,
|
|
MENU_STRING, "File",
|
|
MENU_PULLRIGHT, file_cmds,
|
|
HELP_INFO("textsw:mfilecmds")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Edit",
|
|
MENU_PULLRIGHT, edit_cmd,
|
|
HELP_INFO("textsw:meditcmds")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Display",
|
|
MENU_PULLRIGHT, display_cmds,
|
|
HELP_INFO("textsw:mdisplaycmds")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Find",
|
|
MENU_PULLRIGHT, find_cmds,
|
|
HELP_INFO("textsw:mfindcmds")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_GEN_PROC, textsw_toggle_extras_item,
|
|
MENU_STRING, "Extras",
|
|
MENU_INACTIVE, TRUE,
|
|
MENU_GEN_PULLRIGHT, textsw_build_extras_menu,
|
|
MENU_CLIENT_DATA, VIEW_FROM_FOLIO_OR_VIEW(folio),
|
|
HELP_INFO("textsw:mextras")
|
|
0,
|
|
HELP_INFO("textsw:mtopmenu")
|
|
0);
|
|
} else {
|
|
save_file = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Save file",
|
|
MENU_VALUE, TEXTSW_MENU_SAVE,
|
|
HELP_INFO("textsw:msavefile")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Save then Quit",
|
|
MENU_VALUE, TEXTSW_MENU_SAVE_QUIT,
|
|
HELP_INFO("textsw:msavequit")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Save then Reset",
|
|
MENU_VALUE, TEXTSW_MENU_SAVE_RESET,
|
|
HELP_INFO("textsw:msavereset")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Close then Save",
|
|
MENU_VALUE, TEXTSW_MENU_SAVE_CLOSE,
|
|
HELP_INFO("textsw:msaveclose")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Store to named file",
|
|
MENU_VALUE, TEXTSW_MENU_STORE,
|
|
HELP_INFO("textsw:mstorefile")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Store then Quit",
|
|
MENU_VALUE, TEXTSW_MENU_STORE_QUIT,
|
|
HELP_INFO("textsw:mstorequit")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Close then Store",
|
|
MENU_VALUE, TEXTSW_MENU_STORE_CLOSE,
|
|
HELP_INFO("textsw:mstoreclose")
|
|
0,
|
|
HELP_INFO("textsw:msave")
|
|
0);
|
|
|
|
find_pattern = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Find, forward",
|
|
MENU_VALUE, TEXTSW_MENU_FIND,
|
|
HELP_INFO("textsw:mfindforward")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Find, backward",
|
|
MENU_VALUE, TEXTSW_MENU_FIND_BACKWARD,
|
|
HELP_INFO("testsw:mfindbackward")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Find Shelf, forward",
|
|
MENU_VALUE, TEXTSW_MENU_FIND_SHELF,
|
|
HELP_INFO("textsw:mfindcbforward")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Find Shelf, backward",
|
|
MENU_VALUE, TEXTSW_MENU_FIND_SHELF_BACKWARD,
|
|
HELP_INFO("textsw:findcbbackward")
|
|
0,
|
|
#ifdef _TEXTSW_FIND_RE
|
|
MENU_ITEM,
|
|
MENU_STRING, "Find RE, forward",
|
|
MENU_VALUE, TEXTSW_MENU_FIND_RE,
|
|
HELP_INFO("textsw:mfindreforward")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Find RE, backward",
|
|
MENU_VALUE, TEXTSW_MENU_FIND_RE_BACKWARD,
|
|
HELP_INFO("textsw:mfindrebackward")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Find tag, forward",
|
|
MENU_VALUE, TEXTSW_MENU_FIND_TAG,
|
|
HELP_INFO("textsw:mfindtagforward")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Find tag, backward",
|
|
MENU_VALUE, TEXTSW_MENU_FIND_TAG_BACKWARD,
|
|
HELP_INFO("textsw:mfindtagbackward")
|
|
0,
|
|
#endif
|
|
HELP_INFO("textsw:mfindpattern")
|
|
0);
|
|
|
|
/* old_edit_cmd = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_STRING_ITEM, "Again", TEXTSW_MENU_AGAIN,
|
|
MENU_PULLRIGHT_ITEM, "Undo", undo_cmds,
|
|
MENU_STRING_ITEM, "Copy", TEXTSW_MENU_COPY,
|
|
MENU_PULLRIGHT_ITEM, "Paste", paste_cmds,
|
|
MENU_STRING_ITEM, "Cut", TEXTSW_MENU_CUT,
|
|
MENU_STRING_ITEM, "Copy then Paste", TEXTSW_MENU_PUT_THEN_GET,
|
|
0);
|
|
*/
|
|
top_menu = menu_create(
|
|
MENU_LEFT_MARGIN, 6,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Save",
|
|
MENU_PULLRIGHT, save_file,
|
|
HELP_INFO("textsw:msavefile")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Load file",
|
|
MENU_VALUE, TEXTSW_MENU_LOAD,
|
|
HELP_INFO("textsw:mloadfile")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Select line #",
|
|
MENU_VALUE, TEXTSW_MENU_NORMALIZE_LINE,
|
|
HELP_INFO("textsw:mselectline")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Split view",
|
|
MENU_VALUE, TEXTSW_MENU_CREATE_VIEW,
|
|
HELP_INFO("textsw:msplitview")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Destroy view",
|
|
MENU_VALUE, TEXTSW_MENU_DESTROY_VIEW,
|
|
HELP_INFO("textsw:mdestroyview")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Reset",
|
|
MENU_VALUE, TEXTSW_MENU_RESET,
|
|
HELP_INFO("textsw:memptydoc")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "What line #?",
|
|
MENU_VALUE, TEXTSW_MENU_COUNT_TO_LINE,
|
|
HELP_INFO("textsw:mwhatline")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Get from file",
|
|
MENU_VALUE, TEXTSW_MENU_FILE_STUFF,
|
|
HELP_INFO("textsw:mincludefile")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Caret to top",
|
|
MENU_VALUE, TEXTSW_MENU_NORMALIZE_INSERTION,
|
|
HELP_INFO("textsw:mshowcaret")
|
|
0,
|
|
#ifdef notdef
|
|
MENU_STRING_ITEM, "Selection to top",
|
|
TEXTSW_MENU_NORMALIZE_SELECTION,
|
|
#endif
|
|
MENU_ITEM,
|
|
MENU_STRING, "Line break",
|
|
MENU_PULLRIGHT, old_break_mode,
|
|
HELP_INFO("textsw:moldbreakmode")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Set directory",
|
|
MENU_VALUE, TEXTSW_MENU_CD,
|
|
HELP_INFO("textsw:msetdir")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, "Find",
|
|
MENU_PULLRIGHT, find_pattern,
|
|
HELP_INFO("textsw:mfindpattern")
|
|
0,
|
|
MENU_ITEM,
|
|
MENU_STRING, put_then_get,
|
|
MENU_VALUE, TEXTSW_MENU_PUT_THEN_GET,
|
|
HELP_INFO("textsw:meditcopypaste")
|
|
0,
|
|
/* since these are the OLD menus, we won't even give them these two cmds
|
|
MENU_STRING_ITEM, "Match", TEXTSW_MENU_MATCH_FIELD,
|
|
MENU_PULLRIGHT_ITEM, "Edit", old_edit_cmd,
|
|
*/
|
|
HELP_INFO("textsw:mtopmenu")
|
|
0);
|
|
}
|
|
(void)menu_set(top_menu, MENU_CLIENT_DATA, textsw_menu_style, 0);
|
|
return top_menu;
|
|
}
|
|
|
|
static void
|
|
stuff_clipboard()
|
|
{
|
|
Seln_holder holder;
|
|
Seln_rank rank = SELN_SHELF;
|
|
char context = 0; /* initially =0(first time), change to 1 afterwards */
|
|
char *destination = "/dev/console";
|
|
|
|
if ((output = fopen(destination, "w")) == NULL) return;
|
|
holder = seln_inquire(rank);
|
|
if (holder.state == SELN_NONE) {
|
|
fputs("\nThe clipboard is currently empty.", output);
|
|
return;
|
|
}
|
|
seln_query(&holder, read_proc, &context, SELN_REQ_CONTENTS_ASCII, 0, 0);
|
|
fclose(output);
|
|
}
|
|
|
|
static Menu_item
|
|
show_clipboard(item, operation)
|
|
Menu_item item;
|
|
Menu_generate operation;
|
|
{
|
|
Seln_holder holder;
|
|
Seln_request *buffer;
|
|
Seln_rank rank = SELN_SHELF;
|
|
char *string_for_menu_item;
|
|
int i;
|
|
|
|
switch (operation) {
|
|
|
|
case MENU_DISPLAY: /* build string menu here */
|
|
string_for_menu_item = menu_get(item, MENU_STRING, 0);
|
|
for (i=0; i <= MAX_SIZE_MENU_STRING; i++) {
|
|
string_for_menu_item[i] = NULL;
|
|
}
|
|
menu_set(item, MENU_STRING, string_for_menu_item, 0); /* default */
|
|
holder = seln_inquire(rank);
|
|
if (holder.state == SELN_NONE) {
|
|
break; /* return item */
|
|
}
|
|
buffer = seln_ask(&holder, SELN_REQ_CONTENTS_ASCII, 0, 0);
|
|
if (buffer == (Seln_request *) NULL ||
|
|
*((Seln_attribute *)
|
|
(LINT_CAST(buffer->data))) != SELN_REQ_CONTENTS_ASCII) {
|
|
break; /* all done, nothing to look at, later post message
|
|
saying "Selection holder error--..." noting failure */
|
|
}
|
|
strncpy( /* and possibly truncate buffer to max size allowed */
|
|
string_for_menu_item, /* destination */
|
|
buffer->data + sizeof (Seln_attribute), /* source */
|
|
MAX_SIZE_MENU_STRING); /* num chars */
|
|
menu_set(item, MENU_STRING, string_for_menu_item, 0);
|
|
menu_set(item, MENU_INACTIVE, FALSE, 0); /*not greyed out */
|
|
menu_set(item, MENU_FEEDBACK, FALSE, 0); /* no invert,no select */
|
|
break;
|
|
|
|
case MENU_DISPLAY_DONE:
|
|
break;
|
|
|
|
case MENU_NOTIFY:
|
|
case MENU_NOTIFY_DONE:
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return item;
|
|
}
|
|
|
|
static Seln_result
|
|
read_proc(buffer)
|
|
Seln_request *buffer;
|
|
{
|
|
char *destination = "/dev/console";
|
|
char *intro_message = "\nCurrent clipboard: ";
|
|
char *error = "Selection holder error -- unrecognized request\n";
|
|
char *reply;
|
|
|
|
if (*buffer->requester.context == 0) {
|
|
if (buffer == (Seln_request *) NULL ||
|
|
*((Seln_attribute *)
|
|
(LINT_CAST(buffer->data))) != SELN_REQ_CONTENTS_ASCII) {
|
|
fputs(error, output);
|
|
fclose(output);
|
|
return(SELN_UNRECOGNIZED);
|
|
}
|
|
fputs(intro_message, output);
|
|
reply = buffer->data + sizeof (Seln_attribute);
|
|
*buffer->requester.context = 1;
|
|
} else {
|
|
reply = buffer->data;
|
|
}
|
|
fputs(reply, output);
|
|
(void)fflush(output);
|
|
return SELN_SUCCESS;
|
|
}
|
|
|
|
extern Menu_item *
|
|
textsw_new_menu_table(textsw)
|
|
Textsw_folio textsw;
|
|
{
|
|
int textsw_do_menu_action();
|
|
int item;
|
|
Menu_item menu_item, *menu_items;
|
|
Menu top_menu = textsw->menu, save_file, edit_cmd, break_mode,
|
|
find_pattern, filing_cmd, display_cmd, exits_cmd, undo_cmd,
|
|
paste_cmd, show_clip_cmd, find_sel_cmd, find_clip_cmd, save_cmd,
|
|
search_field_cmd;
|
|
|
|
menu_items = (Menu_item *)LINT_CAST(sv_calloc((unsigned)TEXTSW_MENU_LAST_CMD,
|
|
sizeof(Menu_item)));
|
|
|
|
if (textsw_menu_style == TEXTSW_STYLE_ORGANIZED) {
|
|
menu_item = (Menu_item)menu_get(top_menu, MENU_NTH_ITEM, 1);
|
|
filing_cmd = (Menu)menu_get(menu_item, MENU_VALUE);
|
|
menu_item = (Menu_item)menu_get(top_menu, MENU_NTH_ITEM, 2);
|
|
edit_cmd = (Menu)menu_get(menu_item, MENU_VALUE);
|
|
menu_item = (Menu_item)menu_get(top_menu, MENU_NTH_ITEM, 3);
|
|
display_cmd = (Menu)menu_get(menu_item, MENU_VALUE);
|
|
menu_item = (Menu_item)menu_get(top_menu, MENU_NTH_ITEM, 4);
|
|
find_pattern = (Menu)menu_get(menu_item, MENU_VALUE);
|
|
|
|
menu_item = (Menu_item)menu_get(edit_cmd, MENU_NTH_ITEM, 2);
|
|
undo_cmd = (Menu)menu_get(menu_item, MENU_VALUE);
|
|
|
|
menu_item = (Menu_item)menu_get(filing_cmd, MENU_NTH_ITEM, 7);
|
|
exits_cmd = (Menu)menu_get(menu_item, MENU_VALUE);
|
|
|
|
menu_item = (Menu_item)menu_get(edit_cmd, MENU_NTH_ITEM, 6);
|
|
show_clip_cmd = (Menu)menu_get(menu_item, MENU_VALUE);
|
|
|
|
menu_item = (Menu_item)menu_get(display_cmd, MENU_NTH_ITEM, 8);
|
|
break_mode = (Menu)menu_get(menu_item, MENU_VALUE);
|
|
|
|
menu_item = (Menu_item)menu_get(find_pattern, MENU_NTH_ITEM, 2);
|
|
find_sel_cmd = (Menu)menu_get(menu_item, MENU_VALUE);
|
|
menu_item = (Menu_item)menu_get(find_pattern, MENU_NTH_ITEM, 3);
|
|
find_clip_cmd = (Menu)menu_get(menu_item, MENU_VALUE);
|
|
menu_item = (Menu_item)menu_get(find_pattern, MENU_NTH_ITEM, 7);
|
|
search_field_cmd = (Menu)menu_get(menu_item, MENU_VALUE);
|
|
|
|
menu_items[(int)TEXTSW_MENU_SAVE_CLOSE] =
|
|
menu_get(exits_cmd, MENU_NTH_ITEM, 1);
|
|
menu_items[(int)TEXTSW_MENU_SAVE_QUIT] =
|
|
menu_get(exits_cmd, MENU_NTH_ITEM, 2);
|
|
menu_items[(int)TEXTSW_MENU_SAVE_RESET] =
|
|
menu_get(exits_cmd, MENU_NTH_ITEM, 3);
|
|
menu_items[(int)TEXTSW_MENU_STORE_CLOSE] =
|
|
menu_get(exits_cmd, MENU_NTH_ITEM, 4);
|
|
menu_items[(int)TEXTSW_MENU_STORE_QUIT] =
|
|
menu_get(exits_cmd, MENU_NTH_ITEM, 5);
|
|
|
|
menu_items[(int)TEXTSW_MENU_SAVE] =
|
|
menu_get(filing_cmd, MENU_NTH_ITEM, 1);
|
|
menu_items[(int)TEXTSW_MENU_STORE] =
|
|
menu_get(filing_cmd, MENU_NTH_ITEM, 2);
|
|
menu_items[(int)TEXTSW_MENU_LOAD] =
|
|
menu_get(filing_cmd, MENU_NTH_ITEM, 3);
|
|
menu_items[(int)TEXTSW_MENU_FILE_STUFF] =
|
|
menu_get(filing_cmd, MENU_NTH_ITEM, 4);
|
|
menu_items[(int)TEXTSW_MENU_CD] =
|
|
menu_get(filing_cmd, MENU_NTH_ITEM, 5);
|
|
menu_items[(int)TEXTSW_MENU_RESET] =
|
|
menu_get(filing_cmd, MENU_NTH_ITEM, 6);
|
|
|
|
menu_items[(int)TEXTSW_MENU_UNDO] =
|
|
menu_get(undo_cmd, MENU_NTH_ITEM, 1);
|
|
menu_items[(int)TEXTSW_MENU_UNDO_ALL] =
|
|
menu_get(undo_cmd, MENU_NTH_ITEM, 2);
|
|
|
|
menu_items[(int)TEXTSW_MENU_AGAIN] =
|
|
menu_get(edit_cmd, MENU_NTH_ITEM, 1);
|
|
menu_items[(int)TEXTSW_MENU_COPY] =
|
|
menu_get(edit_cmd, MENU_NTH_ITEM, 3);
|
|
menu_items[(int)TEXTSW_MENU_PASTE] =
|
|
menu_get(edit_cmd, MENU_NTH_ITEM, 4);
|
|
menu_items[(int)TEXTSW_MENU_CUT] =
|
|
menu_get(edit_cmd, MENU_NTH_ITEM, 5);
|
|
menu_items[(int)TEXTSW_MENU_SHOW_CLIPBOARD_FROM_EDIT] =
|
|
menu_get(edit_cmd, MENU_NTH_ITEM, 6);
|
|
menu_items[(int)TEXTSW_MENU_PUT_THEN_GET] =
|
|
menu_get(edit_cmd, MENU_NTH_ITEM, 7);
|
|
|
|
menu_items[(int)TEXTSW_MENU_SHOW_CLIPBOARD] =
|
|
menu_get(show_clip_cmd, MENU_NTH_ITEM, 1);
|
|
|
|
menu_items[(int)TEXTSW_MENU_NORMALIZE_LINE] =
|
|
menu_get(display_cmd, MENU_NTH_ITEM, 1);
|
|
menu_items[(int)TEXTSW_MENU_COUNT_TO_LINE] =
|
|
menu_get(display_cmd, MENU_NTH_ITEM, 2);
|
|
menu_items[(int)TEXTSW_MENU_CREATE_VIEW] =
|
|
menu_get(display_cmd, MENU_NTH_ITEM, 3);
|
|
menu_items[(int)TEXTSW_MENU_DESTROY_VIEW] =
|
|
menu_get(display_cmd, MENU_NTH_ITEM, 4);
|
|
menu_items[(int)TEXTSW_MENU_NORMALIZE_INSERTION] =
|
|
menu_get(display_cmd, MENU_NTH_ITEM, 5);
|
|
menu_items[(int)TEXTSW_MENU_NORMALIZE_TOP] =
|
|
menu_get(display_cmd, MENU_NTH_ITEM, 6);
|
|
menu_items[(int)TEXTSW_MENU_NORMALIZE_BOTTOM] =
|
|
menu_get(display_cmd, MENU_NTH_ITEM, 7);
|
|
|
|
menu_items[(int)TEXTSW_MENU_WRAP_LINES_AT_CHAR] =
|
|
menu_get(break_mode, MENU_NTH_ITEM, 1);
|
|
menu_items[(int)TEXTSW_MENU_WRAP_LINES_AT_WORD] =
|
|
menu_get(break_mode, MENU_NTH_ITEM, 2);
|
|
menu_items[(int)TEXTSW_MENU_CLIP_LINES] =
|
|
menu_get(break_mode, MENU_NTH_ITEM, 3);
|
|
|
|
menu_items[(int)TEXTSW_MENU_FIND_AND_REPLACE] =
|
|
menu_get(find_pattern, MENU_NTH_ITEM, 1);
|
|
menu_items[(int)TEXTSW_MENU_SHOW_CLIPBOARD_FROM_FIND] =
|
|
menu_get(find_pattern, MENU_NTH_ITEM, 4);
|
|
menu_items[(int)TEXTSW_MENU_SEL_MARK_TEXT] =
|
|
menu_get(find_pattern, MENU_NTH_ITEM, 5);
|
|
menu_items[(int)TEXTSW_MENU_MATCH_FIELD] =
|
|
menu_get(find_pattern, MENU_NTH_ITEM, 6);
|
|
|
|
menu_items[(int)TEXTSW_MENU_FIND] =
|
|
menu_get(find_sel_cmd, MENU_NTH_ITEM, 1);
|
|
menu_items[(int)TEXTSW_MENU_FIND_BACKWARD] =
|
|
menu_get(find_sel_cmd, MENU_NTH_ITEM, 2);
|
|
|
|
menu_items[(int)TEXTSW_MENU_FIND_SHELF] =
|
|
menu_get(find_clip_cmd, MENU_NTH_ITEM, 1);
|
|
menu_items[(int)TEXTSW_MENU_FIND_SHELF_BACKWARD] =
|
|
menu_get(find_clip_cmd, MENU_NTH_ITEM, 2);
|
|
|
|
menu_items[(int)TEXTSW_MENU_SEL_ENCLOSE_FIELD] =
|
|
menu_get(search_field_cmd, MENU_NTH_ITEM, 1);
|
|
menu_items[(int)TEXTSW_MENU_SEL_NEXT_FIELD] =
|
|
menu_get(search_field_cmd, MENU_NTH_ITEM, 2);
|
|
menu_items[(int)TEXTSW_MENU_SEL_PREV_FIELD] =
|
|
menu_get(search_field_cmd, MENU_NTH_ITEM, 3);
|
|
} else {
|
|
menu_items[(int)TEXTSW_MENU_LOAD] =
|
|
menu_get(top_menu, MENU_NTH_ITEM, 2);
|
|
menu_items[(int)TEXTSW_MENU_NORMALIZE_LINE] =
|
|
menu_get(top_menu, MENU_NTH_ITEM, 3);
|
|
menu_items[(int)TEXTSW_MENU_CREATE_VIEW] =
|
|
menu_get(top_menu, MENU_NTH_ITEM, 4);
|
|
menu_items[(int)TEXTSW_MENU_DESTROY_VIEW] =
|
|
menu_get(top_menu, MENU_NTH_ITEM, 5);
|
|
menu_items[(int)TEXTSW_MENU_RESET] =
|
|
menu_get(top_menu, MENU_NTH_ITEM, 6);
|
|
menu_items[(int)TEXTSW_MENU_COUNT_TO_LINE] =
|
|
menu_get(top_menu, MENU_NTH_ITEM, 7);
|
|
menu_items[(int)TEXTSW_MENU_FILE_STUFF] =
|
|
menu_get(top_menu, MENU_NTH_ITEM, 8);
|
|
menu_items[(int)TEXTSW_MENU_NORMALIZE_INSERTION] =
|
|
menu_get(top_menu, MENU_NTH_ITEM, 9);
|
|
menu_items[(int)TEXTSW_MENU_CD] =
|
|
menu_get(top_menu, MENU_NTH_ITEM, 11);
|
|
menu_items[(int)TEXTSW_MENU_PUT_THEN_GET] =
|
|
menu_get(top_menu, MENU_NTH_ITEM, 13);
|
|
/* menu_items[(int)TEXTSW_MENU_MATCH_FIELD] =
|
|
menu_get(top_menu, MENU_NTH_ITEM, 14);
|
|
*/
|
|
menu_item = (Menu_item)menu_get(top_menu, MENU_NTH_ITEM, 1);
|
|
save_file = (Menu)menu_get(menu_item, MENU_VALUE);
|
|
menu_item = (Menu_item)menu_get(top_menu, MENU_NTH_ITEM, 10);
|
|
break_mode = (Menu)menu_get(menu_item, MENU_VALUE);
|
|
menu_item = (Menu_item)menu_get(top_menu, MENU_NTH_ITEM, 12);
|
|
find_pattern = (Menu)menu_get(menu_item, MENU_VALUE);
|
|
|
|
/* menu_item = (Menu_item)menu_get(top_menu, MENU_NTH_ITEM, 15);
|
|
edit_cmd = (Menu)menu_get(menu_item, MENU_VALUE);
|
|
menu_items[(int)TEXTSW_MENU_AGAIN] =
|
|
menu_get(edit_cmd, MENU_NTH_ITEM, 1);
|
|
menu_items[(int)TEXTSW_MENU_UNDO] =
|
|
menu_get(edit_cmd, MENU_NTH_ITEM, 2);
|
|
menu_items[(int)TEXTSW_MENU_CUT] =
|
|
menu_get(edit_cmd, MENU_NTH_ITEM, 3);
|
|
menu_items[(int)TEXTSW_MENU_COPY] =
|
|
menu_get(edit_cmd, MENU_NTH_ITEM, 4);
|
|
menu_items[(int)TEXTSW_MENU_PASTE] =
|
|
menu_get(edit_cmd, MENU_NTH_ITEM, 5);
|
|
*/
|
|
|
|
menu_items[(int)TEXTSW_MENU_SAVE] =
|
|
menu_get(save_file, MENU_NTH_ITEM, 1);
|
|
menu_items[(int)TEXTSW_MENU_SAVE_QUIT] =
|
|
menu_get(save_file, MENU_NTH_ITEM, 2);
|
|
menu_items[(int)TEXTSW_MENU_SAVE_RESET] =
|
|
menu_get(save_file, MENU_NTH_ITEM, 3);
|
|
menu_items[(int)TEXTSW_MENU_SAVE_CLOSE] =
|
|
menu_get(save_file, MENU_NTH_ITEM, 4);
|
|
menu_items[(int)TEXTSW_MENU_STORE] =
|
|
menu_get(save_file, MENU_NTH_ITEM, 5);
|
|
menu_items[(int)TEXTSW_MENU_STORE_QUIT] =
|
|
menu_get(save_file, MENU_NTH_ITEM, 6);
|
|
menu_items[(int)TEXTSW_MENU_STORE_CLOSE] =
|
|
menu_get(save_file, MENU_NTH_ITEM, 7);
|
|
|
|
menu_items[(int)TEXTSW_MENU_CLIP_LINES] =
|
|
menu_get(break_mode, MENU_NTH_ITEM, 1);
|
|
menu_items[(int)TEXTSW_MENU_WRAP_LINES_AT_CHAR] =
|
|
menu_get(break_mode, MENU_NTH_ITEM, 2);
|
|
|
|
menu_items[(int)TEXTSW_MENU_FIND] =
|
|
menu_get(find_pattern, MENU_NTH_ITEM, 1);
|
|
menu_items[(int)TEXTSW_MENU_FIND_BACKWARD] =
|
|
menu_get(find_pattern, MENU_NTH_ITEM, 2);
|
|
menu_items[(int)TEXTSW_MENU_FIND_SHELF] =
|
|
menu_get(find_pattern, MENU_NTH_ITEM, 3);
|
|
menu_items[(int)TEXTSW_MENU_FIND_SHELF_BACKWARD] =
|
|
menu_get(find_pattern, MENU_NTH_ITEM, 4);
|
|
#ifdef _TEXTSW_FIND_RE
|
|
menu_items[(int)TEXTSW_MENU_FIND_RE] =
|
|
menu_get(find_pattern, MENU_NTH_ITEM, 5);
|
|
menu_items[(int)TEXTSW_MENU_FIND_RE_BACKWARD] =
|
|
menu_get(find_pattern, MENU_NTH_ITEM, 6);
|
|
menu_items[(int)TEXTSW_MENU_FIND_TAG] =
|
|
menu_get(find_pattern, MENU_NTH_ITEM, 7);
|
|
menu_items[(int)TEXTSW_MENU_FIND_TAG_BACKWARD] =
|
|
menu_get(find_pattern, MENU_NTH_ITEM, 8);
|
|
#endif
|
|
} /* end of "if textsw_menu_style != organized" */
|
|
|
|
for(item = (int)TEXTSW_MENU_NO_CMD;
|
|
item < (int)TEXTSW_MENU_LAST_CMD;
|
|
item++) {
|
|
menu_set(menu_items[item],
|
|
MENU_ACTION, textsw_do_menu_action, 0);
|
|
}
|
|
|
|
return menu_items;
|
|
}
|
|
static struct pixrect *
|
|
textsw_init_get_only_pr(menu)
|
|
Menu menu;
|
|
{
|
|
struct pixrect *pr;
|
|
struct pixfont *menu_font;
|
|
struct pr_subregion get_only_bound;
|
|
struct pr_prpos get_only_prpos;
|
|
int menu_left_margin;
|
|
|
|
/* compute the size of the pixrect and allocate it */
|
|
menu_font = (struct pixfont *)LINT_CAST(menu_get(menu, MENU_FONT));
|
|
pf_textbound(&get_only_bound,
|
|
strlen(put_then_get), menu_font, put_then_get);
|
|
menu_left_margin = (int)menu_get(menu, MENU_LEFT_MARGIN);
|
|
pr = (struct pixrect *)mem_create(
|
|
get_only_bound.size.x + menu_left_margin +
|
|
(int)menu_get(menu, MENU_RIGHT_MARGIN),
|
|
get_only_bound.size.y, 1);
|
|
/* write the text into the pixrect */
|
|
get_only_prpos.pr = pr;
|
|
get_only_prpos.pos.x = menu_left_margin
|
|
- menu_font->pf_char[put_then_get[0]].pc_home.x;
|
|
get_only_prpos.pos.y =
|
|
- menu_font->pf_char[put_then_get[0]].pc_home.y;
|
|
pf_text(get_only_prpos, PIX_SRC, menu_font, put_then_get);
|
|
/* gray out "Copy then" */
|
|
pf_textbound(&get_only_bound,
|
|
strlen(put_then), menu_font, put_then);
|
|
pr_replrop(pr, menu_left_margin, 0,
|
|
get_only_bound.size.x, get_only_bound.size.y,
|
|
PIX_SRC & PIX_DST, &menu_gray50_pr, 0, 0);
|
|
return pr;
|
|
}
|
|
|
|
extern Menu
|
|
textsw_menu_init(textsw)
|
|
Textsw_folio textsw;
|
|
{
|
|
Textsw_enum style;
|
|
|
|
if (textsw_menu != 0) {
|
|
textsw->menu = (caddr_t)textsw_menu;
|
|
} else {
|
|
if (!textsw_menu_style_already_set) {
|
|
Textsw_enum style = textsw_get_menu_style_internal();
|
|
}
|
|
(Menu)textsw->menu = textsw_menu = textsw_new_menu(textsw);
|
|
if (textsw_get_only_pr == 0) {
|
|
textsw_get_only_pr = textsw_init_get_only_pr(textsw_menu);
|
|
}
|
|
textsw_menu_items = textsw_new_menu_table(textsw);
|
|
textsw_menu_refcount = 0;
|
|
}
|
|
textsw->menu_table = (caddr_t)textsw_menu_items;
|
|
textsw_menu_refcount++;
|
|
return (textsw->menu);
|
|
}
|
|
|
|
extern Menu
|
|
textsw_get_unique_menu(textsw)
|
|
Textsw_folio textsw;
|
|
{
|
|
if (textsw->menu == textsw_menu) {
|
|
/* refcount == 1 ==> textsw is the only referencer */
|
|
if (textsw_menu_refcount == 1) {
|
|
textsw_menu = 0;
|
|
textsw_menu_items = 0;
|
|
textsw_menu_refcount = 0;
|
|
} else {
|
|
textsw->menu = (caddr_t)textsw_new_menu(textsw);
|
|
textsw->menu_table = (caddr_t)textsw_new_menu_table(textsw);
|
|
textsw_menu_refcount--;
|
|
}
|
|
}
|
|
return (textsw->menu);
|
|
}
|
|
|
|
extern void
|
|
textsw_set_menu_style_internal(style)
|
|
Textsw_enum style;
|
|
{
|
|
if (textsw_menu == 0) textsw_menu_style = style;
|
|
textsw_menu_style_already_set = 1; /* set first time */
|
|
}
|
|
|
|
extern Textsw_enum
|
|
textsw_get_menu_style_internal()
|
|
{
|
|
if (!textsw_menu_style_already_set) { /* not set yet */
|
|
if (defaults_get_boolean(
|
|
"/Compatibility/New_Text_Menu", (Bool)TRUE, (int *)NULL)) {
|
|
textsw_menu_style = TEXTSW_STYLE_ORGANIZED;
|
|
} else textsw_menu_style = TEXTSW_STYLE_UNORGANIZED;
|
|
textsw_menu_style_already_set = 1;
|
|
}
|
|
return (textsw_menu_style);
|
|
}
|
|
|
|
#define MENU_ACTIVE MENU_INACTIVE, FALSE
|
|
|
|
extern void
|
|
textsw_do_menu(view, ie)
|
|
Textsw_view view;
|
|
Event *ie;
|
|
{
|
|
Ev_handle current_view;
|
|
int i;
|
|
register Textsw_folio textsw = FOLIO_FOR_VIEW(view);
|
|
Textsw abstract = VIEW_REP_TO_ABS(view);
|
|
register Menu_item *menu_items;
|
|
int primary_selection_exists, shelf_isnt_empty;
|
|
|
|
if (textsw->menu == 0) return;
|
|
|
|
primary_selection_exists = textsw_is_seln_nonzero(textsw, EV_SEL_PRIMARY);
|
|
shelf_isnt_empty = textsw_is_seln_nonzero(textsw, EV_SEL_SHELF);
|
|
|
|
menu_items = (Menu_item *)LINT_CAST(textsw->menu_table);
|
|
for (i = 0; i < (int)TEXTSW_MENU_LAST_CMD; i++)
|
|
menu_set(menu_items[i], MENU_INACTIVE, TRUE,
|
|
MENU_CLIENT_DATA, abstract,
|
|
0);
|
|
|
|
/* Construct a menu appropriate to the the view it is invoked over. */
|
|
if (((textsw->state & TXTSW_NO_LOAD) == 0) && primary_selection_exists)
|
|
menu_set(menu_items[(int)TEXTSW_MENU_LOAD], MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_SAVE], MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_STORE], MENU_ACTIVE, 0);
|
|
if (textsw->views->first_view != EV_NULL) {
|
|
Es_handle original;
|
|
original = (Es_handle)LINT_CAST(
|
|
es_get(textsw->views->esh, ES_PS_ORIGINAL) );
|
|
if ((!TXTSW_IS_READ_ONLY(textsw)) &&
|
|
(original != ES_NULL) &&
|
|
(Es_enum)LINT_CAST(es_get(original, ES_TYPE)) == ES_TYPE_FILE) {
|
|
menu_set(menu_items[(int)TEXTSW_MENU_SAVE_QUIT],
|
|
MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_SAVE_RESET],
|
|
MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_SAVE_CLOSE],
|
|
MENU_ACTIVE, 0);
|
|
}
|
|
if ((textsw->state & TXTSW_READ_ONLY_SW) == 0) {
|
|
menu_set(menu_items[(int)TEXTSW_MENU_RESET], MENU_ACTIVE, 0);
|
|
if (primary_selection_exists) {
|
|
/* commented out since this item is set to active always *
|
|
menu_set(menu_items[(int)TEXTSW_MENU_STORE],
|
|
MENU_ACTIVE, 0);
|
|
*/
|
|
menu_set(menu_items[(int)TEXTSW_MENU_STORE_QUIT],
|
|
MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_STORE_CLOSE],
|
|
MENU_ACTIVE, 0);
|
|
}
|
|
}
|
|
if (textsw->tool)
|
|
menu_set(menu_items[(int)TEXTSW_MENU_CREATE_VIEW],
|
|
MENU_ACTIVE, 0);
|
|
if (((textsw->state & TXTSW_NO_CD) == 0)
|
|
&& (primary_selection_exists))
|
|
menu_set(menu_items[(int)TEXTSW_MENU_CD], MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_NORMALIZE_INSERTION],
|
|
MENU_ACTIVE, 0);
|
|
/*
|
|
menu_set(menu_items[(int)TEXTSW_MENU_NORMALIZE_SELECTION],
|
|
MENU_ACTIVE, 0);
|
|
*/
|
|
menu_set(menu_items[(int)TEXTSW_MENU_NORMALIZE_TOP],
|
|
MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_NORMALIZE_BOTTOM],
|
|
MENU_ACTIVE, 0);
|
|
if (!TXTSW_IS_READ_ONLY(textsw)) {
|
|
if (primary_selection_exists)
|
|
menu_set(menu_items[(int)TEXTSW_MENU_FILE_STUFF],
|
|
MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_AGAIN],
|
|
MENU_ACTIVE, 0);
|
|
|
|
if (textsw_has_been_modified(abstract)) {
|
|
menu_set(menu_items[(int)TEXTSW_MENU_UNDO],
|
|
MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_UNDO_ALL],
|
|
MENU_ACTIVE, 0);
|
|
}
|
|
|
|
if (primary_selection_exists)
|
|
/* if there is a non-zero primary selection,
|
|
* set string to be put_then_get, and make active;
|
|
* else if there is a non-zero shelf,
|
|
* set string to be get_only, and make active;
|
|
* else set string to be put_then_get, and make inactive.
|
|
*/
|
|
if (primary_selection_exists) {
|
|
menu_set(menu_items[(int)TEXTSW_MENU_PUT_THEN_GET],
|
|
MENU_ACTIVE,
|
|
MENU_IMAGE, 0,
|
|
MENU_STRING, put_then_get,
|
|
0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_CUT], MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_COPY], MENU_ACTIVE, 0);
|
|
} else if (shelf_isnt_empty) {
|
|
menu_set(menu_items[(int)TEXTSW_MENU_PUT_THEN_GET],
|
|
MENU_ACTIVE,
|
|
MENU_STRING, 0,
|
|
MENU_IMAGE, textsw_get_only_pr,
|
|
0);
|
|
} else {
|
|
/* Leave MENU_INACTIVE */
|
|
menu_set(menu_items[(int)TEXTSW_MENU_PUT_THEN_GET],
|
|
MENU_IMAGE, 0,
|
|
MENU_STRING, put_then_get,
|
|
0);
|
|
}
|
|
|
|
if (shelf_isnt_empty) {
|
|
menu_set(menu_items[(int)TEXTSW_MENU_PASTE],
|
|
MENU_ACTIVE, 0);
|
|
}
|
|
|
|
}
|
|
if (textsw->views->first_view->next != EV_NULL)
|
|
menu_set(menu_items[(int)TEXTSW_MENU_DESTROY_VIEW],
|
|
MENU_ACTIVE, 0);
|
|
current_view = view->e_view;
|
|
if (current_view != EV_NULL) {
|
|
if ((Ev_right_break)ev_get(current_view, EV_RIGHT_BREAK) ==
|
|
EV_CLIP) {
|
|
menu_set(menu_items[(int)TEXTSW_MENU_WRAP_LINES_AT_CHAR],
|
|
MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_WRAP_LINES_AT_WORD],
|
|
MENU_ACTIVE, 0);
|
|
} else if ((Ev_right_break)ev_get(current_view, EV_RIGHT_BREAK) ==
|
|
EV_WRAP_AT_CHAR) {
|
|
menu_set(menu_items[(int)TEXTSW_MENU_CLIP_LINES],
|
|
MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_WRAP_LINES_AT_WORD],
|
|
MENU_ACTIVE, 0);
|
|
} else {
|
|
menu_set(menu_items[(int)TEXTSW_MENU_CLIP_LINES],
|
|
MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_WRAP_LINES_AT_CHAR],
|
|
MENU_ACTIVE, 0);
|
|
}
|
|
if (primary_selection_exists) {
|
|
menu_set(menu_items[(int)TEXTSW_MENU_FIND],
|
|
MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_FIND_BACKWARD],
|
|
MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_MATCH_FIELD],
|
|
MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_NORMALIZE_LINE],
|
|
MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_COUNT_TO_LINE],
|
|
MENU_ACTIVE, 0);
|
|
}
|
|
if (shelf_isnt_empty) {
|
|
menu_set(menu_items[(int)TEXTSW_MENU_SHOW_CLIPBOARD],
|
|
MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_FIND_SHELF],
|
|
MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_FIND_SHELF_BACKWARD],
|
|
MENU_ACTIVE, 0);
|
|
}
|
|
|
|
/* should check if there is selection */
|
|
menu_set(menu_items[(int)TEXTSW_MENU_FIND_AND_REPLACE],
|
|
MENU_ACTIVE, 0);
|
|
|
|
menu_set(menu_items[(int)TEXTSW_MENU_SEL_ENCLOSE_FIELD],
|
|
MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_SEL_NEXT_FIELD], MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_SEL_PREV_FIELD], MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_SEL_MARK_TEXT], MENU_ACTIVE, 0);
|
|
|
|
menu_set(menu_items[(int)TEXTSW_MENU_SHOW_CLIPBOARD_FROM_EDIT],
|
|
MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_SHOW_CLIPBOARD_FROM_FIND],
|
|
MENU_ACTIVE, 0);
|
|
#ifdef _TEXTSW_FIND_RE
|
|
menu_set(menu_items[(int)TEXTSW_MENU_FIND_RE], MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_FIND_RE_BACKWARD], MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_FIND_TAG], MENU_ACTIVE, 0);
|
|
menu_set(menu_items[(int)TEXTSW_MENU_FIND_TAG_BACKWARD], MENU_ACTIVE,
|
|
0);
|
|
#endif
|
|
}
|
|
}
|
|
menu_show_using_fd(textsw->menu, view->window_fd, ie);
|
|
}
|
|
|
|
static int
|
|
textsw_do_menu_action(cmd_menu, cmd_item)
|
|
Menu cmd_menu;
|
|
Menu_item cmd_item;
|
|
{
|
|
extern void textsw_find_selection_and_normalize();
|
|
extern void textsw_reset();
|
|
pkg_private void textsw_move_caret();
|
|
extern int textsw_match_selection_and_normalize();
|
|
Textsw abstract = (Textsw)LINT_CAST(
|
|
menu_get(cmd_item, MENU_CLIENT_DATA, 0));
|
|
register Textsw_view view;
|
|
register Textsw_folio textsw;
|
|
Textsw_menu_cmd cmd = (Textsw_menu_cmd)
|
|
menu_get(cmd_item, MENU_VALUE, 0);
|
|
register Event *ie = (Event *)LINT_CAST(
|
|
menu_get(cmd_menu, MENU_FIRST_EVENT, 0) );
|
|
register int locx, locy;
|
|
Event event;
|
|
register long unsigned
|
|
find_options = 0;
|
|
Es_index first, last_plus_one;
|
|
char current_selection[200], err_msg[300];
|
|
|
|
if AN_ERROR(abstract == 0)
|
|
return;
|
|
|
|
view = VIEW_ABS_TO_REP(abstract);
|
|
textsw = FOLIO_FOR_VIEW(view);
|
|
|
|
if AN_ERROR(ie == 0) {
|
|
locx = locy = 0;
|
|
} else {
|
|
locx = ie->ie_locx;
|
|
locy = ie->ie_locy;
|
|
}
|
|
|
|
/* initialize arrays */
|
|
current_selection[0] = 0; err_msg[0] = 0;
|
|
|
|
switch (cmd) {
|
|
|
|
case TEXTSW_MENU_RESET:
|
|
textsw_empty_document(abstract, ie);
|
|
break;
|
|
|
|
case TEXTSW_MENU_LOAD:
|
|
textsw_load_file_as_menu(abstract, ie);
|
|
break;
|
|
|
|
case TEXTSW_MENU_SAVE_CLOSE:
|
|
textsw_notify(view, TEXTSW_ACTION_TOOL_CLOSE, 0);
|
|
/* Fall through */
|
|
case TEXTSW_MENU_SAVE:
|
|
if (cmd == TEXTSW_MENU_SAVE) {
|
|
Es_handle original;
|
|
|
|
original = (Es_handle)LINT_CAST(
|
|
es_get(textsw->views->esh, ES_PS_ORIGINAL) );
|
|
if ((TXTSW_IS_READ_ONLY(textsw)) ||
|
|
(original == ES_NULL) ||
|
|
(Es_enum)LINT_CAST(es_get(
|
|
original, ES_TYPE)) != ES_TYPE_FILE) {
|
|
Event alert_event;
|
|
|
|
(void) alert_prompt(
|
|
(Frame)window_get(WINDOW_FROM_VIEW(view), WIN_OWNER),
|
|
&alert_event,
|
|
ALERT_MESSAGE_STRINGS,
|
|
"Unable to Save Current File.",
|
|
"You are not currently editing a file.",
|
|
"Use \"Store as New File\" to save your work.",
|
|
0,
|
|
ALERT_BUTTON_YES, "Continue",
|
|
ALERT_TRIGGER, ACTION_STOP,
|
|
0);
|
|
break;
|
|
}
|
|
}
|
|
case TEXTSW_MENU_SAVE_QUIT:
|
|
case TEXTSW_MENU_SAVE_RESET: {
|
|
Es_status status;
|
|
status = (Es_status)textsw_save(VIEW_REP_TO_ABS(view), locx, locy);
|
|
if (status == ES_SUCCESS) {
|
|
if (cmd == TEXTSW_MENU_SAVE_QUIT) {
|
|
textsw_notify(
|
|
view, TEXTSW_ACTION_TOOL_DESTROY, (char *)ie, 0);
|
|
} else if (cmd == TEXTSW_MENU_SAVE_RESET) {
|
|
textsw_reset(abstract, locx, locy);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
case TEXTSW_MENU_STORE_CLOSE:
|
|
textsw_notify(view, TEXTSW_ACTION_TOOL_CLOSE, 0);
|
|
case TEXTSW_MENU_STORE:
|
|
case TEXTSW_MENU_STORE_QUIT: {
|
|
Es_status status;
|
|
status = textsw_store_to_selection(textsw, locx, locy);
|
|
if ((status == ES_SUCCESS) && (cmd == TEXTSW_MENU_STORE_QUIT)) {
|
|
textsw_notify(view, TEXTSW_ACTION_TOOL_DESTROY, (char *)ie, 0);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case TEXTSW_MENU_CREATE_VIEW: {
|
|
int result, my_x, my_y;
|
|
Rect *my_place;
|
|
Frame base_frame = (Frame)window_get(WINDOW_FROM_VIEW(view), WIN_OWNER);
|
|
|
|
if (!base_frame) {
|
|
(void)textsw_alert_for_old_interface(view);
|
|
return;
|
|
}
|
|
|
|
result = alert_prompt(base_frame, &event,
|
|
ALERT_NO_BEEPING, 1,
|
|
ALERT_NO_IMAGE, 1,
|
|
ALERT_MESSAGE_STRINGS,
|
|
"Move pointer to where new view should",
|
|
"begin, then click the left mouse button.",
|
|
" ",
|
|
"Otherwise, push \"Cancel Split View\".",
|
|
0,
|
|
ALERT_BUTTON_NO, "Cancel Split View",
|
|
ALERT_TRIGGER, MS_LEFT,
|
|
0);
|
|
if (result != ALERT_TRIGGERED) break;
|
|
|
|
my_place = (Rect *)window_get(WINDOW_FROM_VIEW(view), WIN_RECT);
|
|
my_x = (event.ie_locx - my_place->r_left);
|
|
my_y = (event.ie_locy - my_place->r_top - (2*TOOL_BORDERWIDTH));
|
|
(void) textsw_split_view(VIEW_REP_TO_ABS(view), my_x, my_y);
|
|
break;
|
|
}
|
|
|
|
case TEXTSW_MENU_DESTROY_VIEW: {
|
|
(void) textsw_destroy_split(VIEW_REP_TO_ABS(view),
|
|
locx, locy);
|
|
break;
|
|
}
|
|
|
|
case TEXTSW_MENU_CLIP_LINES:
|
|
textsw_set(VIEW_REP_TO_ABS(view),
|
|
TEXTSW_LINE_BREAK_ACTION, TEXTSW_CLIP,
|
|
0);
|
|
break;
|
|
|
|
case TEXTSW_MENU_WRAP_LINES_AT_CHAR:
|
|
textsw_set(VIEW_REP_TO_ABS(view),
|
|
TEXTSW_LINE_BREAK_ACTION, TEXTSW_WRAP_AT_CHAR,
|
|
0);
|
|
break;
|
|
|
|
case TEXTSW_MENU_WRAP_LINES_AT_WORD:
|
|
textsw_set(VIEW_REP_TO_ABS(view),
|
|
TEXTSW_LINE_BREAK_ACTION, TEXTSW_WRAP_AT_WORD,
|
|
0);
|
|
break;
|
|
|
|
case TEXTSW_MENU_NORMALIZE_INSERTION: {
|
|
extern Es_index ev_get_insert();
|
|
Es_index insert;
|
|
int upper_context;
|
|
insert = ev_get_insert(textsw->views);
|
|
if (insert != ES_INFINITY) {
|
|
upper_context = (int)LINT_CAST(
|
|
ev_get(textsw->views, EV_CHAIN_UPPER_CONTEXT) );
|
|
textsw_normalize_internal(view, insert, insert, upper_context, 0,
|
|
TXTSW_NI_DEFAULT);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case TEXTSW_MENU_NORMALIZE_BOTTOM: {
|
|
(void) textsw_move_caret(view, TXTSW_DOCUMENT_END);
|
|
break;
|
|
}
|
|
|
|
case TEXTSW_MENU_NORMALIZE_TOP: {
|
|
(void) textsw_move_caret(view, TXTSW_DOCUMENT_START);
|
|
break;
|
|
}
|
|
|
|
#ifdef TEXTSW_MENU_NORMALIZE_SELECTION
|
|
case TEXTSW_MENU_NORMALIZE_SELECTION: {
|
|
ev_get_selection(
|
|
textsw->views, &first, &last_plus_one, EV_SEL_PRIMARY);
|
|
if (first != ES_INFINITY) {
|
|
textsw_normalize_view(VIEW_REP_TO_ABS(view), first);
|
|
}
|
|
break;
|
|
}
|
|
#endif
|
|
case TEXTSW_MENU_NORMALIZE_LINE: {
|
|
Es_index prev;
|
|
char buf[10];
|
|
unsigned buf_fill_len;
|
|
int line_number;
|
|
|
|
line_number =
|
|
textsw_get_selection_as_int(textsw, EV_SEL_PRIMARY, 0);
|
|
if (line_number == 0)
|
|
goto Out_Of_Range;
|
|
else {
|
|
buf[0] = '\n'; buf_fill_len = 1;
|
|
if (line_number == 1) {
|
|
prev = 0;
|
|
} else {
|
|
ev_find_in_esh(textsw->views->esh, buf, buf_fill_len,
|
|
(Es_index)0, (u_int)line_number-1, 0, &first, &prev);
|
|
if (first == ES_CANNOT_SET)
|
|
goto Out_Of_Range;
|
|
}
|
|
ev_find_in_esh(textsw->views->esh, buf, buf_fill_len,
|
|
prev, 1, 0, &first, &last_plus_one);
|
|
if (first == ES_CANNOT_SET)
|
|
goto Out_Of_Range;
|
|
textsw_possibly_normalize_and_set_selection(
|
|
VIEW_REP_TO_ABS(view), prev, last_plus_one,
|
|
EV_SEL_PRIMARY);
|
|
(void) textsw_set_insert(textsw, last_plus_one);
|
|
}
|
|
Out_Of_Range:
|
|
break;
|
|
}
|
|
|
|
case TEXTSW_MENU_COUNT_TO_LINE: {
|
|
char msg[200];
|
|
int result, count;
|
|
|
|
ev_get_selection(
|
|
textsw->views, &first, &last_plus_one, EV_SEL_PRIMARY);
|
|
if (first >= last_plus_one)
|
|
break;
|
|
count = ev_newlines_in_esh(textsw->views->esh, 0, first);
|
|
(void) sprintf(msg, "Selection starts in line %d.", count+1);
|
|
result = alert_prompt(
|
|
(Frame)window_get(WINDOW_FROM_VIEW(view), WIN_OWNER),
|
|
&event,
|
|
ALERT_NO_BEEPING, 1,
|
|
ALERT_NO_IMAGE, 1,
|
|
ALERT_MESSAGE_STRINGS,
|
|
msg,
|
|
"Press \"Continue\" to proceed.",
|
|
0,
|
|
ALERT_BUTTON_YES, "Continue",
|
|
ALERT_TRIGGER, ACTION_STOP,
|
|
0);
|
|
break;
|
|
}
|
|
|
|
case TEXTSW_MENU_FILE_STUFF:{
|
|
textsw_file_stuff(view, locx, locy);
|
|
break;
|
|
}
|
|
|
|
case TEXTSW_MENU_CD: {
|
|
textsw_cd(textsw, locx, locy);
|
|
break;
|
|
}
|
|
|
|
case TEXTSW_MENU_FIND_BACKWARD:
|
|
find_options = TFSAN_BACKWARD;
|
|
/* Fall through */
|
|
case TEXTSW_MENU_FIND:
|
|
find_options |= (EV_SEL_PRIMARY | TFSAN_SHELF_ALSO);
|
|
textsw_find_selection_and_normalize(view, locx, locy, find_options);
|
|
break;
|
|
|
|
case TEXTSW_MENU_FIND_SHELF_BACKWARD:
|
|
find_options = TFSAN_BACKWARD;
|
|
/* Fall through */
|
|
case TEXTSW_MENU_FIND_SHELF:
|
|
find_options |= EV_SEL_SHELF;
|
|
textsw_find_selection_and_normalize(view, locx, locy, find_options);
|
|
break;
|
|
|
|
case TEXTSW_MENU_SEL_ENCLOSE_FIELD: {
|
|
int first, last_plus_one;
|
|
|
|
first = last_plus_one = ev_get_insert(textsw->views);
|
|
(void) textsw_match_field_and_normalize(view, &first, &last_plus_one, "<|", 2, TEXTSW_FIELD_ENCLOSE, FALSE);
|
|
break;
|
|
}
|
|
case TEXTSW_MENU_SEL_NEXT_FIELD:
|
|
(void) textsw_match_selection_and_normalize(view, "|>", TEXTSW_FIELD_FORWARD);
|
|
break;
|
|
|
|
case TEXTSW_MENU_SEL_PREV_FIELD:
|
|
(void) textsw_match_selection_and_normalize(view, "<|", TEXTSW_FIELD_BACKWARD);
|
|
break;
|
|
|
|
case TEXTSW_MENU_SEL_MARK_TEXT:
|
|
(void) textsw_create_match_frame(view);
|
|
break;
|
|
|
|
#ifdef _TEXTSW_FIND_RE
|
|
case TEXTSW_MENU_FIND_RE_BACKWARD:
|
|
find_options = TFSAN_BACKWARD;
|
|
/* Fall through */
|
|
case TEXTSW_MENU_FIND_RE:
|
|
find_options |= (EV_SEL_PRIMARY | TFSAN_REG_EXP | TFSAN_SHELF_ALSO);
|
|
textsw_find_selection_and_normalize(view, locx, locy, find_options);
|
|
break;
|
|
|
|
case TEXTSW_MENU_FIND_TAG_BACKWARD:
|
|
find_options = TFSAN_BACKWARD;
|
|
/* Fall through */
|
|
case TEXTSW_MENU_FIND_TAG:
|
|
find_options |=
|
|
(EV_SEL_PRIMARY | TFSAN_REG_EXP | TFSAN_SHELF_ALSO | TFSAN_TAG);
|
|
textsw_find_selection_and_normalize(view, locx, locy, find_options);
|
|
break;
|
|
#endif
|
|
|
|
case TEXTSW_MENU_PUT_THEN_GET:
|
|
textsw_put_then_get(view);
|
|
break;
|
|
|
|
case TEXTSW_MENU_FIND_AND_REPLACE:
|
|
(void) textsw_create_search_frame(view);
|
|
break;
|
|
|
|
case TEXTSW_MENU_MATCH_FIELD: {
|
|
char *start_marker;
|
|
(void) textsw_match_selection_and_normalize(view, start_marker, TEXTSW_NOT_A_FIELD);
|
|
break;
|
|
}
|
|
case TEXTSW_MENU_AGAIN:
|
|
textsw_again(view, locx, locy);
|
|
break;
|
|
|
|
case TEXTSW_MENU_UNDO:
|
|
textsw_undo(textsw);
|
|
break;
|
|
|
|
case TEXTSW_MENU_UNDO_ALL: {
|
|
int result;
|
|
|
|
if (textsw_has_been_modified(abstract)) {
|
|
result = alert_prompt(
|
|
(Frame)window_get(WINDOW_FROM_VIEW(view), WIN_OWNER),
|
|
&event,
|
|
ALERT_MESSAGE_STRINGS,
|
|
"Undo All Edits will discard unsaved edits.",
|
|
"Please confirm.",
|
|
0,
|
|
ALERT_BUTTON_YES, "Confirm, discard edits",
|
|
ALERT_BUTTON_NO, "Cancel",
|
|
ALERT_NO_BEEPING, 1,
|
|
0);
|
|
if (result == ALERT_YES) textsw_reset_2(abstract, locx, locy, TRUE, TRUE);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case TEXTSW_MENU_SHOW_CLIPBOARD_FROM_EDIT:
|
|
/* fall through */
|
|
|
|
case TEXTSW_MENU_SHOW_CLIPBOARD_FROM_FIND:
|
|
stuff_clipboard();
|
|
break;
|
|
|
|
case TEXTSW_MENU_CUT:
|
|
textsw_function_delete(view);
|
|
break;
|
|
|
|
case TEXTSW_MENU_COPY:
|
|
textsw_put(view);
|
|
break;
|
|
|
|
case TEXTSW_MENU_PASTE:
|
|
(void) textsw_function_get(view);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
pkg_private int
|
|
await_neg_event(windowfd, event)
|
|
int windowfd;
|
|
struct inputevent *event;
|
|
{
|
|
struct fullscreen *fsh;
|
|
struct inputevent new_event;
|
|
|
|
fsh = fullscreen_init(windowfd);
|
|
if (fsh == 0)
|
|
return(1);
|
|
FOREVER {
|
|
if AN_ERROR(input_readevent(windowfd, &new_event) == -1) {
|
|
break;
|
|
}
|
|
if (event_action(&new_event) == event_action(event)
|
|
&& win_inputnegevent(&new_event))
|
|
break;
|
|
}
|
|
fullscreen_destroy(fsh);
|
|
return(0);
|
|
}
|
|
|
|
/* ARGSUSED */
|
|
extern Textsw
|
|
textsw_split_view(abstract, locx, locy)
|
|
Textsw abstract;
|
|
int locx, locy; /* locx currently unused */
|
|
{
|
|
extern struct toolsw *tool_find_sw_with_client();
|
|
extern Textsw_view textsw_create_view();
|
|
extern caddr_t textsw_view_window_object();
|
|
register struct toolsw *toolsw;
|
|
struct rect new_to_split_rect,
|
|
new_view_rect;
|
|
int left_margin, right_margin, start_line;
|
|
register int to_split_ts_height, to_split_ts_width;
|
|
Es_index start_pos;
|
|
register Textsw_view new_view;
|
|
register Textsw_view to_split = VIEW_ABS_TO_REP(abstract);
|
|
Textsw_folio folio = FOLIO_FOR_VIEW(to_split);
|
|
|
|
/*
|
|
* Only split views that are large enough
|
|
*/
|
|
if ((locy < 0) || (to_split->rect.r_height < locy) ||
|
|
(textsw_screen_line_count(abstract) < 3)) {
|
|
return(TEXTSW_NULL);
|
|
}
|
|
win_getrect(to_split->window_fd, &new_to_split_rect);
|
|
new_view_rect.r_left = new_to_split_rect.r_left;
|
|
new_view_rect.r_width = new_to_split_rect.r_width;
|
|
new_view_rect.r_height = to_split->rect.r_height - locy;
|
|
if (new_view_rect.r_height < ei_line_height(folio->views->eih))
|
|
new_view_rect.r_height = ei_line_height(folio->views->eih);
|
|
new_view_rect.r_top =
|
|
rect_bottom(&new_to_split_rect) + 1 - new_view_rect.r_height;
|
|
/*
|
|
* start_line/pos must be determined BEFORE adjusting to_split.
|
|
*/
|
|
start_line = ev_line_for_y(to_split->e_view,
|
|
new_view_rect.r_top -
|
|
new_to_split_rect.r_top);
|
|
start_pos = ev_index_for_line(to_split->e_view, start_line);
|
|
if (start_pos == ES_INFINITY) {
|
|
start_pos = ev_index_for_line(to_split->e_view, 0);
|
|
}
|
|
new_to_split_rect.r_height -=
|
|
new_view_rect.r_height + TOOL_SUBWINDOWSPACING;
|
|
win_setrect(to_split->window_fd, &new_to_split_rect);
|
|
toolsw = tool_find_sw_with_client((Tool *)LINT_CAST(folio->tool),
|
|
(caddr_t)LINT_CAST(to_split));
|
|
if (toolsw) {
|
|
to_split_ts_height = toolsw->ts_height;
|
|
to_split_ts_width = toolsw->ts_width;
|
|
toolsw->ts_height = new_to_split_rect.r_height;
|
|
}
|
|
left_margin = (int)ev_get(to_split->e_view, EV_LEFT_MARGIN);
|
|
right_margin = (int)ev_get(to_split->e_view, EV_RIGHT_MARGIN);
|
|
new_view = textsw_create_view(folio, new_view_rect,
|
|
left_margin, right_margin);
|
|
if (to_split_ts_height == TOOL_SWEXTENDTOEDGE ||
|
|
to_split_ts_width == TOOL_SWEXTENDTOEDGE) {
|
|
toolsw = tool_find_sw_with_client((Tool *)LINT_CAST(folio->tool),
|
|
(caddr_t)LINT_CAST(new_view));
|
|
if (toolsw) {
|
|
if (to_split_ts_height == TOOL_SWEXTENDTOEDGE)
|
|
toolsw->ts_height = TOOL_SWEXTENDTOEDGE;
|
|
if (to_split_ts_width == TOOL_SWEXTENDTOEDGE)
|
|
toolsw->ts_width = TOOL_SWEXTENDTOEDGE;
|
|
}
|
|
}
|
|
if (SCROLLBAR_FOR_VIEW(to_split)) {
|
|
extern void textsw_add_scrollbar_to_view();
|
|
|
|
textsw_add_scrollbar_to_view(new_view, TEXTSW_DEFAULT_SCROLLBAR);
|
|
}
|
|
(void) ev_set(new_view->e_view, EV_SAME_AS, to_split->e_view, 0);
|
|
|
|
/*
|
|
* Although this call to ev_set_start will cause an unnecessary
|
|
* display of the newly created view, but it is necessary
|
|
* to update the line table of the new view.
|
|
*/
|
|
ev_set_start(new_view->e_view, start_pos);
|
|
|
|
window_create((Window)LINT_CAST(window_get(WINDOW_FROM_VIEW(to_split),
|
|
WIN_OWNER)),
|
|
textsw_view_window_object, WIN_COMPATIBILITY,
|
|
WIN_OBJECT, new_view,
|
|
0);
|
|
/* BUG ALERT - why isn't the system doing this for us? */
|
|
if (win_fdtonumber(to_split->window_fd)
|
|
== win_get_kbd_focus(to_split->window_fd)
|
|
&& folio->tool != 0)
|
|
tool_displaytoolonly(TOOL_FROM_FOLIO(folio));
|
|
if (folio->notify_level & TEXTSW_NOTIFY_SPLIT_VIEW)
|
|
textsw_notify(to_split, TEXTSW_ACTION_SPLIT_VIEW, new_view, 0);
|
|
ASSERT(allock());
|
|
return(VIEW_REP_TO_ABS(new_view));
|
|
}
|
|
|
|
static Textsw_view
|
|
textsw_adjacent_view(view, coalesced_rect)
|
|
register Textsw_view view;
|
|
register Rect *coalesced_rect;
|
|
{
|
|
Textsw_folio folio = FOLIO_FOR_VIEW(view);
|
|
Textsw_view above = (Textsw_view)0;
|
|
Textsw_view under = (Textsw_view)0;
|
|
register Textsw_view other;
|
|
Rect view_rect, other_rect;
|
|
|
|
win_getrect(WIN_FD_FOR_VIEW(view), &view_rect);
|
|
FORALL_TEXT_VIEWS(folio, other) {
|
|
if (view == other)
|
|
continue;
|
|
win_getrect(WIN_FD_FOR_VIEW(other), &other_rect);
|
|
if ((view_rect.r_left == other_rect.r_left) &&
|
|
(view_rect.r_width == other_rect.r_width)) {
|
|
/* Possible vertical split */
|
|
if ((rect_bottom(&view_rect) + 1 +
|
|
TOOL_SUBWINDOWSPACING)
|
|
== other_rect.r_top) {
|
|
under = other;
|
|
*coalesced_rect = view_rect;
|
|
coalesced_rect->r_height =
|
|
rect_bottom(&other_rect) + 1 - coalesced_rect->r_top;
|
|
} else if ((rect_bottom(&other_rect) + 1 +
|
|
TOOL_SUBWINDOWSPACING)
|
|
== view_rect.r_top) {
|
|
above = other;
|
|
*coalesced_rect = other_rect;
|
|
coalesced_rect->r_height =
|
|
rect_bottom(&view_rect) + 1 - coalesced_rect->r_top;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return((above) ? above : under);
|
|
}
|
|
|
|
static Textsw_view
|
|
textsw_wrapped_adjacent_view(view, rect)
|
|
register Textsw_view view;
|
|
register Rect *rect;
|
|
{
|
|
Textsw_view upper_view;
|
|
Textsw_view coalesce_with = 0;
|
|
|
|
coalesce_with = textsw_adjacent_view(view, rect);
|
|
if (coalesce_with) {
|
|
if ((int)window_get(WINDOW_FROM_VIEW(view), WIN_Y)
|
|
< (int)window_get(WINDOW_FROM_VIEW(coalesce_with), WIN_Y)) {
|
|
upper_view = view;
|
|
} else {
|
|
upper_view = coalesce_with;
|
|
}
|
|
rect->r_top = (int)LINT_CAST(window_get(WINDOW_FROM_VIEW(upper_view),
|
|
WIN_Y));
|
|
rect->r_left = (int)LINT_CAST(window_get(WINDOW_FROM_VIEW(upper_view),
|
|
WIN_X));
|
|
} else {
|
|
win_getrect((int)window_get(WINDOW_FROM_VIEW(view), WIN_FD), rect);
|
|
}
|
|
return (coalesce_with);
|
|
}
|
|
|
|
static Notify_value
|
|
textsw_menu_destroy_view(abstract, status)
|
|
Textsw abstract;
|
|
Destroy_status status;
|
|
{
|
|
register Textsw_view view = VIEW_ABS_TO_REP(abstract);
|
|
register Textsw_folio folio = FOLIO_FOR_VIEW(view);
|
|
Rect rect;
|
|
int win_show;
|
|
int had_kbd_focus;
|
|
Notify_value nv;
|
|
int height, width;
|
|
|
|
if (status != DESTROY_CLEANUP) {
|
|
return (notify_next_destroy_func((Notify_client)abstract, status));
|
|
}
|
|
|
|
/*--------------------------------------------------------------------
|
|
If the folio has any pop-up frame associated with it, see if that
|
|
frame was created from the view we are about to destroy.
|
|
You can tell by checking whether its WIN_CLIENT_DATA field contains
|
|
a pointer to the view in question.
|
|
Any such pop-up should be destroyed along with the view that owns it.
|
|
---------------------------------------------------------------------*/
|
|
if((folio->search_frame != NULL) &&
|
|
(view == (Textsw_view) window_get(folio->search_frame, WIN_CLIENT_DATA))
|
|
)
|
|
{
|
|
/*-------------------------------------------------------------------
|
|
search_frame is a global that represents the frame that the user
|
|
can bring up to "find" operations on the text. If the view which
|
|
owns it is destroyed it must also be destroyed and set NULL.
|
|
-------------------------------------------------------------------*/
|
|
extern Frame search_frame;
|
|
|
|
window_set(folio->search_frame, FRAME_NO_CONFIRM, TRUE, 0);
|
|
window_destroy(folio->search_frame);
|
|
search_frame = folio->search_frame = NULL;
|
|
}
|
|
|
|
/* Look to see if we can coalesce with one of our own views. */
|
|
folio->coalesce_with = textsw_wrapped_adjacent_view(view, &rect);
|
|
textsw_get_extend_to_edge(view, &height, &width);
|
|
|
|
win_show = (int)LINT_CAST(window_get(WINDOW_FROM_VIEW(view), WIN_SHOW));
|
|
had_kbd_focus = (int)LINT_CAST(window_get(WINDOW_FROM_VIEW(view),
|
|
WIN_KBD_FOCUS));
|
|
|
|
/* Unlink view from everywhere and remove its storage */
|
|
nv = notify_next_destroy_func((Notify_client)abstract, status);
|
|
|
|
if (folio->coalesce_with) {
|
|
if ((int)LINT_CAST(window_get(WINDOW_FROM_VIEW(folio->coalesce_with),
|
|
WIN_SHOW)) && !win_show) {
|
|
window_set(WINDOW_FROM_VIEW(folio->coalesce_with),
|
|
WIN_SHOW, win_show, 0);
|
|
} else {
|
|
if (had_kbd_focus) {
|
|
window_set(folio->coalesce_with, WIN_KBD_FOCUS, TRUE, 0);
|
|
}
|
|
}
|
|
window_set(WINDOW_FROM_VIEW(folio->coalesce_with),
|
|
WIN_RECT, &rect, 0);
|
|
textsw_set_extend_to_edge(folio->coalesce_with, height, width);
|
|
|
|
if (win_fdtonumber(folio->coalesce_with->window_fd)
|
|
== win_get_kbd_focus(folio->coalesce_with->window_fd)) {
|
|
tool_displaytoolonly(TOOL_FROM_FOLIO(folio));
|
|
}
|
|
} else if (folio->tool) {
|
|
tool_expand_neighbors(TOOL_FROM_FOLIO(folio), TOOLSW_NULL, &rect);
|
|
}
|
|
folio->coalesce_with = 0;
|
|
return (nv);
|
|
}
|
|
|
|
static Notify_value
|
|
textsw_menu_destroy_first(abstract, status)
|
|
Textsw abstract;
|
|
Destroy_status status;
|
|
{
|
|
register Textsw_view tagged_view = VIEW_ABS_TO_REP(abstract);
|
|
register Textsw_view first_view;
|
|
register Textsw_folio folio = FOLIO_FOR_VIEW(tagged_view);
|
|
Rect rect;
|
|
Rect empty_rect;
|
|
Es_index tagged_view_first = ES_CANNOT_SET;
|
|
int win_show;
|
|
int had_kbd_focus;
|
|
Notify_value nv;
|
|
int height, width;
|
|
|
|
if (status != DESTROY_CLEANUP) {
|
|
return (notify_next_destroy_func((Notify_client)abstract, status));
|
|
}
|
|
first_view = folio->first_view;
|
|
/* Look to see if we can coalesce with one of our own views. */
|
|
folio->coalesce_with = textsw_wrapped_adjacent_view(first_view, &rect);
|
|
|
|
if (folio->coalesce_with) {
|
|
/* ASSERT(folio->coalesce_with == tagged_view); */
|
|
|
|
/*
|
|
* At this point folio->coalesce_with should point to the first view.
|
|
* tagged_view is pointing to the view going to be destroyed.
|
|
*/
|
|
|
|
textsw_get_extend_to_edge(folio->coalesce_with, &height, &width);
|
|
folio->coalesce_with = first_view;
|
|
} else {
|
|
empty_rect = rect;
|
|
rect = *((Rect *)LINT_CAST(window_get(WINDOW_FROM_VIEW(tagged_view),
|
|
WIN_RECT)));
|
|
textsw_get_extend_to_edge(tagged_view, &height, &width);
|
|
}
|
|
win_show = (int)LINT_CAST(window_get(WINDOW_FROM_VIEW(tagged_view),
|
|
WIN_SHOW));
|
|
had_kbd_focus = (int)LINT_CAST(window_get(WINDOW_FROM_VIEW(tagged_view),
|
|
WIN_KBD_FOCUS));
|
|
tagged_view_first
|
|
= (Es_index)textsw_get(abstract, TEXTSW_FIRST);
|
|
if (tagged_view_first == (Es_index)LINT_CAST(textsw_get(
|
|
VIEW_REP_TO_ABS(first_view), TEXTSW_FIRST))) {
|
|
tagged_view_first = ES_CANNOT_SET;
|
|
}
|
|
|
|
/* Unlink view from everywhere and remove its storage */
|
|
nv = notify_next_destroy_func((Notify_client)abstract, status);
|
|
|
|
if ((int)LINT_CAST(window_get(WINDOW_FROM_VIEW(first_view), WIN_SHOW)) &&
|
|
!win_show) {
|
|
window_set(WINDOW_FROM_VIEW(first_view), WIN_SHOW, win_show, 0);
|
|
} else {
|
|
if (had_kbd_focus) {
|
|
window_set(first_view, WIN_KBD_FOCUS, TRUE, 0);
|
|
}
|
|
}
|
|
if (tagged_view_first != ES_CANNOT_SET) {
|
|
textsw_set(VIEW_REP_TO_ABS(first_view),
|
|
TEXTSW_FIRST, tagged_view_first, 0);
|
|
}
|
|
window_set(WINDOW_FROM_VIEW(first_view), WIN_RECT, &rect, 0);
|
|
textsw_set_extend_to_edge(first_view, height, width);
|
|
|
|
if (win_fdtonumber(first_view->window_fd)
|
|
== win_get_kbd_focus(first_view->window_fd)) {
|
|
tool_displaytoolonly(TOOL_FROM_FOLIO(folio));
|
|
}
|
|
if (folio->coalesce_with) {
|
|
folio->coalesce_with = 0;
|
|
} else {
|
|
tool_expand_neighbors(TOOL_FROM_FOLIO(folio), TOOLSW_NULL,&empty_rect);
|
|
}
|
|
return (nv);
|
|
}
|
|
|
|
/* ARGSUSED */
|
|
extern void
|
|
textsw_destroy_split(abstract, locx, locy)
|
|
Textsw abstract;
|
|
int locx, locy; /* Currently unused */
|
|
{
|
|
register Textsw_view designated_view = VIEW_ABS_TO_REP(abstract);
|
|
register Textsw_view tagged_view;
|
|
Textsw_view adjacent_view;
|
|
register Textsw_folio folio = FOLIO_FOR_VIEW(designated_view);
|
|
Rect rect;
|
|
|
|
if (folio->first_view == designated_view) {
|
|
if (!designated_view->next)
|
|
return;
|
|
adjacent_view = textsw_adjacent_view(designated_view, &rect);
|
|
if (adjacent_view) {
|
|
tagged_view = adjacent_view;
|
|
} else {
|
|
tagged_view = designated_view->next;
|
|
}
|
|
notify_interpose_destroy_func(
|
|
(Notify_client)tagged_view, textsw_menu_destroy_first);
|
|
} else {
|
|
tagged_view = designated_view;
|
|
notify_interpose_destroy_func(
|
|
(Notify_client)tagged_view, textsw_menu_destroy_view);
|
|
}
|
|
window_destroy(WINDOW_FROM_VIEW(tagged_view));
|
|
}
|
|
|
|
pkg_private void
|
|
textsw_set_extend_to_edge(view, height, width)
|
|
Textsw_view view;
|
|
int height, width;
|
|
|
|
{
|
|
Textsw_folio folio;
|
|
register struct toolsw *toolsw;
|
|
|
|
if (view) {
|
|
folio = FOLIO_FOR_VIEW(view);
|
|
|
|
toolsw = tool_find_sw_with_client((Tool *)LINT_CAST(folio->tool),
|
|
(caddr_t)LINT_CAST(view));
|
|
|
|
if (toolsw) {
|
|
if (height == TOOL_SWEXTENDTOEDGE)
|
|
toolsw->ts_height = TOOL_SWEXTENDTOEDGE;
|
|
if (width == TOOL_SWEXTENDTOEDGE)
|
|
toolsw->ts_width = TOOL_SWEXTENDTOEDGE;
|
|
}
|
|
}
|
|
}
|
|
|
|
pkg_private void
|
|
textsw_get_extend_to_edge(view, height, width)
|
|
Textsw_view view;
|
|
int *height, *width;
|
|
|
|
{
|
|
Textsw_folio folio;
|
|
register struct toolsw *toolsw;
|
|
|
|
*height = 0;
|
|
*width = 0;
|
|
|
|
if (view) {
|
|
folio = FOLIO_FOR_VIEW(view);
|
|
toolsw = tool_find_sw_with_client((Tool *)LINT_CAST(folio->tool),
|
|
(caddr_t)LINT_CAST(view));
|
|
if (toolsw) {
|
|
*height = toolsw->ts_height;
|
|
*width = toolsw->ts_width;
|
|
}
|
|
}
|
|
}
|
|
|
|
pkg_private void
|
|
textsw_alert_for_old_interface(view)
|
|
{
|
|
Event event;
|
|
|
|
(void) alert_prompt(NULL,
|
|
&event,
|
|
ALERT_MESSAGE_STRINGS,
|
|
"This feature is not available,",
|
|
"due to the fact this text subwindow is created with",
|
|
"pre SunView tool interface. In order to utilize",
|
|
"the full text subwindow features, please upgrade the application.",
|
|
0,
|
|
ALERT_BUTTON_YES, "Continue",
|
|
ALERT_TRIGGER, ACTION_STOP,
|
|
0);
|
|
}
|