From 9bc2c3ffcc878fccce922a0815de4246bfdd4c2c Mon Sep 17 00:00:00 2001 From: codemastr Date: Fri, 9 Jul 2004 16:34:20 +0000 Subject: [PATCH] Added src/win32/editor.c --- Changes | 1 + src/win32/editor.c | 777 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 778 insertions(+) create mode 100644 src/win32/editor.c diff --git a/Changes b/Changes index 4cde1482e..ded7c4b17 100644 --- a/Changes +++ b/Changes @@ -265,3 +265,4 @@ - Fixed a whois bug when PREFIX_AQ is undefined, reported by Shaun - Moved the RTF win32 code to a seperate file - More win32 code cleanups +- Added src/win32/editor.c (woops), (#0001932) reported by Troco diff --git a/src/win32/editor.c b/src/win32/editor.c new file mode 100644 index 000000000..9b9ee3656 --- /dev/null +++ b/src/win32/editor.c @@ -0,0 +1,777 @@ +/************************************************************************ + * IRC - Internet Relay Chat, win32/editor.c + * Copyright (C) 2004 Dominick Meglio (codemastr) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 1, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "setup.h" +#include "win32.h" +#include "sys.h" + +LRESULT CALLBACK GotoDLG(HWND, UINT, WPARAM, LPARAM); +LRESULT CALLBACK ColorDLG(HWND, UINT, WPARAM, LPARAM); + +HWND hFind; + +/* Draws the statusbar for the editor + * Parameters: + * hInstance - The instance to create the statusbar in + * hwndParent - The parent of the statusbar + * iId - The message value used to send messages to the parent + * Returns: + * The handle to the statusbar + */ +HWND DrawStatusbar(HINSTANCE hInstance, HWND hwndParent, UINT iId) +{ + HWND hStatus, hTip; + TOOLINFO ti; + RECT clrect; + hStatus = CreateStatusWindow(WS_CHILD|WS_VISIBLE|SBT_TOOLTIPS, NULL, hwndParent, iId); + hTip = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, + WS_POPUP|TTS_NOPREFIX|TTS_ALWAYSTIP, 0, 0, 0, 0, hwndParent, NULL, hInstance, NULL); + GetClientRect(hStatus, &clrect); + ti.cbSize = sizeof(TOOLINFO); + ti.uFlags = TTF_SUBCLASS; + ti.hwnd = hStatus; + ti.uId = 1; + ti.hinst = hInstance; + ti.rect = clrect; + ti.lpszText = "Go To"; + SendMessage(hTip, TTM_ADDTOOL, 0, (LPARAM)&ti); + return hStatus; +} + +/* Draws the toolbar for the editor + * Parameters: + * hInstance - The instance to create the toolbar in + * hwndParent - The parent of the toolbar + * Returns: + * The handle to the toolbar + */ +HWND DrawToolbar(HINSTANCE hInstance, HWND hwndParent) +{ + HWND hTool; + TBADDBITMAP tbBit; + int newidx; + TBBUTTON tbButtons[10] = { + { STD_FILENEW, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0}, + { STD_FILESAVE, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0}, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0}, 0L, 0}, + { STD_CUT, IDM_CUT, 0, TBSTYLE_BUTTON, {0}, 0L, 0}, + { STD_COPY, IDM_COPY, 0, TBSTYLE_BUTTON, {0}, 0L, 0}, + { STD_PASTE, IDM_PASTE, 0, TBSTYLE_BUTTON, {0}, 0L, 0}, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0}, 0L, 0}, + { STD_UNDO, IDM_UNDO, 0, TBSTYLE_BUTTON, {0}, 0L, 0}, + { STD_REDOW, IDM_REDO, 0, TBSTYLE_BUTTON, {0}, 0L, 0}, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0}, 0L, 0} + }; + + TBBUTTON tbAddButtons[7] = { + { 0, IDC_BOLD, TBSTATE_ENABLED, TBSTYLE_CHECK, {0}, 0L, 0}, + { 1, IDC_UNDERLINE, TBSTATE_ENABLED, TBSTYLE_CHECK, {0}, 0L, 0}, + { 2, IDC_COLOR, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0}, + { 3, IDC_BGCOLOR, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0}, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0}, 0L, 0}, + { 4, IDC_GOTO, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0}, + { STD_FIND, IDC_FIND, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0} + }; + hTool = CreateToolbarEx(hwndParent, WS_VISIBLE|WS_CHILD|TBSTYLE_FLAT|TBSTYLE_TOOLTIPS, + IDC_TOOLBAR, 0, HINST_COMMCTRL, IDB_STD_SMALL_COLOR, + tbButtons, 10, 0, 0, 100, 30, sizeof(TBBUTTON)); + tbBit.hInst = hInstance; + tbBit.nID = IDB_BITMAP1; + newidx = SendMessage(hTool, TB_ADDBITMAP, (WPARAM)5, (LPARAM)&tbBit); + tbAddButtons[0].iBitmap += newidx; + tbAddButtons[1].iBitmap += newidx; + tbAddButtons[2].iBitmap += newidx; + tbAddButtons[3].iBitmap += newidx; + tbAddButtons[5].iBitmap += newidx; + SendMessage(hTool, TB_ADDBUTTONS, (WPARAM)7, (LPARAM)&tbAddButtons); + return hTool; +} + +/* Dialog procedure for the color selection dialog + * Parameters: + * hDlg - The dialog handle + * message - The message received + * wParam - The first message parameter + * lParam - The second message parameter + * Returns: + * TRUE if the message was processed, FALSE otherwise + */ +LRESULT CALLBACK ColorDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { + static HBRUSH hBrushWhite, hBrushBlack, hBrushDarkBlue, hBrushDarkGreen, hBrushRed, + hBrushDarkRed, hBrushPurple, hBrushOrange, hBrushYellow, hBrushGreen, hBrushVDarkGreen, + hBrushLightBlue, hBrushBlue, hBrushPink, hBrushDarkGray, hBrushGray; + static UINT ResultMsg = 0; + + switch (message) + { + case WM_INITDIALOG: + hBrushWhite = CreateSolidBrush(RGB(255,255,255)); + hBrushBlack = CreateSolidBrush(RGB(0,0,0)); + hBrushDarkBlue = CreateSolidBrush(RGB(0,0,127)); + hBrushDarkGreen = CreateSolidBrush(RGB(0,147,0)); + hBrushRed = CreateSolidBrush(RGB(255,0,0)); + hBrushDarkRed = CreateSolidBrush(RGB(127,0,0)); + hBrushPurple = CreateSolidBrush(RGB(156,0,156)); + hBrushOrange = CreateSolidBrush(RGB(252,127,0)); + hBrushYellow = CreateSolidBrush(RGB(255,255,0)); + hBrushGreen = CreateSolidBrush(RGB(0,252,0)); + hBrushVDarkGreen = CreateSolidBrush(RGB(0,147,147)); + hBrushLightBlue = CreateSolidBrush(RGB(0,255,255)); + hBrushBlue = CreateSolidBrush(RGB(0,0,252)); + hBrushPink = CreateSolidBrush(RGB(255,0,255)); + hBrushDarkGray = CreateSolidBrush(RGB(127,127,127)); + hBrushGray = CreateSolidBrush(RGB(210,210,210)); + ResultMsg = (UINT)lParam; + SetFocus(NULL); + return TRUE; + case WM_DRAWITEM: + { + LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam; + if (wParam == IDC_WHITE) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushWhite); + if (wParam == IDC_BLACK) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushBlack); + if (wParam == IDC_DARKBLUE) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushDarkBlue); + if (wParam == IDC_DARKGREEN) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushDarkGreen); + if (wParam == IDC_RED) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushRed); + if (wParam == IDC_DARKRED) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushDarkRed); + if (wParam == IDC_PURPLE) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushPurple); + if (wParam == IDC_ORANGE) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushOrange); + if (wParam == IDC_YELLOW) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushYellow); + if (wParam == IDC_GREEN) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushGreen); + if (wParam == IDC_VDARKGREEN) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushVDarkGreen); + if (wParam == IDC_LIGHTBLUE) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushLightBlue); + if (wParam == IDC_BLUE) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushBlue); + if (wParam == IDC_PINK) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushPink); + if (wParam == IDC_DARKGRAY) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushDarkGray); + if (wParam == IDC_GRAY) + FillRect(lpdis->hDC, &lpdis->rcItem, hBrushGray); + DrawEdge(lpdis->hDC, &lpdis->rcItem, EDGE_SUNKEN, BF_RECT); + return TRUE; + } + case WM_COMMAND: + { + COLORREF clrref; + if (LOWORD(wParam) == IDC_WHITE) + clrref = RGB(255,255,255); + else if (LOWORD(wParam) == IDC_BLACK) + clrref = RGB(0,0,0); + else if (LOWORD(wParam) == IDC_DARKBLUE) + clrref = RGB(0,0,127); + else if (LOWORD(wParam) == IDC_DARKGREEN) + clrref = RGB(0,147,0); + else if (LOWORD(wParam) == IDC_RED) + clrref = RGB(255,0,0); + else if (LOWORD(wParam) == IDC_DARKRED) + clrref = RGB(127,0,0); + else if (LOWORD(wParam) == IDC_PURPLE) + clrref = RGB(156,0,156); + else if (LOWORD(wParam) == IDC_ORANGE) + clrref = RGB(252,127,0); + else if (LOWORD(wParam) == IDC_YELLOW) + clrref = RGB(255,255,0); + else if (LOWORD(wParam) == IDC_GREEN) + clrref = RGB(0,252,0); + else if (LOWORD(wParam) == IDC_VDARKGREEN) + clrref = RGB(0,147,147); + else if (LOWORD(wParam) == IDC_LIGHTBLUE) + clrref = RGB(0,255,255); + else if (LOWORD(wParam) == IDC_BLUE) + clrref = RGB(0,0,252); + else if (LOWORD(wParam) == IDC_PINK) + clrref = RGB(255,0,255); + else if (LOWORD(wParam) == IDC_DARKGRAY) + clrref = RGB(127,127,127); + else if (LOWORD(wParam) == IDC_GRAY) + clrref = RGB(210,210,210); + SendMessage(GetParent(hDlg), ResultMsg, (WPARAM)clrref, (LPARAM)hDlg); + break; + } + case WM_CLOSE: + EndDialog(hDlg, TRUE); + case WM_DESTROY: + DeleteObject(hBrushWhite); + DeleteObject(hBrushBlack); + DeleteObject(hBrushDarkBlue); + DeleteObject(hBrushDarkGreen); + DeleteObject(hBrushRed); + DeleteObject(hBrushDarkRed); + DeleteObject(hBrushPurple); + DeleteObject(hBrushOrange); + DeleteObject(hBrushYellow); + DeleteObject(hBrushGreen); + DeleteObject(hBrushVDarkGreen); + DeleteObject(hBrushLightBlue); + DeleteObject(hBrushBlue); + DeleteObject(hBrushPink); + DeleteObject(hBrushDarkGray); + DeleteObject(hBrushGray); + break; + } + + return FALSE; +} + +/* Dialog procedure for the goto dialog + * Parameters: + * hDlg - The dialog handle + * message - The message received + * wParam - The first message parameter + * lParam - The second message parameter + * Returns: + * TRUE if the message was processed, FALSE otherwise + */ +LRESULT CALLBACK GotoDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + if (message == WM_COMMAND) + { + if (LOWORD(wParam) == IDCANCEL) + EndDialog(hDlg, TRUE); + else if (LOWORD(wParam) == IDOK) + { + HWND hWnd = GetDlgItem(GetParent(hDlg),IDC_TEXT); + int line = GetDlgItemInt(hDlg, IDC_GOTO, NULL, FALSE); + int pos = SendMessage(hWnd, EM_LINEINDEX, (WPARAM)--line, 0); + SendMessage(hWnd, EM_SETSEL, (WPARAM)pos, (LPARAM)pos); + SendMessage(hWnd, EM_SCROLLCARET, 0, 0); + EndDialog(hDlg, TRUE); + } + } + return FALSE; +} + +LRESULT CALLBACK FromFileDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + HWND hWnd; + static FINDREPLACE find; + static char findbuf[256]; + static unsigned char *file; + static HWND hTool, hClip, hStatus; + static RECT rOld; + CHARFORMAT2 chars; + + if (message == WM_FINDMSGSTRING) + { + FINDREPLACE *fr = (FINDREPLACE *)lParam; + + if (fr->Flags & FR_FINDNEXT) + { + HWND hRich = GetDlgItem(hDlg, IDC_TEXT); + DWORD flags=0; + FINDTEXTEX ft; + CHARRANGE chrg; + + if (fr->Flags & FR_DOWN) + flags |= FR_DOWN; + if (fr->Flags & FR_MATCHCASE) + flags |= FR_MATCHCASE; + if (fr->Flags & FR_WHOLEWORD) + flags |= FR_WHOLEWORD; + ft.lpstrText = fr->lpstrFindWhat; + SendMessage(hRich, EM_EXGETSEL, 0, (LPARAM)&chrg); + if (flags & FR_DOWN) + { + ft.chrg.cpMin = chrg.cpMax; + ft.chrg.cpMax = -1; + } + else + { + ft.chrg.cpMin = chrg.cpMin; + ft.chrg.cpMax = -1; + } + if (SendMessage(hRich, EM_FINDTEXTEX, flags, (LPARAM)&ft) == -1) + MessageBox(NULL, "Unreal has finished searching the document", + "Find", MB_ICONINFORMATION|MB_OK); + else + { + SendMessage(hRich, EM_EXSETSEL, 0, (LPARAM)&(ft.chrgText)); + SendMessage(hRich, EM_SCROLLCARET, 0, 0); + SetFocus(hRich); + } + } + return TRUE; + } + switch (message) + { + case WM_INITDIALOG: + { + int fd,len; + unsigned char *buffer = '\0', *string = '\0'; + EDITSTREAM edit; + StreamIO *stream = malloc(sizeof(StreamIO)); + unsigned char szText[256]; + struct stat sb; + HWND hWnd = GetDlgItem(hDlg, IDC_TEXT), hTip; + file = (unsigned char *)lParam; + if (file) + wsprintf(szText, "UnrealIRCd Editor - %s", file); + else + strcpy(szText, "UnrealIRCd Editor - New File"); + SetWindowText(hDlg, szText); + lpfnOldWndProc = (FARPROC)SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)RESubClassFunc); + hTool = DrawToolbar(hInst, hDlg); + hStatus = DrawStatusbar(hInst, hDlg, IDC_STATUS); + SendMessage(hWnd, EM_SETEVENTMASK, 0, (LPARAM)ENM_SELCHANGE); + chars.cbSize = sizeof(CHARFORMAT2); + chars.dwMask = CFM_FACE; + strcpy(chars.szFaceName,"Fixedsys"); + SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_ALL, (LPARAM)&chars); + if ((fd = open(file, _O_RDONLY|_O_BINARY)) != -1) + { + fstat(fd,&sb); + /* Only allocate the amount we need */ + buffer = malloc(sb.st_size+1); + buffer[0] = 0; + len = read(fd, buffer, sb.st_size); + buffer[len] = 0; + len = CountRTFSize(buffer)+1; + string = malloc(len); + bzero(string,len); + IRCToRTF(buffer,string); + RTFBuf = string; + len--; + stream->size = &len; + stream->buffer = &RTFBuf; + edit.dwCookie = (UINT)stream; + edit.pfnCallback = SplitIt; + SendMessage(hWnd, EM_EXLIMITTEXT, 0, (LPARAM)0x7FFFFFFF); + SendMessage(hWnd, EM_STREAMIN, (WPARAM)SF_RTF|SFF_PLAINRTF, (LPARAM)&edit); + SendMessage(hWnd, EM_SETMODIFY, (WPARAM)FALSE, 0); + SendMessage(hWnd, EM_EMPTYUNDOBUFFER, 0, 0); + close(fd); + RTFBuf = NULL; + free(buffer); + free(string); + free(stream); + hClip = SetClipboardViewer(hDlg); + if (SendMessage(hWnd, EM_CANPASTE, 0, 0)) + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_PASTE, (LPARAM)MAKELONG(TRUE,0)); + else + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_PASTE, (LPARAM)MAKELONG(FALSE,0)); + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_UNDO, (LPARAM)MAKELONG(FALSE,0)); + wsprintf(szText, "Line: 1"); + SetWindowText(hStatus, szText); + } + return TRUE; + } + case WM_WINDOWPOSCHANGING: + { + GetClientRect(hDlg, &rOld); + return FALSE; + } + case WM_SIZE: + { + DWORD new_width, new_height; + HWND hRich; + RECT rOldRich; + DWORD old_width, old_height; + DWORD old_rich_width, old_rich_height; + if (hDlg == hFind) + return FALSE; + new_width = LOWORD(lParam); + new_height = HIWORD(lParam); + hRich = GetDlgItem(hDlg, IDC_TEXT); + SendMessage(hStatus, WM_SIZE, 0, 0); + SendMessage(hTool, TB_AUTOSIZE, 0, 0); + old_width = rOld.right-rOld.left; + old_height = rOld.bottom-rOld.top; + new_width = new_width - old_width; + new_height = new_height - old_height; + GetWindowRect(hRich, &rOldRich); + old_rich_width = rOldRich.right-rOldRich.left; + old_rich_height = rOldRich.bottom-rOldRich.top; + SetWindowPos(hRich, NULL, 0, 0, old_rich_width+new_width, + old_rich_height+new_height, + SWP_NOMOVE|SWP_NOREPOSITION|SWP_NOZORDER); + bzero(&rOld, sizeof(RECT)); + return TRUE; + } + + case WM_NOTIFY: + switch (((NMHDR *)lParam)->code) + { + case EN_SELCHANGE: + { + HWND hWnd = GetDlgItem(hDlg, IDC_TEXT); + DWORD start, end, currline; + static DWORD prevline = 0; + unsigned char buffer[512]; + chars.cbSize = sizeof(CHARFORMAT2); + SendMessage(hWnd, EM_GETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); + if (chars.dwMask & CFM_BOLD && chars.dwEffects & CFE_BOLD) + SendMessage(hTool, TB_CHECKBUTTON, (WPARAM)IDC_BOLD, (LPARAM)MAKELONG(TRUE,0)); + else + SendMessage(hTool, TB_CHECKBUTTON, (WPARAM)IDC_BOLD, (LPARAM)MAKELONG(FALSE,0)); + if (chars.dwMask & CFM_UNDERLINE && chars.dwEffects & CFE_UNDERLINE) + SendMessage(hTool, TB_CHECKBUTTON, (WPARAM)IDC_UNDERLINE, (LPARAM)MAKELONG(TRUE,0)); + else + SendMessage(hTool, TB_CHECKBUTTON, (WPARAM)IDC_UNDERLINE, (LPARAM)MAKELONG(FALSE,0)); + SendMessage(hWnd, EM_GETSEL,(WPARAM)&start, (LPARAM)&end); + if (start == end) + { + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_COPY, (LPARAM)MAKELONG(FALSE,0)); + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_CUT, (LPARAM)MAKELONG(FALSE,0)); + } + else + { + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_COPY, (LPARAM)MAKELONG(TRUE,0)); + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_CUT, (LPARAM)MAKELONG(TRUE,0)); + } + if (SendMessage(hWnd, EM_CANUNDO, 0, 0)) + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_UNDO, (LPARAM)MAKELONG(TRUE,0)); + else + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_UNDO, (LPARAM)MAKELONG(FALSE,0)); + if (SendMessage(hWnd, EM_CANREDO, 0, 0)) + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_REDO, (LPARAM)MAKELONG(TRUE,0)); + else + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_REDO, (LPARAM)MAKELONG(FALSE,0)); + currline = SendMessage(hWnd, EM_LINEFROMCHAR, (WPARAM)-1, 0); + currline++; + if (currline != prevline) + { + wsprintf(buffer, "Line: %d", currline); + SetWindowText(hStatus, buffer); + prevline = currline; + } + return TRUE; + } + case TTN_GETDISPINFO: + { + LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT) lParam; + lpttt->hinst = NULL; + switch (lpttt->hdr.idFrom) + { + case IDM_NEW: + strcpy(lpttt->szText, "New"); + break; + case IDM_SAVE: + strcpy(lpttt->szText, "Save"); + break; + case IDM_CUT: + strcpy(lpttt->szText, "Cut"); + break; + case IDM_COPY: + strcpy(lpttt->szText, "Copy"); + break; + case IDM_PASTE: + strcpy(lpttt->szText, "Paste"); + break; + case IDM_UNDO: + strcpy(lpttt->szText, "Undo"); + break; + case IDM_REDO: + strcpy(lpttt->szText, "Redo"); + break; + case IDC_BOLD: + strcpy(lpttt->szText, "Bold"); + break; + case IDC_UNDERLINE: + strcpy(lpttt->szText, "Underline"); + break; + case IDC_COLOR: + strcpy(lpttt->szText, "Text Color"); + break; + case IDC_BGCOLOR: + strcpy(lpttt->szText, "Background Color"); + break; + case IDC_GOTO: + strcpy(lpttt->szText, "Goto"); + break; + case IDC_FIND: + strcpy(lpttt->szText, "Find"); + break; + } + return TRUE; + } + case NM_DBLCLK: + DialogBox(hInst, "GOTO", hDlg, (DLGPROC)GotoDLG); + return (TRUE); + } + + return (TRUE); + case WM_COMMAND: + if (LOWORD(wParam) == IDC_BOLD) + { + hWnd = GetDlgItem(hDlg, IDC_TEXT); + if (SendMessage(hTool, TB_ISBUTTONCHECKED, (WPARAM)IDC_BOLD, (LPARAM)0) != 0) + { + chars.cbSize = sizeof(CHARFORMAT2); + chars.dwMask = CFM_BOLD; + chars.dwEffects = CFE_BOLD; + SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); + SendMessage(hWnd, EM_HIDESELECTION, 0, 0); + SetFocus(hWnd); + } + else + { + chars.cbSize = sizeof(CHARFORMAT2); + chars.dwMask = CFM_BOLD; + chars.dwEffects = 0; + SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); + SendMessage(hWnd, EM_HIDESELECTION, 0, 0); + SetFocus(hWnd); + } + return TRUE; + } + else if (LOWORD(wParam) == IDC_UNDERLINE) + { + hWnd = GetDlgItem(hDlg, IDC_TEXT); + if (SendMessage(hTool, TB_ISBUTTONCHECKED, (WPARAM)IDC_UNDERLINE, (LPARAM)0) != 0) + { + chars.cbSize = sizeof(CHARFORMAT2); + chars.dwMask = CFM_UNDERLINETYPE; + chars.bUnderlineType = CFU_UNDERLINE; + SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); + SendMessage(hWnd, EM_HIDESELECTION, 0, 0); + SetFocus(hWnd); + } + else + { + chars.cbSize = sizeof(CHARFORMAT2); + chars.dwMask = CFM_UNDERLINETYPE; + chars.bUnderlineType = CFU_UNDERLINENONE; + SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); + SendMessage(hWnd, EM_HIDESELECTION, 0, 0); + SetFocus(hWnd); + } + return TRUE; + } + if (LOWORD(wParam) == IDC_COLOR) + { + DialogBoxParam(hInst, "Color", hDlg, (DLGPROC)ColorDLG, (LPARAM)WM_USER+10); + return 0; + } + if (LOWORD(wParam) == IDC_BGCOLOR) + { + DialogBoxParam(hInst, "Color", hDlg, (DLGPROC)ColorDLG, (LPARAM)WM_USER+11); + return 0; + } + if (LOWORD(wParam) == IDC_GOTO) + { + DialogBox(hInst, "GOTO", hDlg, (DLGPROC)GotoDLG); + return 0; + } + if (LOWORD(wParam) == IDC_FIND) + { + static FINDREPLACE fr; + bzero(&fr, sizeof(FINDREPLACE)); + fr.lStructSize = sizeof(FINDREPLACE); + fr.hwndOwner = hDlg; + fr.lpstrFindWhat = findbuf; + fr.wFindWhatLen = 255; + hFind = FindText(&fr); + return 0; + } + + hWnd = GetDlgItem(hDlg, IDC_TEXT); + if (LOWORD(wParam) == IDM_COPY) + { + SendMessage(hWnd, WM_COPY, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_SELECTALL) + { + SendMessage(hWnd, EM_SETSEL, 0, -1); + return 0; + } + if (LOWORD(wParam) == IDM_PASTE) + { + SendMessage(hWnd, WM_PASTE, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_CUT) + { + SendMessage(hWnd, WM_CUT, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_UNDO) + { + SendMessage(hWnd, EM_UNDO, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_REDO) + { + SendMessage(hWnd, EM_REDO, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_DELETE) + { + SendMessage(hWnd, WM_CLEAR, 0, 0); + return 0; + } + if (LOWORD(wParam) == IDM_SAVE) + { + int fd; + EDITSTREAM edit; + OPENFILENAME lpopen; + if (!file) + { + unsigned char path[MAX_PATH]; + path[0] = '\0'; + bzero(&lpopen, sizeof(OPENFILENAME)); + lpopen.lStructSize = sizeof(OPENFILENAME); + lpopen.hwndOwner = hDlg; + lpopen.lpstrFilter = NULL; + lpopen.lpstrCustomFilter = NULL; + lpopen.nFilterIndex = 0; + lpopen.lpstrFile = path; + lpopen.nMaxFile = MAX_PATH; + lpopen.lpstrFileTitle = NULL; + lpopen.lpstrInitialDir = DPATH; + lpopen.lpstrTitle = NULL; + lpopen.Flags = (OFN_ENABLESIZING|OFN_NONETWORKBUTTON| + OFN_OVERWRITEPROMPT); + if (GetSaveFileName(&lpopen)) + file = path; + else + break; + } + fd = open(file, _O_TRUNC|_O_CREAT|_O_WRONLY|_O_BINARY,_S_IWRITE); + edit.dwCookie = 0; + edit.pfnCallback = BufferIt; + SendMessage(GetDlgItem(hDlg, IDC_TEXT), EM_STREAMOUT, (WPARAM)SF_RTF|SFF_PLAINRTF, (LPARAM)&edit); + RTFToIRC(fd, RTFBuf, strlen(RTFBuf)); + free(RTFBuf); + RTFBuf = NULL; + SendMessage(GetDlgItem(hDlg, IDC_TEXT), EM_SETMODIFY, (WPARAM)FALSE, 0); + + return 0; + } + if (LOWORD(wParam) == IDM_NEW) + { + unsigned char text[1024]; + BOOL newfile = FALSE; + int ans; + if (SendMessage(GetDlgItem(hDlg, IDC_TEXT), EM_GETMODIFY, 0, 0) != 0) + { + sprintf(text, "The text in the %s file has changed.\r\n\r\nDo you want to save the changes?", file ? file : "new"); + ans = MessageBox(hDlg, text, "UnrealIRCd", MB_YESNOCANCEL|MB_ICONWARNING); + if (ans == IDNO) + newfile = TRUE; + if (ans == IDCANCEL) + return TRUE; + if (ans == IDYES) + { + SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(IDM_SAVE,0), 0); + newfile = TRUE; + } + } + else + newfile = TRUE; + if (newfile == TRUE) + { + unsigned char szText[256]; + file = NULL; + strcpy(szText, "UnrealIRCd Editor - New File"); + SetWindowText(hDlg, szText); + SetWindowText(GetDlgItem(hDlg, IDC_TEXT), NULL); + } + break; + } + break; + case WM_USER+10: + { + HWND hWnd = GetDlgItem(hDlg, IDC_TEXT); + EndDialog((HWND)lParam, TRUE); + chars.cbSize = sizeof(CHARFORMAT2); + chars.dwMask = CFM_COLOR; + chars.crTextColor = (COLORREF)wParam; + SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); + SendMessage(hWnd, EM_HIDESELECTION, 0, 0); + SetFocus(hWnd); + break; + } + case WM_USER+11: + { + HWND hWnd = GetDlgItem(hDlg, IDC_TEXT); + EndDialog((HWND)lParam, TRUE); + chars.cbSize = sizeof(CHARFORMAT2); + chars.dwMask = CFM_BACKCOLOR; + chars.crBackColor = (COLORREF)wParam; + SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)&chars); + SendMessage(hWnd, EM_HIDESELECTION, 0, 0); + SetFocus(hWnd); + break; + } + case WM_CHANGECBCHAIN: + if ((HWND)wParam == hClip) + hClip = (HWND)lParam; + else + SendMessage(hClip, WM_CHANGECBCHAIN, wParam, lParam); + break; + case WM_DRAWCLIPBOARD: + if (SendMessage(GetDlgItem(hDlg, IDC_TEXT), EM_CANPASTE, 0, 0)) + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_PASTE, (LPARAM)MAKELONG(TRUE,0)); + else + SendMessage(hTool, TB_ENABLEBUTTON, (WPARAM)IDM_PASTE, (LPARAM)MAKELONG(FALSE,0)); + SendMessage(hClip, WM_DRAWCLIPBOARD, wParam, lParam); + break; + case WM_CLOSE: + { + unsigned char text[256]; + int ans; + if (SendMessage(GetDlgItem(hDlg, IDC_TEXT), EM_GETMODIFY, 0, 0) != 0) + { + sprintf(text, "The text in the %s file has changed.\r\n\r\nDo you want to save the changes?", file ? file : "new"); + ans = MessageBox(hDlg, text, "UnrealIRCd", MB_YESNOCANCEL|MB_ICONWARNING); + if (ans == IDNO) + EndDialog(hDlg, TRUE); + if (ans == IDCANCEL) + return TRUE; + if (ans == IDYES) + { + SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(IDM_SAVE,0), 0); + EndDialog(hDlg, TRUE); + } + } + else + EndDialog(hDlg, TRUE); + break; + } + case WM_DESTROY: + ChangeClipboardChain(hDlg, hClip); + break; + } + + return FALSE; +}