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

📄 search.c

📁 使用mgui写的类似xwindow下的编辑器程序
💻 C
字号:
/*
 * This file is part of the M-Edit program (Copyright 1996 by Vincenzo Morello)
 * Permission to use is hereby granted for any purpose.
 *
 * Contains search and replace callbacks.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "mgui.h"
#include "medit.h"
#include "me.h"

extern void AddUndoData(FILE_DATA * pfd,
			char *oldtext, int start, int oldlen,
			char *newtext, int newlen);

void 
CancelCB(MOBJECT p, void *od, void *ad)
{
    MShellDestroy(p);
}

void 
GoToLineCB(MOBJECT p, void *od, void *ud)
{
    MOBJECT shell = (MOBJECT) ud;
    FILE_DATA *pfd = MObjectGetUserData(shell);

    shell = MDCreategotoline_shell();
    MObjectSetUserData(gotoline_e, pfd);
    MObjectSetUserData(gotoline_ok_pb, gotoline_e);
    MShellRealize(shell);
}

void 
GotolineOkCB(MOBJECT p, void *od, void *ad)
{
    MOBJECT ed = MObjectGetUserData(p);
    FILE_DATA *pfd = MObjectGetUserData(ed);
    int line;
    char buff[16];

    MObjectGetText(ed, buff);
    line = atoi(buff);
    MEditSetCursorXY(pfd->edit, 0, line - 1);
    MShellDestroy(p);
}

void 
GotolineEditActCB(MOBJECT p, void *od, void *ad)
{
    FILE_DATA *pfd = MObjectGetUserData(p);
    int line;
    char buff[16];

    MObjectGetText(p, buff);
    line = atoi(buff);
    MEditSetCursorXY(pfd->edit, 0, line - 1);
    MShellDestroy(p);
}

void 
IgnoreCaseCB(MOBJECT p, MVALUE od, void *ad)
{
    FILE_DATA *pfd = MObjectGetUserData(p);

    pfd->ignore_case = (int) od;
}

void 
SearchForwardCB(MOBJECT p, void *od, void *ad)
{
    FILE_DATA *pfd = MObjectGetUserData(p);
    int curs_pos, len;
    char buff[50], str[64];

    MObjectGetText(search_e, buff);
    curs_pos = MEditGetCursorPos(pfd->edit);
    if ((curs_pos = MEditFindSubStringForward(
			 pfd->edit, curs_pos, buff, pfd->ignore_case)) >= 0)
    {
	len = strlen(buff);
	MEditSetCursorPos(pfd->edit, curs_pos + len);
	MEditSetSelection(pfd->edit, curs_pos, curs_pos + len);
	if (pfd->search_text)
	    free(pfd->search_text);
	pfd->search_text = malloc(len + 1);
	strcpy(pfd->search_text, buff);
    }
    else
    {
	sprintf(str, "String:\n%s\nnot found", buff);
	MMessageDialog("Warning", str, " Ok ", NULL);
    }
    MShellDestroy(p);
}

void 
SearchBackwardCB(MOBJECT p, void *od, void *ad)
{
    FILE_DATA *pfd = MObjectGetUserData(p);
    int curs_pos, len;
    char buff[50], str[64];

    MObjectGetText(search_e, buff);
    curs_pos = MEditGetCursorPos(pfd->edit);
    if ((curs_pos = MEditFindSubStringBackward(pfd->edit,
				    curs_pos, buff, pfd->ignore_case)) >= 0)
    {
	len = strlen(buff);
	MEditSetCursorPos(pfd->edit, curs_pos + len);
	MEditSetSelection(pfd->edit, curs_pos, curs_pos + len);
	if (pfd->search_text)
	    free(pfd->search_text);
	pfd->search_text = malloc(len + 1);
	strcpy(pfd->search_text, buff);
    }
    else
    {
	sprintf(str, "String:\n%s\nnot found", buff);
	MMessageDialog("Warning", str, " Ok ", NULL);
    }
    MShellDestroy(p);
}

static void 
SearchEditActCB(MOBJECT p, char *od, void *ud)
{
    SearchForwardCB((MOBJECT) ud, NULL, NULL);
}

void 
SearchCB(MOBJECT p, void *od, void *ud)
{
    MOBJECT shell = (MOBJECT) ud;
    FILE_DATA *pfd = MObjectGetUserData(shell);

    shell = MDCreatesearch_shell();
    if (pfd->search_text)
    {
	MObjectSetText(search_e, pfd->search_text);
	MEditSetReplace(search_e);
    }
    MEditSetActCallback(search_e, SearchEditActCB, search_f_pb);
    MObjectSetUserData(search_f_pb, pfd);
    MObjectSetUserData(search_b_pb, pfd);
    MObjectSetUserData(ignore_case_tb, pfd);
    MTButtonSetActivationStatus(ignore_case_tb, pfd->ignore_case);
    MShellRealize(shell);
}

void 
SearchNextCB(MOBJECT p, void *od, void *ud)
{
    MOBJECT shell = (MOBJECT) ud;
    FILE_DATA *pfd = MObjectGetUserData(shell);
    int curs_pos, end;

    if (pfd->search_text == NULL)
    {
	MBeep();
	return;
    }
    curs_pos = MEditGetCursorPos(pfd->edit);
    if ((curs_pos = MEditFindSubStringForward(pfd->edit,
			curs_pos, pfd->search_text, pfd->ignore_case)) >= 0)
    {
	end = curs_pos + strlen(pfd->search_text);
	MEditSetCursorPos(pfd->edit, end);
	MEditSetSelection(pfd->edit, curs_pos, end);
    }
    else
	MBeep();
}

void 
SearchPrevCB(MOBJECT p, void *od, void *ud)
{
    MOBJECT shell = (MOBJECT) ud;
    FILE_DATA *pfd = MObjectGetUserData(shell);
    int curs_pos, end;

    if (pfd->search_text == NULL)
    {
	MBeep();
	return;
    }
    curs_pos = MEditGetCursorPos(pfd->edit);
    if ((curs_pos = MEditFindSubStringBackward(pfd->edit,
			curs_pos, pfd->search_text, pfd->ignore_case)) >= 0)
    {
	end = curs_pos + strlen(pfd->search_text);
	MEditSetCursorPos(pfd->edit, curs_pos);
	MEditSetSelection(pfd->edit, curs_pos, end);
    }
    else
	MBeep();
}

void 
ReplaceCB(MOBJECT p, void *od, void *ud)
{
    MOBJECT shell = (MOBJECT) ud;
    FILE_DATA *pfd = MObjectGetUserData(shell);

    shell = MDCreatereplace_shell();
    if (pfd->search_text)
	MObjectSetText(replace_r_e, pfd->search_text);
    if (pfd->replace_text)
	MObjectSetText(replace_w_e, pfd->replace_text);
    MObjectSetUserData(replace_one_pb, pfd);
    MObjectSetUserData(replace_some_pb, pfd);
    MObjectSetUserData(replace_sel_pb, pfd);
    MObjectSetUserData(replace_all_pb, pfd);
    MShellRealize(shell);
}

void 
ReplaceOneCB(MOBJECT p, void *od, void *ad)
{
    FILE_DATA *pfd = MObjectGetUserData(p);
    int curs_pos, oldlen, newlen;
    char search[50], replace[50], str[64];
    char *oldtext, *newtext;

    MObjectGetText(replace_r_e, search);
    MObjectGetText(replace_w_e, replace);
    oldlen = strlen(search);
    newlen = strlen(replace);
    if (pfd->search_text)
	free(pfd->search_text);
    pfd->search_text = malloc(oldlen + 1);
    if (pfd->search_text)
	strcpy(pfd->search_text, search);
    if (pfd->replace_text)
	free(pfd->replace_text);
    pfd->replace_text = malloc(newlen + 1);
    if (pfd->replace_text)
	strcpy(pfd->replace_text, replace);
    curs_pos = MEditGetCursorPos(pfd->edit);
    if ((curs_pos = MEditFindSubStringForward(pfd->edit, curs_pos, search, False)) >= 0)
    {
	MEditChangeText(pfd->edit, curs_pos, oldlen, replace, newlen);
	pfd->modified = True;
	MObjectSetText(pfd->modified_label, "*");
	oldtext = malloc(oldlen + 1);
	if (oldtext)
	{
	    strcpy(oldtext, search);
	    newtext = malloc(newlen + 1);
	    if (newtext)
	    {
		strcpy(newtext, replace);
		AddUndoData(pfd, oldtext, curs_pos, oldlen,
			    newtext, newlen);
	    }
	    else
		free(oldtext);
	}
    }
    else
    {
	sprintf(str, "String:\n%s\nnot found", search);
	MMessageDialog("Warning", str, " Ok ", NULL);
    }
    MShellDestroy(p);
}

void 
ReplaceAllSomeSelExec(MOBJECT p, int all, int sel)
{
    FILE_DATA *pfd = MObjectGetUserData(p);
    int curs_pos, oldlen, newlen, sel_end;
    int changed, ret;
    char search[50], replace[50], str[64];
    char *oldtext, *newtext;

    MObjectGetText(replace_r_e, search);
    MObjectGetText(replace_w_e, replace);
    MShellDestroy(p);

    oldlen = strlen(search);
    newlen = strlen(replace);
    if (pfd->search_text)
	free(pfd->search_text);
    pfd->search_text = malloc(oldlen + 1);
    strcpy(pfd->search_text, search);
    if (pfd->replace_text)
	free(pfd->replace_text);
    pfd->replace_text = malloc(newlen + 1);
    strcpy(pfd->replace_text, replace);

    oldtext = MObjectGetText(pfd->edit, NULL);

    changed = False;
    if (sel)
	MEditGetSelection(pfd->edit, &curs_pos, &sel_end);
    else
	curs_pos = MEditGetCursorPos(pfd->edit);
    while ((curs_pos = MEditFindSubStringForward(pfd->edit, curs_pos, search, False)) >= 0)
    {
	if (sel)
	{
	    if (curs_pos + oldlen > sel_end)
		break;
	    sel_end += newlen - oldlen;
	}
	else if (!all)
	{
	    MEditSetCursorPos(pfd->edit, curs_pos);
	    MEditSetSelection(pfd->edit, curs_pos, curs_pos + oldlen);
	    ret = MMessageDialog("", "Replace Current Selection ?",
				 "Yes", "No", "Stop", NULL);
	    if (ret == 2)
		break;
	}
	if (all || sel || ret == 0)
	{
	    MEditChangeText(pfd->edit, curs_pos, oldlen, replace, newlen);
	    curs_pos += newlen;
	}
	else
	    curs_pos++;
	changed = True;
    }
    if (!changed)
    {
	sprintf(str, "String:\n%s\nnot found", search);
	MMessageDialog("Warning", str, " Ok ", NULL);
	if (oldtext)
	    free(oldtext);
    }
    else
    {
	pfd->modified = True;
	MObjectSetText(pfd->modified_label, "*");
	if (oldtext)
	{
	    newtext = MObjectGetText(pfd->edit, NULL);
	    if (newtext)
		AddUndoData(pfd, oldtext, 0, strlen(oldtext),
			    newtext, strlen(newtext));
	    else
		free(oldtext);
	}
    }
}

void 
ReplaceAllCB(MOBJECT p, void *od, void *ad)
{
    ReplaceAllSomeSelExec(p, True, False);
}

void 
ReplaceSomeCB(MOBJECT p, void *od, void *ad)
{
    ReplaceAllSomeSelExec(p, False, False);
}

void 
ReplaceSelectionCB(MOBJECT p, void *od, void *ad)
{
    ReplaceAllSomeSelExec(p, False, True);
}

⌨️ 快捷键说明

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