oleview: Added base menu funcionality.
diff --git a/programs/oleview/oleview.c b/programs/oleview/oleview.c
index 1a786e5..e7d442c 100644
--- a/programs/oleview/oleview.c
+++ b/programs/oleview/oleview.c
@@ -21,6 +21,7 @@
 #include "main.h"
 
 GLOBALS globals;
+static WCHAR wszRegEdit[] = { 'r','e','g','e','d','i','t','.','e','x','e','\0' };
 
 void ResizeChild(void)
 {
@@ -45,6 +46,178 @@
             client.right, client.bottom-tool.bottom-stat.bottom, TRUE);
 }
 
+void RefreshMenu(HTREEITEM item)
+{
+    TVITEM tvi;
+    HTREEITEM parent;
+    HMENU hMenu = GetMenu(globals.hMainWnd);
+
+    memset(&tvi, 0, sizeof(TVITEM));
+    tvi.hItem = item;
+    SendMessage(globals.hTree, TVM_GETITEM, 0, (LPARAM)&tvi);
+
+    SendMessage(globals.hToolBar, TB_ENABLEBUTTON, IDM_CREATEINST, FALSE);
+    SendMessage(globals.hToolBar, TB_ENABLEBUTTON, IDM_RELEASEINST, FALSE);
+    SendMessage(globals.hToolBar, TB_ENABLEBUTTON, IDM_VIEW, FALSE);
+
+    if(tvi.lParam && ((ITEM_INFO *)tvi.lParam)->cFlag&SHOWALL)
+    {
+        EnableMenuItem(hMenu, IDM_COPYCLSID, MF_ENABLED);
+        EnableMenuItem(hMenu, IDM_HTMLTAG, MF_ENABLED);
+        EnableMenuItem(hMenu, IDM_VIEW, MF_GRAYED);
+
+        if(!((ITEM_INFO *)tvi.lParam)->loaded)
+        {
+            EnableMenuItem(hMenu, IDM_CREATEINST, MF_ENABLED);
+            EnableMenuItem(hMenu, IDM_CREATEINSTON, MF_ENABLED);
+            EnableMenuItem(hMenu, IDM_RELEASEINST, MF_GRAYED);
+            SendMessage(globals.hToolBar, TB_ENABLEBUTTON, IDM_CREATEINST, TRUE);
+        }
+        else 
+        {
+            EnableMenuItem(hMenu, IDM_CREATEINST, MF_GRAYED);
+            EnableMenuItem(hMenu, IDM_CREATEINSTON, MF_GRAYED);
+            EnableMenuItem(hMenu, IDM_RELEASEINST, MF_ENABLED);
+            SendMessage(globals.hToolBar, TB_ENABLEBUTTON, IDM_RELEASEINST, TRUE);
+        }
+    }
+    else if(tvi.lParam && ((ITEM_INFO *)tvi.lParam)->cFlag&INTERFACE)
+    {
+        EnableMenuItem(hMenu, IDM_TYPEINFO, MF_GRAYED);
+        EnableMenuItem(hMenu, IDM_CREATEINST, MF_GRAYED);
+        EnableMenuItem(hMenu, IDM_CREATEINSTON, MF_GRAYED);
+        EnableMenuItem(hMenu, IDM_RELEASEINST, MF_GRAYED);
+        EnableMenuItem(hMenu, IDM_COPYCLSID, MF_ENABLED);
+        EnableMenuItem(hMenu, IDM_HTMLTAG, MF_GRAYED);
+        EnableMenuItem(hMenu, IDM_VIEW, MF_ENABLED);
+        SendMessage(globals.hToolBar, TB_ENABLEBUTTON, IDM_VIEW, TRUE);
+    }
+    else
+    {
+        EnableMenuItem(hMenu, IDM_TYPEINFO, MF_GRAYED);
+        EnableMenuItem(hMenu, IDM_CREATEINST, MF_GRAYED);
+        EnableMenuItem(hMenu, IDM_CREATEINSTON, MF_GRAYED);
+        EnableMenuItem(hMenu, IDM_RELEASEINST, MF_GRAYED);
+        EnableMenuItem(hMenu, IDM_COPYCLSID, MF_GRAYED);
+        EnableMenuItem(hMenu, IDM_HTMLTAG, MF_GRAYED);
+        EnableMenuItem(hMenu, IDM_VIEW, MF_GRAYED);
+    }
+    parent = TreeView_GetParent(globals.hTree, item);
+    if(parent==tree.hAID || parent==tree.hGBCC)
+        EnableMenuItem(hMenu, IDM_COPYCLSID, MF_ENABLED);
+}
+
+int MenuCommand(WPARAM wParam, HWND hWnd)
+{
+    BOOL vis;
+    HTREEITEM hSelect;
+    WCHAR wszAbout[MAX_LOAD_STRING];
+    WCHAR wszAboutVer[MAX_LOAD_STRING];
+
+    switch(wParam)
+    {
+        case IDM_ABOUT:
+            LoadString(globals.hMainInst, IDS_ABOUT, wszAbout,
+                    sizeof(WCHAR[MAX_LOAD_STRING]));
+            LoadString(globals.hMainInst, IDS_ABOUTVER, wszAboutVer,
+                    sizeof(WCHAR[MAX_LOAD_STRING]));
+            ShellAbout(hWnd, wszAbout, wszAboutVer, NULL);
+            break;
+        case IDM_CREATEINST:
+            hSelect = TreeView_GetSelection(globals.hTree);
+            CreateInst(hSelect);
+            SendMessage(globals.hTree, TVM_EXPAND, TVE_EXPAND, (LPARAM)hSelect);
+            break;
+        case IDM_RELEASEINST:
+            hSelect = TreeView_GetSelection(globals.hTree);
+            ReleaseInst(hSelect);
+            RefreshMenu(hSelect);
+            break;
+        case IDM_EXPERT:
+            globals.bExpert = !globals.bExpert;
+            CheckMenuItem(GetMenu(hWnd), LOWORD(wParam),
+                    globals.bExpert ? MF_CHECKED : MF_UNCHECKED);
+            EmptyTree();
+            if(globals.bExpert) AddTreeEx();
+            else AddTree();
+            hSelect = TreeView_GetChild(globals.hTree, TVI_ROOT);
+            SendMessage(globals.hTree, TVM_SELECTITEM, 0, (LPARAM)hSelect);
+            RefreshMenu(hSelect);
+            break;
+        case IDM_FLAG_INSERV:
+            vis = globals.dwClsCtx&CLSCTX_INPROC_SERVER;
+            globals.dwClsCtx = globals.dwClsCtx&(~CLSCTX_INPROC_SERVER);
+            globals.dwClsCtx = globals.dwClsCtx|((~vis)&CLSCTX_INPROC_SERVER);
+            if(!globals.dwClsCtx) globals.dwClsCtx = vis;
+            else CheckMenuItem(GetMenu(hWnd), LOWORD(wParam),
+                    vis ? MF_UNCHECKED : MF_CHECKED);
+            break;
+        case IDM_FLAG_INHANDL:
+            vis = globals.dwClsCtx&CLSCTX_INPROC_HANDLER;
+            globals.dwClsCtx = globals.dwClsCtx&(~CLSCTX_INPROC_HANDLER);
+            globals.dwClsCtx = globals.dwClsCtx|((~vis)&CLSCTX_INPROC_HANDLER);
+            if(!globals.dwClsCtx) globals.dwClsCtx = vis;
+            else CheckMenuItem(GetMenu(hWnd), LOWORD(wParam),
+                    vis ? MF_UNCHECKED : MF_CHECKED);
+            break;
+        case IDM_FLAG_LOCSERV:
+            vis = globals.dwClsCtx&CLSCTX_LOCAL_SERVER;
+            globals.dwClsCtx = globals.dwClsCtx&(~CLSCTX_LOCAL_SERVER);
+            globals.dwClsCtx = globals.dwClsCtx|((~vis)&CLSCTX_LOCAL_SERVER);
+            if(!globals.dwClsCtx) globals.dwClsCtx = vis;
+            else CheckMenuItem(GetMenu(hWnd), LOWORD(wParam),
+                    vis ? MF_UNCHECKED : MF_CHECKED);
+            break;
+        case IDM_FLAG_REMSERV:
+            vis = globals.dwClsCtx&CLSCTX_REMOTE_SERVER;
+            globals.dwClsCtx = globals.dwClsCtx&(~CLSCTX_REMOTE_SERVER);
+            globals.dwClsCtx = globals.dwClsCtx|((~vis)&CLSCTX_REMOTE_SERVER);
+            if(!globals.dwClsCtx) globals.dwClsCtx = vis;
+            else CheckMenuItem(GetMenu(hWnd), LOWORD(wParam),
+                    vis ? MF_UNCHECKED : MF_CHECKED);
+            break;
+        case IDM_REFRESH:
+            EmptyTree();
+            if(globals.bExpert) AddTreeEx();
+            else AddTree();
+            hSelect = TreeView_GetChild(globals.hTree, TVI_ROOT);
+            SendMessage(globals.hTree, TVM_SELECTITEM, 0, (LPARAM)hSelect);
+            RefreshMenu(hSelect);
+            break;
+        case IDM_REGEDIT:
+        {
+            STARTUPINFO si;
+            PROCESS_INFORMATION pi;
+
+            memset(&si, 0, sizeof(si));
+            si.cb = sizeof(si);
+            CreateProcess(NULL, wszRegEdit, NULL, NULL, FALSE, 0,\
+                    NULL, NULL, &si, &pi);
+            CloseHandle(pi.hProcess);
+            CloseHandle(pi.hThread);
+            break;
+        }
+        case IDM_STATUSBAR:
+            vis = IsWindowVisible(globals.hStatusBar);
+            ShowWindow(globals.hStatusBar, vis ? SW_HIDE : SW_SHOW);
+            CheckMenuItem(GetMenu(hWnd), LOWORD(wParam),
+                    vis ? MF_UNCHECKED : MF_CHECKED);
+            ResizeChild();
+            break;
+        case IDM_TOOLBAR:
+            vis = IsWindowVisible(globals.hToolBar);
+            ShowWindow(globals.hToolBar, vis ? SW_HIDE : SW_SHOW);
+            CheckMenuItem(GetMenu(hWnd), LOWORD(wParam),
+                    vis ? MF_UNCHECKED : MF_CHECKED);
+            ResizeChild();
+            break;
+        case IDM_EXIT:
+            DestroyWindow(hWnd);
+            break;
+    }
+    return 0;
+}
+
 void UpdateStatusBar(int itemID)
 {
     WCHAR info[MAX_LOAD_STRING];
@@ -67,6 +240,9 @@
             SetLeft(globals.hPaneWnd, CreateTreeWindow(globals.hMainInst));
             SetFocus(globals.hTree);
             break;
+        case WM_COMMAND:
+            MenuCommand(LOWORD(wParam), hWnd);
+            break;
         case WM_DESTROY:
             OleUninitialize();
             EmptyTree();
@@ -143,6 +319,7 @@
 
     globals.hMainWnd = hWnd;
     globals.hMainInst = hInst;
+    globals.bExpert = TRUE;
     globals.dwClsCtx = CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER;
 
     ShowWindow(hWnd, nCmdShow);