void WrappingTextView::MessageReceived( BMessage* msg) { switch( msg->what) { case B_UNDO: { UndoChange(); break; } case B_REDO: { RedoChange(); break; } case B_COPY: { int32 from, to; GetSelection( &from, &to); if (from != to) inherited::MessageReceived( msg); break; } default: inherited::MessageReceived( msg); } }
LRESULT CALLBACK MenuDrawProc(HWND hwnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { static MENUITEM *start; static BOOL dragging; static HCURSOR oldcurs; static struct resRes *resData; static struct propertyFuncs *resFuncs; POINT mouse; RECT r; PAINTSTRUCT paint; HDC dc; LPCREATESTRUCT createStruct; struct resRes *menuData; int i; struct menuUndo *undo; switch (iMessage) { case WM_MDIACTIVATE: if ((HWND)lParam == hwnd) { doMaximize(); } break; case WM_SETFOCUS: menuData = (struct resRes *)GetWindowLong(hwnd, 0); SetResourceProperties(resData, resFuncs); break; case EM_CANUNDO: menuData = (struct resRes *)GetWindowLong(hwnd, 0); return menuData->gd.undoData != NULL; case WM_KEYDOWN: menuData = (struct resRes *)GetWindowLong(hwnd, 0); switch (wParam) { case 'S': if (GetKeyState(VK_CONTROL) &0x80000000) { PostMessage(hwnd, WM_COMMAND, IDM_SAVE, 0); } break; case 'Z': if (GetKeyState(VK_CONTROL) &0x80000000) { PostMessage(hwnd, WM_COMMAND, IDM_UNDO, 0); } break; } break; case WM_CREATE: createStruct = (LPCREATESTRUCT)lParam; menuData = (struct resRes *)((LPMDICREATESTRUCT)(createStruct->lpCreateParams))->lParam; SetWindowLong(hwnd, 0, (long)menuData); menuData->activeHwnd = hwnd; resData = menuData; resFuncs = &menuFuncs; MarkUnexpanded(menuData->resource->u.menu->items); break; case WM_CLOSE: SendMessage(hwndSrcTab, TABM_REMOVE, 0, (LPARAM)hwnd); break; case WM_DESTROY: menuData = (struct resRes *)GetWindowLong(hwnd, 0); menuData->activeHwnd = NULL; undo = menuData->gd.undoData; menuData->gd.undoData = NULL; if (undo) menuData->gd.cantClearUndo = TRUE; while (undo) { struct menuUndo *next = undo->next; free(undo); undo = next; } break; // case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_MBUTTONDOWN: case WM_RBUTTONDBLCLK: case WM_MBUTTONDBLCLK: case WM_RBUTTONUP: SetFocus(hwnd); return 1; case WM_PAINT: menuData = (struct resRes *)GetWindowLong(hwnd, 0); GetClientRect(hwnd, &r); dc = BeginPaint(hwnd, &paint); DoPaint(hwnd, dc, &paint, &r, menuData); EndPaint(hwnd, &paint); break; case WM_RBUTTONDOWN: menuData = (struct resRes *)GetWindowLong(hwnd, 0); SendMessage(hwnd, WM_COMMAND, ID_EDIT + (EN_KILLFOCUS << 16), 0); mouse.x = LOWORD(lParam); mouse.y = HIWORD(lParam); i = menuHitTest(hwnd, menuData, mouse); if (i) { HMENU menu, popup; SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(ID_EDIT, CBN_KILLFOCUS), 0); menu = LoadMenuGeneric(hInstance, "RESMENUMENU"); if (i & 2) EnableMenuItem(menu, IDM_DELETE, MF_BYCOMMAND | MF_GRAYED); if (i & 4) EnableMenuItem(menu, IDM_INSERT_SEPARATOR, MF_BYCOMMAND | MF_GRAYED); menuData->gd.selectedRow = mouse.y + menuData->gd.scrollPos.y; menuData->gd.selectedColumn = mouse.x + menuData->gd.scrollPos.x; popup = GetSubMenu(menu, 0); ClientToScreen(hwnd, &mouse); InsertBitmapsInMenu(popup); TrackPopupMenuEx(popup, TPM_TOPALIGN | TPM_LEFTALIGN | TPM_LEFTBUTTON, mouse.x, mouse.y, hwnd, NULL); DestroyMenu(menu); } return 1; case WM_LBUTTONDBLCLK: SendMessage(hwnd, WM_COMMAND, ID_EDIT + (EN_KILLFOCUS << 16), 0); SetFocus(hwnd); menuData = (struct resRes *)GetWindowLong(hwnd, 0); mouse.x = LOWORD(lParam); mouse.y = HIWORD(lParam); SelectSubmenu(hwnd, menuData, mouse, TRUE); break; case WM_MOUSEMOVE: if (dragging) { menuData = (struct resRes *)GetWindowLong(hwnd, 0); mouse.x = LOWORD(lParam); mouse.y = HIWORD(lParam); menuData->gd.selectedMenu = start; i = menuHitTest(hwnd, menuData, mouse); if (!oldcurs) oldcurs = GetCursor(); SetCursor(i & 8 ? dragCur : noCur); } break; case WM_LBUTTONDOWN: SetFocus(hwnd); menuData = (struct resRes *)GetWindowLong(hwnd, 0); SendMessage(hwnd, WM_COMMAND, ID_EDIT + (EN_KILLFOCUS << 16), 0); mouse.x = LOWORD(lParam); mouse.y = HIWORD(lParam); i = menuHitTest(hwnd, menuData, mouse); if (i & 1) { resData = menuData; resFuncs = &menuItemFuncs; start = menuData->gd.selectedMenu; dragging = TRUE; SetCapture(hwnd); } else { resData = menuData; resFuncs = &menuFuncs; } SetResourceProperties(resData, resFuncs); break; case WM_LBUTTONUP: if (dragging) { dragging = FALSE; ReleaseCapture(); } menuData = (struct resRes *)GetWindowLong(hwnd, 0); if (oldcurs) { if (GetCursor() == dragCur) { mouse.x = LOWORD(lParam); mouse.y = HIWORD(lParam); i = menuHitTest(hwnd, menuData, mouse); DoMove(menuData, start, menuData->gd.selectedMenu); } SetCursor(oldcurs); oldcurs = NULL; } else { SendMessage(hwnd, WM_COMMAND, ID_EDIT + (EN_KILLFOCUS << 16), 0); SetFocus(hwnd); mouse.x = LOWORD(lParam); mouse.y = HIWORD(lParam); SelectSubmenu(hwnd, menuData, mouse, FALSE); } break; case WM_COMMAND: menuData = (struct resRes *)GetWindowLong(hwnd, 0); switch (LOWORD(wParam)) { case ID_EDIT: if (HIWORD(wParam) == EN_KILLFOCUS) { static BOOL inKillFocus; if (menuData->gd.editWindow && !inKillFocus) { char buf[256]; char buf2[256]; UndoChange(menuData, menuData->gd.selectedMenu); buf[GetWindowText(menuData->gd.editWindow, buf, sizeof(buf))] = 0; StringWToA(buf2, menuData->gd.selectedMenu->text, wcslen(menuData->gd.selectedMenu->text)); if (strcmp(buf, buf2)) { ResGetHeap(workArea, menuData); if (menuData->gd.selectedMenu->id) ResGetMenuItemName(menuData->gd.selectedMenu->id, buf); StringAsciiToWChar(&menuData->gd.selectedMenu->text, buf, strlen(buf)); ResSetDirty(menuData); } InvalidateRect(hwnd, 0, FALSE); inKillFocus = TRUE; DestroyWindow(menuData->gd.editWindow); inKillFocus = FALSE; menuData->gd.editWindow = NULL; } } break; case IDM_DELETE: case IDM_INSERT: case IDM_INSERT_SEPARATOR: InsertDelete(hwnd, menuData, LOWORD(wParam)); break; case IDM_SAVE: if (menuData->resource->changed) { ResSaveCurrent(workArea, menuData); } break; case IDM_UNDO: DoUndo(menuData); break; } break; case WM_VSCROLL: menuData = (struct resRes *)GetWindowLong(hwnd, 0); switch (LOWORD(wParam)) { case SB_BOTTOM: menuData->gd.scrollPos.y = menuData->gd.scrollMax.y; break; case SB_TOP: menuData->gd.scrollPos.y = 0; break; case SB_LINEDOWN: menuData->gd.scrollPos.y += 8; break; case SB_LINEUP: menuData->gd.scrollPos.y -= 8; break; case SB_PAGEDOWN: menuData->gd.scrollPos.y += 64; break; case SB_PAGEUP: menuData->gd.scrollPos.y -= 64; break; case SB_ENDSCROLL: return 0; case SB_THUMBPOSITION: case SB_THUMBTRACK: { SCROLLINFO si; memset(&si, 0, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_TRACKPOS; GetScrollInfo(hwnd, SB_VERT, &si); menuData->gd.scrollPos.y = si.nTrackPos; } break; default: return 0; } if (menuData->gd.scrollPos.y < 0) menuData->gd.scrollPos.y = 0; if (menuData->gd.scrollPos.y >= menuData->gd.scrollMax.y) menuData->gd.scrollPos.y = menuData->gd.scrollMax.y; SetScrollPos(hwnd, SB_VERT, menuData->gd.scrollPos.y, TRUE); InvalidateRect(hwnd,0,FALSE); return 0; case WM_HSCROLL: menuData = (struct resRes *)GetWindowLong(hwnd, 0); switch (LOWORD(wParam)) { case SB_LEFT: menuData->gd.scrollPos.x = 0; break; case SB_RIGHT: menuData->gd.scrollPos.x = menuData->gd.scrollMax.x; break; case SB_LINELEFT: menuData->gd.scrollPos.x -= 8; break; case SB_LINERIGHT: menuData->gd.scrollPos.x += 8; break; case SB_PAGERIGHT: menuData->gd.scrollPos.x += 64; break; case SB_PAGELEFT: menuData->gd.scrollPos.x -= 64; break; case SB_ENDSCROLL: return 0; case SB_THUMBPOSITION: case SB_THUMBTRACK: { SCROLLINFO si; memset(&si, 0, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_TRACKPOS; GetScrollInfo(hwnd, SB_HORZ, &si); menuData->gd.scrollPos.x = si.nTrackPos; } break; } if (menuData->gd.scrollPos.x < 0) menuData->gd.scrollPos.x = 0; if (menuData->gd.scrollPos.x >= menuData->gd.scrollMax.x) menuData->gd.scrollPos.x = menuData->gd.scrollMax.x; SetScrollPos(hwnd, SB_HORZ, menuData->gd.scrollPos.x, TRUE); SetWindowPos(menuData->gd.childWindow, NULL, menuData->gd.origin.x - menuData->gd.scrollPos.x, menuData->gd.origin.y - menuData->gd.scrollPos.y, 0,0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); InvalidateRect(hwnd,0,FALSE); return 0; case WM_SIZE: InvalidateRect(hwnd, 0, FALSE); break; default: break; } return DefMDIChildProc(hwnd, iMessage, wParam, lParam); }