void FileBrowseMenu(int x, int y, HWND hwndToolbar) { if (fileBrowseInfo) { FILEBROWSE *p = fileBrowseInfo; HMENU popup = CreatePopupMenu(); int i = 0, j; memset(ordered, 0, sizeof(ordered)); while (p && i < MAX_BROWSE) { ordered[i++] = p; p = p->next; } qsort(ordered, i, sizeof(FILEBROWSE *), fbcomp); for (j=0; j < i;) { FILEBROWSE *cur = ordered[j]; HMENU internalPop = CreatePopupMenu(); for ( ;j < i && cur->info == ordered[j]->info; j++) { InsertMenu(internalPop, -1, MF_BYPOSITION | MF_STRING, j + ID_FILEBROWSE_LIST, GetName(j)); } InsertMenu(popup, -1, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT_PTR)internalPop, cur->info->dwTitle); } InsertBitmapsInMenu(popup); TrackPopupMenuEx(popup, TPM_TOPALIGN | TPM_LEFTBUTTON, x, y, hwndFrame, NULL); DestroyMenu(popup); } }
void CreateProjectMenu(void) { PROJECTITEM *cur = GetItemInfo(prjSelectedItem); HMENU menu = NULL; if (cur) { switch(cur->type) { case PJ_WS: menu = LoadMenuGeneric(hInstance, "WORKAREAMENU"); break; case PJ_PROJ: if (cur->loaded) menu = LoadMenuGeneric(hInstance, "PROJECTMENU"); else menu = LoadMenuGeneric(hInstance, "PROJECTREMOVEMENU"); break; case PJ_FOLDER: menu = LoadMenuGeneric(hInstance, "FOLDERMENU"); break; case PJ_FILE: menu = LoadMenuGeneric(hInstance, "FILEMENU"); break; default: menu = NULL; break; } } else { menu = LoadMenuGeneric(hInstance, "WORKAREAMENU"); } if (menu) { HMENU popup = GetSubMenu(menu, 0); POINT pos; GetCursorPos(&pos); InsertBitmapsInMenu(popup); TrackPopupMenuEx(popup, TPM_TOPALIGN | TPM_LEFTBUTTON, pos.x, pos.y, hwndFrame, NULL); DestroyMenu(menu); } }
LRESULT CALLBACK StringTableDrawProc(HWND hwnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { static HCURSOR origCurs; RECT r; LPCREATESTRUCT createStruct; struct resRes *stringTableData; LVHITTESTINFO hittest; int i; struct stringTableUndo *undo; switch (iMessage) { case WM_MDIACTIVATE: if ((HWND)lParam == hwnd) { doMaximize(); } break; case WM_SETFOCUS: stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); SetFocus(stringTableData->gd.childWindow); break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case LVN_GETDISPINFO: { LV_DISPINFO *plvdi = (LV_DISPINFO*)lParam; STRINGS *strings; plvdi->item.mask |= LVIF_TEXT | LVIF_DI_SETITEM; plvdi->item.mask &= ~LVIF_IMAGE; strings = (STRINGS *)plvdi->item.lParam; switch (plvdi->item.iSubItem) { char id[256]; case 1: FormatVersionString(id, strings->string, strings->length);//FIXME id plvdi->item.pszText = id; break; } break; } case LVN_KEYDOWN: { stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(ID_EDIT, CBN_KILLFOCUS), 0); switch (((LPNMLVKEYDOWN)lParam)->wVKey) { case 'S': if (GetKeyState(VK_CONTROL) &0x80000000) { PostMessage(hwnd, WM_COMMAND, IDM_SAVE, 0); return TRUE; } break; case 'Z': if (GetKeyState(VK_CONTROL) &0x80000000) { PostMessage(hwnd, WM_COMMAND, IDM_UNDO, 0); return TRUE; } break; case VK_INSERT: stringTableData->gd.selectedRow = ListView_GetNextItem(stringTableData->gd.childWindow, -1, LVNI_SELECTED); PostMessage(hwnd, WM_COMMAND, IDM_INSERT, 0); return TRUE; case VK_DELETE: stringTableData->gd.selectedRow = ListView_GetNextItem(stringTableData->gd.childWindow, -1, LVNI_SELECTED); PostMessage(hwnd, WM_COMMAND, IDM_DELETE, 0); return TRUE; } } break; case NM_CLICK: { SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(ID_EDIT, CBN_KILLFOCUS), 0); } break; case NM_RCLICK: { POINT pt; stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); GetCursorPos(&hittest.pt); pt = hittest.pt; ScreenToClient(stringTableData->gd.childWindow, &hittest.pt); if (ListView_HitTest(stringTableData->gd.childWindow, &hittest) < 0) { hittest.iItem = ListView_GetItemCount(stringTableData->gd.childWindow); hittest.iSubItem = 0; } { HMENU menu, popup; SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(ID_EDIT, CBN_KILLFOCUS), 0); menu = LoadMenuGeneric(hInstance, "RESSTRINGSMENU"); stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); stringTableData->gd.selectedRow = hittest.iItem; stringTableData->gd.selectedColumn = hittest.iSubItem; popup = GetSubMenu(menu, 0); InsertBitmapsInMenu(popup); TrackPopupMenuEx(popup, TPM_TOPALIGN | TPM_LEFTALIGN | TPM_LEFTBUTTON, pt.x, pt.y, hwnd, NULL); DestroyMenu(menu); } return 1; } break; case NM_DBLCLK: stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); GetCursorPos(&hittest.pt); ScreenToClient(stringTableData->gd.childWindow, &hittest.pt); if (ListView_SubItemHitTest(stringTableData->gd.childWindow, &hittest) >= 0) { stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); stringTableData->gd.selectedRow = hittest.iItem; stringTableData->gd.selectedColumn = hittest.iSubItem; PostMessage(hwnd, WM_HANDLEDBLCLICK, 0, 0); } break; case NM_SETFOCUS: stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); SetResourceProperties(stringTableData, &accFuncs); break; case NM_KILLFOCUS: // SetResourceProperties(NULL, NULL); break; } break; case WM_HANDLEDBLCLICK: { STRINGS *strings; RECT r; stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); if (stringTableData->gd.editWindow) { DestroyWindow(stringTableData->gd.editWindow); stringTableData->gd.editWindow = NULL; } strings = stringTableData->resource->u.stringtable; i = 0; while (strings && strings->next && i < stringTableData->gd.selectedRow) strings = strings->next, i++; if (strings) { ListView_GetSubItemRect(stringTableData->gd.childWindow, stringTableData->gd.selectedRow, stringTableData->gd.selectedColumn, LVIR_BOUNDS, &r); stringTableData->gd.editWindow = CreateWindow("edit", "", WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_BORDER, r.left,r.top,r.right-r.left,16, hwnd, (HMENU)ID_EDIT, hInstance, NULL); SetParent(stringTableData->gd.editWindow, stringTableData->gd.childWindow); AccSubclassEditWnd(hwnd, stringTableData->gd.editWindow); switch(stringTableData->gd.selectedColumn) { char buf[256]; case 0: buf[0] = 0; FormatExp(buf, strings->id); SendMessage(stringTableData->gd.editWindow, WM_SETTEXT, 0, (LPARAM)buf); break; case 1: FormatVersionString(buf, strings->string, strings->length); buf[strlen(buf)-1] = 0; SendMessage(stringTableData->gd.editWindow, WM_SETTEXT, 0, (LPARAM)buf+1); break; } SendMessage(stringTableData->gd.editWindow, EM_SETSEL, 0, -1); SetFocus(stringTableData->gd.editWindow); } } break; case WM_TIMER: stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); ListView_Scroll(stringTableData->gd.childWindow, 0, (stringTableData->gd.lvscroll & 1) ? -16 : 16); break; case WM_COMMAND: stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); switch (LOWORD(wParam)) { case ID_EDIT: if (HIWORD(wParam) == CBN_KILLFOCUS || HIWORD(wParam) == EN_KILLFOCUS) { static BOOL inKillFocus; if (stringTableData->gd.editWindow && !inKillFocus) { STRINGS *strings = stringTableData->resource->u.stringtable; i = 0; while (strings && strings->next && i < stringTableData->gd.selectedRow) strings = strings->next,i++; if (strings) { char buf[256]; buf[GetWindowText(stringTableData->gd.editWindow, buf, sizeof(buf)-1)] = 0; StringTableSetChanged(stringTableData, strings); if (stringTableData->gd.selectedColumn == 0) { PropSetIdName(stringTableData, buf, &strings->id, NULL); } else { int len; char *p = ParseVersionString(buf, &len); //FIXME ? strings->length = StringAsciiToWChar(&strings->string, p, len); ResGetStringItemName(strings->id, p); } ListView_DeleteItem(stringTableData->gd.childWindow, stringTableData->gd.selectedRow); PopulateItem(stringTableData->gd.childWindow, strings, stringTableData->gd.selectedRow); } i = 0; inKillFocus = TRUE; DestroyWindow(stringTableData->gd.editWindow); inKillFocus = FALSE; stringTableData->gd.editWindow = NULL; } } break; case IDM_INSERT: StringTableInsert(stringTableData, stringTableData->gd.selectedRow); break; case IDM_DELETE: StringTableDelete(stringTableData, stringTableData->gd.selectedRow); break; case IDM_SAVE: if (stringTableData->resource->changed) { ResSaveCurrent(workArea, stringTableData); } break; case IDM_UNDO: StringTableUndo(hwnd, stringTableData); break; } break; case EM_CANUNDO: stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); return stringTableData->gd.undoData != NULL; case WM_CREATE: GetClientRect(hwnd, &r); createStruct = (LPCREATESTRUCT)lParam; stringTableData = (struct resRes *)((LPMDICREATESTRUCT)(createStruct->lpCreateParams))->lParam; SetWindowLong(hwnd, 0, (long)stringTableData); stringTableData->activeHwnd = hwnd; stringTableData->gd.childWindow = CreateWindowEx(0, WC_LISTVIEW, "", WS_VISIBLE | WS_CHILD | LVS_REPORT | LVS_SINGLESEL, 0, 0, r.right, r.bottom, hwnd, (HMENU)ID_TREEVIEW, hInstance, NULL); SetListViewColumns(hwnd, stringTableData->gd.childWindow); PopulateStrings(hwnd, stringTableData ); break; case WM_CLOSE: SendMessage(hwndSrcTab, TABM_REMOVE, 0, (LPARAM)hwnd); break; case WM_DESTROY: stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); if (stringTableData->gd.editWindow) DestroyWindow(stringTableData->gd.editWindow); stringTableData->gd.editWindow = NULL; undo = stringTableData->gd.undoData; if (undo) stringTableData->gd.cantClearUndo = TRUE; while (undo) { struct stringTableUndo *next = undo->next; free(undo); undo = next; } stringTableData->gd.undoData = NULL; stringTableData->activeHwnd = NULL; break; case WM_SIZE: stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); MoveWindow(stringTableData->gd.childWindow, 0, 0, LOWORD(lParam), HIWORD(lParam), 1); break; default: break; } return DefMDIChildProc(hwnd, iMessage, wParam, lParam); }
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); }
LRESULT CALLBACK WatchWndProc(HWND hwnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { static int selected; static POINT menupos; static char buf[256]; RECT r, *pr; WINDOWPOS wp; HD_ITEM hie; HD_LAYOUT hdl; NMHDR *h; DRAWITEMSTRUCT *dr; HBITMAP hbmp; HDC hMemDC; TCHeader tch; TV_ITEM item; TV_INSERTSTRUCT t; static int sizingbottom; int offset; DEBUG_INFO *dbg; NM_TREEVIEW *nmt; VARINFO *var; HWND win; int level; int offset1; int doit; int i; CHARRANGE charrange; switch (iMessage) { case WM_SYSCOMMAND: if (wParam == SC_CLOSE) { PostMessage(hwnd, WM_CLOSE, 0, 0); return 0; } break; case WM_NOTIFY: h = (NMHDR*)lParam; switch (h->code) { case TABN_SELECTED: { LSTABNOTIFY *p = (LSTABNOTIFY *)h; ShowWindow(hwndTree[selected], SW_HIDE); for (i=0; i < 4; i++) if (p->lParam == (LPARAM)hwndTree[i]) selected = i; ShowWindow(hwndTree[selected], SW_SHOW); break; } case NM_RCLICK: { HMENU menu = LoadMenuGeneric(hInstance, "WATCHMENU"); HMENU popup = GetSubMenu(menu, 0); InsertBitmapsInMenu(popup); GetCursorPos(&menupos); TrackPopupMenuEx(popup, TPM_BOTTOMALIGN | TPM_LEFTBUTTON, menupos.x, menupos.y, hwndFrame, NULL); DestroyMenu(menu); SetFocus(hwndTree[selected]); } return 0; case TVN_ITEMEXPANDING: nmt = h; if (nmt->action) { ExpandPointer((VARINFO*)nmt->itemNew.lParam, nmt->action, selected); } return 0; case TCN_EDITQUERY: nmt = h; item.mask = TVIF_PARAM; item.hItem = (HTREEITEM)nmt->itemNew.hItem; TreeView_GetItem(hwndTree[selected], &item); var = (VARINFO*)item.lParam; if (var->editable) { WatchValue(watchinfo_list[selected][var->watchindex].dbg_info, buf, var, TRUE); return buf; } return 0; case TCN_EDITDONE: nmt = h; item.mask = TVIF_PARAM; item.hItem = (HTREEITEM)nmt->itemNew.hItem; TreeView_GetItem(hwndTree[selected], &item); var = (VARINFO*)item.lParam; ChangeData(var, nmt->itemNew.pszText, selected); RefreshItems(selected); return 0; } break; case WM_CREATE: hwndWatch = hwnd; GetClientRect(hwnd, &r); valueBitmap = LoadImage(hInstance, "ID_VALUEBMP", IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS); itemBitmap = LoadImage(hInstance, "ID_ITEMBMP", IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS); tch.colText1 = "Item"; tch.colText2 = "Value"; tch.colBmp1 = itemBitmap; tch.colBmp2 = valueBitmap; hwndTabCtrl = CreateLsTabWindow(hwnd, TABS_BOTTOM | TABS_HOTTRACK | TABS_FLAT | WS_VISIBLE); tabNormalFont = CreateFontIndirect(&tabFontData); SendMessage(hwndTabCtrl, WM_SETFONT, (WPARAM)tabNormalFont, 0); r.bottom -= 25; for (i=3; i >0 ; i--) hwndTree[i] = CreateextTreeWindow(hwnd, WS_DLGFRAME | TCS_LINE, &r, &tch); hwndTree[0] = CreateextTreeWindow(hwnd, WS_DLGFRAME | TCS_LINE | WS_VISIBLE, &r, &tch); for (i=3; i >=0 ; i--) SendMessage(hwndTabCtrl, TABM_ADD, (WPARAM)nameTags[i], (LPARAM)hwndTree[i]); return 0; case WM_ADDWATCHINDIRECT: win = (HWND)wParam; doit = FALSE; SendMessage(win, EM_EXGETSEL, (WPARAM)0, (LPARAM) &charrange); if (charrange.cpMin == charrange.cpMax) { doit = SendMessage(win, WM_WORDUNDERPOINT, (WPARAM)&rightclickPos, (LPARAM)buf); if (!doit) { SendMessage(hwndFrame, IDM_ADDWATCH, 0, 0); break; } } else { if (charrange.cpMax - charrange.cpMin < sizeof(buf)) { SendMessage(win, EM_GETSELTEXT, 0, (LPARAM)buf); doit = TRUE ; } } if (doit) { var = EvalExpr(&dbg, activeScope, (char*) buf, TRUE); if (var) { AddItem(dbg, var, activeScope->address, selected); dmgrHideWindow(DID_WATCHWND, FALSE); break ; } } ExtendedMessageBox("Error", MB_SETFOREGROUND | MB_SYSTEMMODAL, "Symbol does not exist in this scope"); break; case WM_ADDWATCH: offset = wParam; if (!offset) { DeleteAllItems(selected); } else { var = EvalExpr(&dbg, activeScope, (char*) lParam, TRUE); if (var) { AddItem(dbg, var, activeScope->address, selected); dmgrHideWindow(DID_WATCHWND, FALSE); } } break; case WM_COMMAND: switch (wParam) { case ID_SETADDRESS: for (i=3; i >=0; i--) RefreshItems(i); InvalidateRect(hwndTree[selected], 0, 0); break; case IDM_DELETEWATCH: DeleteItem(&menupos, selected); break; case IDM_DELETEALLWATCH: DeleteAllItems(selected); break; } break; case WM_DESTROY: for (i=3; i >=0 ; i--) TreeView_DeleteAllItems(hwndTree[i]); for (i=3; i >=0 ; i--) DestroyWindow(hwndTree[i]); DeleteObject(valueBitmap); DeleteObject(itemBitmap); hwndWatch = 0; break; case WM_SIZE: r.left = 0; r.right = LOWORD(lParam); r.top = 0; r.bottom = HIWORD(lParam); MoveWindow(hwndTabCtrl, r.left, r.bottom - 24, r.right - r.left, 24, 1); for (i=3; i >=0 ; i--) MoveWindow(hwndTree[i], r.left, r.top, r.right - r.left, r.bottom - r.top - 25, 0); return 0; case WM_CLOSE: break; case WM_ACTIVATEME: SendMessage(GetParent(hwnd), WM_ACTIVATEME, 0, 0); break; } return DefWindowProc(hwnd, iMessage, wParam, lParam); }
LRESULT CALLBACK WatchWndProc(HWND hwnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { WATCHDATA *ptr; static POINT menupos; static char buf[256]; RECT r, *pr; WINDOWPOS wp; HD_ITEM hie; HD_LAYOUT hdl; NMHDR *h; DRAWITEMSTRUCT *dr; HBITMAP hbmp; HDC hMemDC; TCHeader tch; TV_ITEM item; TV_INSERTSTRUCT t; static int sizingbottom; int offset; DEBUG_INFO *dbg; NM_TREEVIEW *nmt; VARINFO *var; HWND win; int level; int offset1; int doit; int i; CHARRANGE charrange; switch (iMessage) { case WM_SYSCOMMAND: if (wParam == SC_CLOSE) { PostMessage(hwnd, WM_CLOSE, 0, 0); return 0; } break; case WM_NOTIFY: ptr = (WATCHDATA *)GetWindowLong(hwnd, 0); h = (NMHDR*)lParam; switch (h->code) { case NM_RCLICK: { if (ptr->DID != DID_LOCALSWND) { HMENU menu = LoadMenuGeneric(hInstance, "WATCHMENU"); HMENU popup = GetSubMenu(menu, 0); TV_HITTESTINFO t; HTREEITEM titem; GetCursorPos(&t.pt); ScreenToClient(ptr->hwndWatchTree, &t.pt); titem = TreeView_HitTest(ptr->hwndWatchTree, &t); if (!titem || TreeView_GetParent(ptr->hwndWatchTree, titem)) { EnableMenuItem(popup, IDM_DELETEWATCH, MF_GRAYED); } InsertBitmapsInMenu(popup); GetCursorPos(&menupos); TrackPopupMenuEx(popup, TPM_BOTTOMALIGN | TPM_LEFTBUTTON, menupos.x, menupos.y, hwndFrame, NULL); DestroyMenu(menu); lastWatch = ptr->DID; } SetFocus(ptr->hwndWatchTree); } return 0; case TVN_ITEMEXPANDING: nmt = (LPNMTREEVIEW)h; if (nmt->action) { ExpandPointer((VARINFO*)nmt->itemNew.lParam, nmt->action, ptr); } return 0; case TCN_EDITQUERY: nmt = (LPNMTREEVIEW)h; item.mask = TVIF_PARAM; item.hItem = (HTREEITEM)nmt->itemNew.hItem; TreeView_GetItem(ptr->hwndWatchTree, &item); var = (VARINFO*)item.lParam; if (var->editable) { WatchValue(ptr->watchinfo_list[var->watchindex].dbg_info, buf, var, TRUE); return buf; } return 0; case TCN_EDITDONE: nmt = (LPNMTREEVIEW)h; item.mask = TVIF_PARAM; item.hItem = (HTREEITEM)nmt->itemNew.hItem; TreeView_GetItem(ptr->hwndWatchTree, &item); var = (VARINFO*)item.lParam; ChangeData(var, nmt->itemNew.pszText, ptr); RefreshItems(ptr); return 0; } break; case WM_CREATE: ptr = (WATCHDATA *)calloc(sizeof(WATCHDATA),1); SetWindowLong(hwnd, 0, (long)ptr); GetClientRect(hwnd, &r); tch.colText1 = "Item"; tch.colText2 = "Value"; tch.colBmp1 = itemBitmap; tch.colBmp2 = valueBitmap; ptr->hwndWatchTree = CreateextTreeWindow(hwnd, WS_DLGFRAME | TCS_LINE | WS_VISIBLE, &r, &tch); return 0; case WM_ADDWATCHINDIRECT: ptr = (WATCHDATA *)GetWindowLong(hwnd, 0); win = (HWND)wParam; doit = FALSE; SendMessage(win, EM_EXGETSEL, (WPARAM)0, (LPARAM) &charrange); if (charrange.cpMin == charrange.cpMax) { doit = SendMessage(win, WM_WORDUNDERPOINT, (WPARAM)&rightclickPos, (LPARAM)buf); if (!doit) { PostMessage(hwndFrame, WM_COMMAND, IDM_ADDWATCH, 0); break; } } else { if (charrange.cpMax - charrange.cpMin < sizeof(buf) ||charrange.cpMin - charrange.cpMax < sizeof(buf)) { SendMessage(win, EM_GETSELTEXT, 0, (LPARAM)buf); doit = TRUE ; } } if (doit) { var = EvalExpr(&dbg, activeScope, (char*) buf, TRUE); if (var) { AddItem(dbg, var, activeScope->address, ptr); SelectWindow(ptr->DID); break ; } } ExtendedMessageBox("Error", MB_SETFOREGROUND | MB_SYSTEMMODAL, "Symbol does not exist in this scope"); break; case WM_ADDWATCH: ptr = (WATCHDATA *)GetWindowLong(hwnd, 0); offset = wParam; if (!offset) { DeleteAllItems(ptr); } else { var = EvalExpr(&dbg, activeScope, (char*) lParam, TRUE); if (var) { AddItem(dbg, var, activeScope->address, ptr); SelectWindow(ptr->DID); } } break; case WM_INITIALSTACK: ptr = (WATCHDATA *)GetWindowLong(hwnd, 0); ptr->refreshNeeded = TRUE; break; case WM_COMMAND: ptr = (WATCHDATA *)GetWindowLong(hwnd, 0); switch (wParam) { case ID_SETADDRESS: if (ptr->DID == DID_LOCALSWND) LoadLocals(ptr); if (ptr->refreshNeeded) ReloadVars(ptr); else RefreshItems(ptr); ptr->refreshNeeded = FALSE; InvalidateRect(ptr->hwndWatchTree, 0, 0); break; case IDM_DELETEWATCH: DeleteItem(&menupos, ptr); break; case IDM_DELETEALLWATCH: DeleteAllItems(ptr); break; } break; case WM_DESTROY: ptr = (WATCHDATA *)GetWindowLong(hwnd, 0); TreeView_DeleteAllItems(ptr->hwndWatchTree); DestroyWindow(ptr->hwndWatchTree); DeleteObject(valueBitmap); DeleteObject(itemBitmap); break; case WM_SIZE: ptr = (WATCHDATA *)GetWindowLong(hwnd, 0); r.left = 0; r.right = LOWORD(lParam); r.top = 0; r.bottom = HIWORD(lParam); MoveWindow(ptr->hwndWatchTree, r.left, r.top, r.right - r.left, r.bottom - r.top, 0); return 0; case WM_CLOSE: break; case WM_ACTIVATEME: ptr = (WATCHDATA *)GetWindowLong(hwnd, 0); if (ptr->DID != DID_LOCALSWND) lastWatch = ptr->DID; SendMessage(GetParent(hwnd), WM_ACTIVATEME, 0, 0); break; } return DefWindowProc(hwnd, iMessage, wParam, lParam); }