⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtkedit.c

📁 具有IDE功能的编辑器
💻 C
📖 第 1 页 / 共 3 页
字号:
    return def;}void gtk_edit_dialog_message (guchar * heading, char *fmt,...){    gchar s[8192];    va_list ap;    va_start (ap, fmt);    vsprintf (s, fmt, ap);    va_end (ap);    gtk_dialog_cauldron (			    heading, GTK_CAULDRON_TOPLEVEL | GTK_CAULDRON_GRAB,			    " [ ( %Ld )xf ]xf / ( %Bxfgq )f ",			    s,			    GNOME_STOCK_BUTTON_CANCEL	);    return;}int gtk_edit_dialog_query (guchar * heading, guchar * first,...){    char *buttons[16];    char s[1024], *r;    int n;    va_list ap;    va_start (ap, first);    n = 0;    while ((buttons[n++] = va_arg (ap, char *)) && n < 15);    va_end (ap);    buttons[n] = 0;    strcpy (s, " [ ( %Lxf )xf ]xf / ( ");    n = 0;    while (buttons[n]) {	strcat (s, " %Bqxf ");	if (!buttons[n])	    break;	strcat (s, " ||");	n++;    }    strcat (s, " )f");    r = gtk_dialog_cauldron (heading, GTK_CAULDRON_TOPLEVEL | GTK_CAULDRON_IGNOREENTER | GTK_CAULDRON_GRAB, s, first,			  buttons[0], buttons[1], buttons[2], buttons[3],			  buttons[4], buttons[5], buttons[6], buttons[7],			buttons[8], buttons[9], buttons[10], buttons[11],		      buttons[12], buttons[13], buttons[14], buttons[15]	);    n = 0;    if (r == GTK_CAULDRON_ESCAPE || !r || r == GNOME_STOCK_BUTTON_CANCEL)	return -1;    while (buttons[n]) {	if (!strcmp (buttons[n], r))	    return n;	n++;    }    return -1;}void gtk_edit_dialog_error (guchar * heading, char *fmt, ...){    gchar s[8192];    va_list ap;    va_start (ap, fmt);    vsprintf (s, fmt, ap);    va_end (ap);    gtk_dialog_cauldron (			    heading, GTK_CAULDRON_TOPLEVEL | GTK_CAULDRON_GRAB,			    " [ ( %Ld )xf ]xf / ( %Bxfgq )f",			    s,			    GNOME_STOCK_BUTTON_CANCEL	);    return;}struct color_matrix_struct {    unsigned int R, G, B;} color_matrix[27] ={    {0, 0, 0},    {0, 0, 128},    {0, 0, 255},    {0, 139, 0},    {0, 139, 139},    {0, 154, 205},    {0, 255, 0},    {0, 250, 154},    {0, 255, 255},    {139, 37, 0},    {139, 0, 139},    {125, 38, 205},    {139, 117, 0},    {127, 127, 127},    {123, 104, 238},    {127, 255, 0},    {135, 206, 235},    {127, 255, 212},    {238, 0, 0},    {238, 18, 137},    {238, 0, 238},    {205, 102, 0},    {248, 183, 183},    {224, 102, 255},    {238, 238, 0},    {238, 230, 133},    {248, 248, 255}};void gtk_edit_alloc_colors (GtkEdit *edit, GdkColormap *colormap){    int i;    for (i = 0; i < 27; i++) {	edit->color[i].red = (gushort) color_matrix[i].R << 8;	edit->color[i].green = (gushort) color_matrix[i].G << 8;	edit->color[i].blue = (gushort) color_matrix[i].B << 8;	if (!gdk_color_alloc (colormap, &edit->color[i]))	    g_warning ("cannot allocate color");    }    edit->color_last_pixel = 27;}int allocate_color (WEdit *edit, gchar *color){    GtkEdit *win;    win = (GtkEdit *) edit->widget;    if (!color)	return NO_COLOR;    if (*color >= '0' && *color <= '9') {	return atoi (color);    } else {	int i;	GdkColor c;	if (!color)	    return NO_COLOR;	if (!gdk_color_parse (color, &c))	    return NO_COLOR;	if (!gdk_color_alloc (gtk_widget_get_colormap(GTK_WIDGET (edit->widget)), &c))	    return NO_COLOR;	for (i = 0; i < (GTK_EDIT (edit->widget))->color_last_pixel; i++)	    if (color_palette (i) == c.pixel)		return i;	GTK_EDIT (edit->widget)->color[(GTK_EDIT (edit->widget))->color_last_pixel].pixel = c.pixel;	return (GTK_EDIT (edit->widget))->color_last_pixel++;    }}static void gtk_edit_set_position (GtkEditable * editable, gint position){    WEdit *edit;    edit = GTK_EDIT(editable)->editor;    edit_cursor_move (edit, position - edit->curs1);    edit_move_to_prev_col (edit, 0);    edit->force |= REDRAW_PAGE;    edit->search_start = 0;    edit_update_curs_row (edit);}/* returns 1 on error */gint gtk_edit_load_file_from_filename (GtkWidget * edit, const gchar * filename){    return edit_load_file_from_filename (GTK_EDIT (edit)->editor, (char *) filename);}void gtk_edit_set_top_line (GtkWidget * e, int line){    WEdit *edit;    edit = GTK_EDIT (e)->editor;    edit_move_display (edit, line - edit->num_widget_lines / 2 - 1);    edit->force |= REDRAW_COMPLETELY;}void gtk_edit_set_cursor_line (GtkWidget * e, int line){    WEdit *edit;    edit = GTK_EDIT (e)->editor;    edit_move_to_line (edit, line - 1);    edit->force |= REDRAW_COMPLETELY;}void about_cb (GtkWidget * widget, void *data){    gtk_dialog_cauldron ("About", GTK_CAULDRON_TOPLEVEL | GTK_CAULDRON_GRAB, " [ (Mcedit - an editor for the midnight commander\n\ported from Cooledit - a user friendly text editor for the X Window System.)xf ]xf / ( %Bgqxf )f ", GNOME_STOCK_BUTTON_OK);    return;}void gtk_edit_command (GtkEdit * edit, gint command){    int r;    gtk_widget_grab_focus (GTK_WIDGET (edit));    r = edit_execute_key_command (edit->editor, command, -1);    if (r)	edit_update_screen (edit->editor);}void gtk_edit_quit (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Exit); }void gtk_edit_load_file (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Load); }void gtk_edit_new_file (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_New); }void gtk_edit_save_file (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Save); }void gtk_edit_save_as_file (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Save_As); }void gtk_edit_insert_file (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Insert_File); }void gtk_edit_copy_to_file (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Save_Block); }void gtk_edit_clip_cut (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_XCut); }void gtk_edit_clip_copy (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_XStore); }void gtk_edit_clip_paste (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_XPaste); }void gtk_edit_toggle_mark (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Mark); }void gtk_edit_search (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Find); }void gtk_edit_search_again (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Find_Again); }void gtk_edit_replace (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Replace); }void gtk_edit_copy (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Copy); }void gtk_edit_move (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Move); }void gtk_edit_delete (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Remove); }void gtk_edit_undo (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Undo); }#if 0struct _GnomeUIInfo {    GnomeUIInfoType type;    gchar *label;    gchar *hint;		/* For toolbar items, the tooltip. For menu items, the status bar message */    /* For an item, toggleitem, or radioitem, procedure to call when activated.           For a subtree, point to the GnomeUIInfo array for that subtree.       For a radioitem lead entry, point to the GnomeUIInfo array for       the radio item group.  For the radioitem array, procedure to       call when activated. For a help item, specifies the help node to load       (or NULL for main prog's name)        For builder data, point to the GnomeUIBuilderData structure for the following items */    gpointer moreinfo;    gpointer user_data;    gpointer unused_data;    GnomeUIPixmapType pixmap_type;    /* Either      * a pointer to the char for the pixmap (GNOME_APP_PIXMAP_DATA),     * a char* for the filename (GNOME_APP_PIXMAP_FILENAME),     * or a char* for the stock pixmap name (GNOME_APP_PIXMAP_STOCK).     */    gpointer pixmap_info;    guint accelerator_key;	/* Accelerator key... Set to 0 to ignore */    GdkModifierType ac_mods;	/* An OR of the masks for the accelerator */    GtkWidget *widget;		/* Filled in by gnome_app_create* */};#endiftypedef struct _TbItems TbItems;struct _TbItems {	char *key, *text, *tooltip, *icon;	void (*cb) (GtkEdit *, void *);	GtkWidget *widget; /* will be filled in */};#define TB_PROP 7static TbItems tb_items[] ={    {"F1", "Help", "Interactive help browser", GNOME_STOCK_MENU_BLANK, 0, NULL},    {"F2", "Save", "Save to current file name", GNOME_STOCK_MENU_SAVE, gtk_edit_save_file, NULL},    {"F3", "Mark", "Toggle In/Off invisible marker to highlight text", GNOME_STOCK_MENU_BLANK, gtk_edit_toggle_mark, NULL},    {"F4", "Replc", "Find and replace strings/regular expressions", GNOME_STOCK_MENU_SRCHRPL, gtk_edit_replace, NULL},    {"F5", "Copy", "Copy highlighted block to cursor postition", GNOME_STOCK_MENU_COPY, gtk_edit_copy, NULL},    {"F6", "Move", "Copy highlighted block to cursor postition", GNOME_STOCK_MENU_BLANK, gtk_edit_move, NULL},    {"F7", "Find", "Find strings/regular expressions", GNOME_STOCK_MENU_SEARCH, gtk_edit_search, NULL},    {"F8", "Dlete", "Delete highlighted text", GNOME_STOCK_MENU_BLANK, gtk_edit_delete, NULL},    {"F9", "Menu", "Pull down menu", GNOME_STOCK_MENU_BLANK, /* gtk_edit_menu*/ 0, NULL},    {"F10", "Quit", "Exit editor", GNOME_STOCK_MENU_QUIT, gtk_edit_quit, NULL},    {0, 0, 0, 0, 0, 0}};static GtkWidget *create_toolbar (GtkWidget * window, GtkEdit * edit){    GtkWidget *toolbar;    TbItems *t;    toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_BOTH);    for (t = &tb_items[0]; t->text; t++) {	t->widget = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),					     t->text,					     t->tooltip,					     0,			     gnome_stock_pixmap_widget (window, t->icon),					     t->cb,					     t->cb ? edit : 0);    }    return toolbar;}/* returns 1 on error */int edit (const char *file, int line){    GtkWidget *app;    GtkWidget *edit, *statusbar;    edit = gtk_edit_new (NULL, NULL);    app = gnome_app_new ("mcedit", (char *) (file ? file : "Mcedit"));    {	GnomeUIInfo file_menu[] =	{	    {		GNOME_APP_UI_ITEM, N_ ("Open/Load"), N_ ("Load a different/new file"), gtk_edit_load_file, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_OPEN, 'O', GDK_CONTROL_MASK, 0	    },	    {		GNOME_APP_UI_ITEM, N_ ("New"), N_ ("Clear the edit buffer"), gtk_edit_new_file, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_NEW, 'N', GDK_CONTROL_MASK, 0	    },	    GNOMEUIINFO_SEPARATOR,	    {		GNOME_APP_UI_ITEM, N_ ("Save"), N_ ("Save the current edit buffer to filename"), gtk_edit_save_file, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_SAVE, 'S', GDK_CONTROL_MASK, 0	    },	    {		GNOME_APP_UI_ITEM, N_ ("Save As"), N_ ("Save the current edit buffer as filename"), gtk_edit_save_as_file, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_SAVE_AS, 'A', GDK_CONTROL_MASK, 0	    },	    GNOMEUIINFO_SEPARATOR,	    {		GNOME_APP_UI_ITEM, N_ ("Insert File"), N_ ("Insert text from a file"), gtk_edit_insert_file, edit, 0, 0, 0, 'I', GDK_CONTROL_MASK, 0	    },	    {		GNOME_APP_UI_ITEM, N_ ("Copy to file"), N_ ("copy a block to a file"), gtk_edit_copy_to_file, edit, 0, 0, 0, 'C', GDK_CONTROL_MASK, 0	    },	    GNOMEUIINFO_SEPARATOR,	    {		GNOME_APP_UI_ITEM, N_ ("Exit"), N_ ("Quit editor"), gtk_edit_quit, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_QUIT, 'Q', GDK_CONTROL_MASK, NULL	    },	    GNOMEUIINFO_END	};	GnomeUIInfo edit_menu[] =	{	    {		GNOME_APP_UI_ITEM, N_ ("Copy"), N_ ("Copy selection to clipboard"), gtk_edit_clip_copy, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_COPY, 'C', GDK_CONTROL_MASK, 0	    },	    {		GNOME_APP_UI_ITEM, N_ ("Cut"), N_ ("Cut selection to clipboard"), gtk_edit_clip_cut, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_CUT, 'X', GDK_CONTROL_MASK, 0	    },	    {		GNOME_APP_UI_ITEM, N_ ("Paste"), N_ ("Paste clipboard"), gtk_edit_clip_paste, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PASTE, 'V', GDK_CONTROL_MASK, 0	    },	    GNOMEUIINFO_SEPARATOR,	    {		GNOME_APP_UI_ITEM, N_ ("Undo"), N_ ("Go back in time one key press"), gtk_edit_undo, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PASTE, 'U', GDK_CONTROL_MASK, 0	    },	    GNOMEUIINFO_END	};	GnomeUIInfo search_menu[] =	{	    {		GNOME_APP_UI_ITEM, N_ ("Find"), N_ ("Find string/regular expression"), gtk_edit_search, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_OPEN, 'F', GDK_MOD1_MASK, 0	    },	    {		GNOME_APP_UI_ITEM, N_ ("Find again"), N_ ("Repeat most recent search"), gtk_edit_search_again, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_NEW, 'A', GDK_MOD1_MASK, 0	    },	    {		GNOME_APP_UI_ITEM, N_ ("Search/Replace"), N_ ("Find and replace text/regular expressions"), gtk_edit_replace, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_SAVE, 'R', GDK_MOD1_MASK, 0	    },	    GNOMEUIINFO_END	};	GnomeUIInfo help_menu[] =	{	    {		GNOME_APP_UI_ITEM,		N_ ("About..."), N_ ("Info about GNOME hello"),		about_cb, NULL, NULL,		GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_ABOUT,		0, (GdkModifierType) 0, NULL	    },#if 0	    GNOMEUIINFO_SEPARATOR,	    GNOMEUIINFO_HELP ("hello"),#endif	    GNOMEUIINFO_END	};	GnomeUIInfo main_menu[] =	{	    GNOMEUIINFO_SUBTREE (N_ ("File"), file_menu),	    GNOMEUIINFO_SUBTREE (N_ ("Edit"), edit_menu),	    GNOMEUIINFO_SUBTREE (N_ ("Search/Replace"), search_menu),	    GNOMEUIINFO_SUBTREE (N_ ("Help"), help_menu),	    GNOMEUIINFO_END	};	gtk_widget_realize (app);	statusbar = gtk_label_new (file ? file : "<no-filename>");	gtk_widget_set_usize (app, 400, 400);	gnome_app_create_menus (GNOME_APP (app), main_menu);	gnome_app_set_contents (GNOME_APP (app), edit);	gnome_app_set_statusbar (GNOME_APP (app), GTK_WIDGET (statusbar));	GTK_EDIT (edit)->menubar = GNOME_APP (app)->menubar;	GTK_EDIT (edit)->status = statusbar;	gnome_app_set_toolbar(GNOME_APP (app), GTK_TOOLBAR(create_toolbar(app, GTK_EDIT (edit))));	GTK_EDIT(edit)->destroy_me = gtk_widget_destroy;	GTK_EDIT(edit)->destroy_me_user_data = app;	gtk_widget_show (edit);	gtk_widget_realize (edit);	if (file)	    if (*file)		if (gtk_edit_load_file_from_filename (edit, file)) {		    gtk_widget_destroy (app);		    return 1;		}	gtk_edit_set_cursor_line (edit, line);	gtk_widget_show (app);	gtk_widget_grab_focus (edit);    }    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -