/************************************************************************ * IRC - Internet Relay Chat, windows/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 "unrealircd.h" #include #include #include #include #include #include "resource.h" #include "win.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, "UnrealIRCd 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; char *buffer, *string; EDITSTREAM edit; StreamIO *stream = safe_alloc(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)SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)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 = safe_alloc(sb.st_size+1); len = read(fd, buffer, sb.st_size); buffer[len] = 0; len = CountRTFSize(buffer)+1; string = safe_alloc(len); IRCToRTF(buffer,string); RTFBuf = string; len--; stream->size = &len; stream->buffer = &RTFBuf; edit.dwCookie = (DWORD_PTR)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; safe_free(buffer); safe_free(string); safe_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); memset(&rOld, 0, sizeof(rOld)); 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; memset(&fr, 0, sizeof(fr)); 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'; memset(&lpopen, 0, sizeof(lpopen)); 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 = CONFDIR; 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)); safe_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; }