-////////////////////////////////////////////////////////\r
-//\r
-// main.cpp\r
-// \r
-// Implementation of the Package Manager GUI\r
-//\r
-//\r
-// Maarten Bosma, 09.01.2004\r
-// maarten.paul@bosma.de\r
-//\r
-////////////////////////////////////////////////////////////////////\r
-\r
-#include "main.h"\r
-\r
-\r
-// Application's Entry Point\r
-int WINAPI WinMain (HINSTANCE hinst, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)\r
-{\r
- HWND hwnd;\r
- MSG msg;\r
- WNDCLASSEX wc = {0};\r
-\r
- // Window creation\r
- wc.cbSize = sizeof(WNDCLASSEX); \r
- wc.lpszClassName = L"pgkmgr";\r
- wc.style = CS_HREDRAW | CS_VREDRAW;\r
- wc.lpfnWndProc = (WNDPROC)WndProc;\r
- wc.hInstance = hinst;\r
- wc.hIcon = LoadIcon(hinst, MAKEINTRESOURCE(IDI_MAIN));\r
- wc.hbrBackground = (HBRUSH)(COLOR_SCROLLBAR);\r
-\r
- RegisterClassEx(&wc);\r
-\r
- hwnd = CreateWindow(L"pgkmgr",\r
- L"ReactOS - Package Manager v0.3",\r
- WS_OVERLAPPEDWINDOW,\r
- CW_USEDEFAULT, \r
- CW_USEDEFAULT, \r
- 500, 600, \r
- NULL, NULL,\r
- hinst, \r
- NULL);\r
-\r
-\r
- // Toolbar creation\r
- InitCommonControls();\r
-\r
- hTBar = CreateToolbarEx(hwnd, WS_CHILD|WS_VISIBLE|TBSTYLE_FLAT, 0, 8, hinst, IDB_TOOLBAR, \r
- Buttons, sizeof(Buttons)/sizeof(TBBUTTON), TBSIZE, TBSIZE, TBSIZE, TBSIZE, sizeof(TBBUTTON));\r
-\r
- // Show the windows\r
- ShowWindow(hwnd, SW_SHOW);\r
- UpdateWindow(hwnd);\r
-\r
- // Load the tree\r
- int error = PML_LoadTree(&tree, "tree.xml", AddItem);\r
- \r
- if(error)\r
- {\r
- MessageBox(0,PML_TransError(error),0,0);\r
- return 0;\r
- }\r
- \r
- // Read the help\r
- Help();\r
-\r
- // Start getting messages\r
- while(GetMessage(&msg,NULL,0,0))\r
- {\r
- if(!TranslateAccelerator(hwnd, hHotKeys, &msg))\r
- {\r
- TranslateMessage(&msg);\r
- DispatchMessage(&msg);\r
- }\r
- }\r
- \r
- // Close our handle\r
- PML_CloseTree (tree);\r
-\r
- return 0;\r
-}\r
-\r
-// Add a item to our tree\r
-int AddItem (int id, const char* name, int parent, int icon)\r
-{ \r
- TV_INSERTSTRUCT tvins; \r
-\r
- tvins.item.lParam = (UINT)id;\r
- tvins.item.mask = TVIF_TEXT|TVIF_PARAM;\r
- tvins.item.pszText = (WCHAR*)name; //that is ok\r
- tvins.item.cchTextMax = strlen(name); \r
- tvins.hInsertAfter = TVI_LAST;\r
-\r
- if(icon)\r
- {\r
- tvins.item.iImage = icon;\r
- tvins.item.iSelectedImage = icon;\r
- tvins.item.mask |= TVIF_IMAGE | TVIF_SELECTEDIMAGE;\r
- }\r
-\r
- if (parent==0)\r
- tvins.hParent = TVI_ROOT;\r
- else\r
- tvins.hParent = nodes[parent];\r
-\r
- nodes[id] = (HTREEITEM)SendMessage(hTree, TVM_INSERTITEMA, 0, (LPARAM)&tvins);\r
-\r
- return 0;\r
-} \r
-\r
-// Load the Help from file and display it\r
-void Help (void)\r
-{\r
- int i;\r
- char buffer [2000];\r
- FILE* file = fopen ("help.txt", "r");\r
-\r
- if(!file)\r
- return;\r
-\r
- for(i=0; i<2000; i++)\r
- {\r
- buffer[i] = getc(file);\r
- if(buffer[i]==EOF) break;\r
- }\r
- buffer[i] = 0;\r
-\r
- SetText(buffer);\r
-}\r
-\r
-// Create our Controls\r
-void InitControls (HWND hwnd)\r
-{\r
-\r
- HINSTANCE hinst = GetModuleHandle(NULL);\r
-\r
- // Create the controls\r
- hTree = CreateWindowEx(0, WC_TREEVIEW, L"TreeView", WS_CHILD|WS_VISIBLE|WS_BORDER|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS, \r
- 0, 0, 0, 0, hwnd, NULL, hinst, NULL);\r
-\r
- hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, L"edit", PML_TransError(IDS_LOAD), WS_CHILD|WS_VISIBLE|ES_MULTILINE, \r
- 0, 0, 100, 100, hwnd, NULL, hinst, NULL);\r
- \r
- hPopup = LoadMenu(hinst, MAKEINTRESOURCE(IDR_POPUP));\r
-\r
- // Create Tree Icons\r
- HIMAGELIST hIcon = ImageList_Create(16,16,ILC_COLOR32,1,1); \r
- SendMessage(hTree, TVM_SETIMAGELIST, TVSIL_NORMAL, (LPARAM)(HIMAGELIST)hIcon);\r
- \r
- ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(1))); \r
- ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(11))); \r
- ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(12))); \r
- ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(13))); \r
- ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(14))); \r
-\r
- ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(2))); \r
- ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(3))); \r
- ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(4))); \r
- ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(5))); \r
- ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(6))); \r
- ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(7))); \r
- ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(8))); \r
- ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(9))); \r
- ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(10))); \r
-\r
- // Setup Hotkeys\r
- hHotKeys = LoadAccelerators (hinst, MAKEINTRESOURCE(IDR_HOTKEYS));\r
-}\r
-\r
-// Set the Icons\r
-int SetIcon (int id, int icon) \r
-{\r
- TVITEMEX item;\r
- \r
- item.hItem = nodes[id];\r
- item.iImage = icon;\r
- item.iSelectedImage = icon;\r
- item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;\r
-\r
- TreeView_SetItem(hTree, &item);\r
-\r
- return 1;\r
-}\r
-\r
-// Set the Icons\r
-int Ask (const WCHAR* message) \r
-{ \r
- int ans = MessageBox (0,message,0,MB_YESNO);\r
-\r
- if(ans == IDYES)\r
- return 1;\r
-\r
- return 0;\r
-}\r
-\r
-// En- or Disable a Button inside of the toolbar and the Context Menu\r
-int SetButton (DWORD id, BOOL state) \r
-{\r
- // Change the Toorbar Button\r
- TBBUTTONINFO ti;\r
-\r
- ti.cbSize = sizeof (ti);\r
- ti.dwMask = TBIF_STATE;\r
-/*\r
- if(state&&id==1)\r
- MessageBox(0,L"on",0,0);\r
- else if(!state&&id==1)\r
- MessageBox(0,L"off",0,0);\r
-*/\r
- if(state)\r
- ti.fsState = TBSTATE_ENABLED;\r
- else\r
- ti.fsState = TBSTATE_INDETERMINATE;\r
-\r
- SendMessage (hTBar, TB_SETBUTTONINFO, id, (LPARAM)&ti);\r
-\r
- // Change the Context Menu item\r
- MENUITEMINFO mi;\r
-\r
- mi.cbSize = sizeof (mi);\r
- mi.fMask = MIIM_STATE;\r
-\r
- if(state)\r
- mi.fState = MFS_ENABLED;\r
-\r
- else\r
- mi.fState = MFS_GRAYED;\r
-\r
- SetMenuItemInfo(hPopup, id, FALSE, &mi);\r
-\r
- return 0;\r
-}\r
-\r
-// Set the text of the text box\r
-int SetText (const char* text) \r
-{\r
- int i, j;\r
- char buffer [2000];\r
-\r
- if(!text)\r
- return 1;\r
-\r
- // the windows does not need "\n"\r
- // for new lines but "\r\n"\r
- for(i=0,j=0; text[i]; i++,j++)\r
- {\r
- buffer[j] = text[i];\r
- if(buffer[j] == '\n')\r
- {\r
- buffer[j] = '\r';\r
- buffer[++j] = '\n';\r
- }\r
- }\r
- buffer[j] = 0;\r
-\r
- SetWindowTextA(hEdit, buffer);\r
-\r
- return 0;\r
-}\r
-\r
-// Windows Message Callback (this is where most things happen)\r
-LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
- switch (message)\r
- {\r
- // at the very beginning ...\r
- case WM_CREATE:\r
- {\r
- InitControls(hwnd);\r
- } \r
- break;\r
-\r
- // calculate the size of the controls\r
- case WM_SIZE:\r
- {\r
- RECT rcl;\r
- SendMessage(hTBar, TB_AUTOSIZE, 0L, 0L);\r
- GetWindowRect(hTBar, &rcl);\r
-\r
- int win_top = rcl.bottom - rcl.top;\r
- int win_hight = HIWORD(lParam) - win_top;\r
-\r
- MoveWindow(hTree, 0, win_top, LOWORD(lParam), splitter_pos*win_hight/100, TRUE);\r
- MoveWindow(hEdit, 0, (splitter_pos*win_hight/100)+win_top, LOWORD(lParam), win_hight, TRUE);\r
- }\r
- break;\r
-\r
- // for the treeview\r
- case WM_NOTIFY:\r
- {\r
- if(((LPNMHDR)lParam)->code == TVN_SELCHANGED) \r
- {\r
- selected = ((LPNMTREEVIEW)lParam)->itemNew.lParam; \r
- PML_LoadPackage (tree, selected, SetButton);\r
- SetText(PML_GetDescription (tree, selected));\r
- }\r
-\r
- else if ((int)(((LPNMHDR)lParam)->code) == NM_RCLICK) // <= aarrggg LISP\r
- { \r
- // which item has been click on\r
- HTREEITEM item = TreeView_GetDropHilight(hTree);\r
-\r
- if(item != NULL)\r
- {\r
- // mark the one as seleacted\r
- SendMessage (hTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)item);\r
- TreeView_EnsureVisible (hTree, item);\r
- }\r
-\r
- // create the context menu\r
- if(selected != 0)\r
- {\r
- POINT pt;\r
- GetCursorPos (&pt);\r
- TrackPopupMenu (GetSubMenu(hPopup, 0), 0, (UINT)pt.x, (UINT)pt.y, 0, hwnd, NULL);\r
- }\r
- }\r
- }\r
- break;\r
-\r
- // for the toolbar\r
- case WM_COMMAND:\r
- {\r
- // All Actions\r
- if(LOWORD(wParam) <= 5 && LOWORD(wParam) >= 1)\r
- {\r
- if(selected)\r
- if(PML_SetAction(tree, selected, LOWORD(wParam)-1, SetIcon, Ask) == ERR_OK)\r
- break;\r
-\r
- MessageBeep(MB_ICONHAND);\r
- }\r
-\r
- // DoIt\r
- else if(LOWORD(wParam)==6)\r
- {\r
- if(PML_DoIt(tree, SetStatus, Ask) == ERR_OK)\r
- DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DOIT), hwnd, StatusProc);\r
- else\r
- MessageBeep(MB_ICONHAND);\r
- }\r
-\r
- // Help\r
- else if(LOWORD(wParam)==7)\r
- Help();\r
-\r
- // Options\r
- else if(LOWORD(wParam)==8)\r
- DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_OPTIONS), hwnd, OptionsProc);\r
- }\r
- break;\r
-\r
- // prozess hotkeys\r
- case WM_HOTKEY:\r
- {\r
- if(PML_SetAction(tree, selected, wParam, SetIcon, Ask) != ERR_OK)\r
- MessageBeep(MB_ICONHAND);\r
- }\r
- break;\r
-\r
- // ... at the very end\r
- case WM_DESTROY:\r
- {\r
- PostQuitMessage(0);\r
- return 0;\r
- }\r
- }\r
-\r
- return DefWindowProc (hwnd, message, wParam, lParam);\r
-}\r
-\r
-// Warning: This function is called from another thread\r
-int SetStatus (int status1, int status2, WCHAR* text)\r
-{\r
- // Set the Rage to 1000\r
- SendMessage(GetDlgItem(hStatus, IDC_STATUS1), PBM_SETRANGE32, 0, 1000);\r
- SendMessage(GetDlgItem(hStatus, IDC_STATUS2), PBM_SETRANGE32, 0, 1000);\r
-\r
- // The prozessbars and the text filds\r
- if(text)\r
- SetDlgItemText(hStatus, IDC_TSTATUS, text);\r
-\r
- if(status1!=-1)\r
- SendMessage(GetDlgItem(hStatus, IDC_STATUS1), PBM_SETPOS, status1, 0);\r
-\r
- if(status2!=-1)\r
- SendMessage(GetDlgItem(hStatus, IDC_STATUS2), PBM_SETPOS, status2, 0);\r
-\r
- // If the Status is 1000 very thing is done\r
- if(status1==1000)\r
- {\r
- EndDialog(hStatus, TRUE);\r
- MessageBox(0,PML_TransError(status2),0,0);\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-// Callback for the Status Dialog\r
-INT_PTR CALLBACK StatusProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)\r
-{\r
- switch (msg)\r
- {\r
- case WM_INITDIALOG:\r
- {\r
- hStatus = hwnd;\r
- \r
- } break;\r
-\r
- case WM_COMMAND: // can only be the about button\r
- case WM_CLOSE: // the close-window-[x]\r
- {\r
- PML_Abort();\r
- EndDialog(hwnd, TRUE);\r
- return 0;\r
- }\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-// Callback for the Options Dialog\r
-INT_PTR CALLBACK OptionsProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)\r
-{\r
- switch (msg)\r
- {\r
- case WM_CLOSE:\r
- EndDialog(hwnd, TRUE);\r
- return 0;\r
- }\r
-\r
- return 0;\r
-}\r
+////////////////////////////////////////////////////////
+//
+// main.cpp
+//
+// Implementation of the Package Manager GUI
+//
+//
+// Maarten Bosma, 09.01.2004
+// maarten.paul@bosma.de
+//
+////////////////////////////////////////////////////////////////////
+
+#include "main.h"
+
+// This is the struct where the toolbar is defined
+const TBBUTTON Buttons [] =
+{
+ {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP},
+
+ {0, 1, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON}, // No Action
+ {1, 2, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON}, // Install
+ {2, 3, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON}, // Install from source
+ {3, 4, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON}, // Update
+ {4, 5, TBSTATE_INDETERMINATE, TBSTYLE_BUTTON}, // Unistall
+
+ {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP},
+ {5, 6, TBSTATE_ENABLED, TBSTYLE_BUTTON}, // DoIt (tm)
+ {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP},
+
+ {6, 7, TBSTATE_ENABLED, TBSTYLE_BUTTON}, // Help
+ {7, 8, TBSTATE_ENABLED, TBSTYLE_BUTTON}, // Options
+
+ {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP},
+};
+
+
+// Application's Entry Point
+int WINAPI WinMain (HINSTANCE hinst, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
+{
+ HWND hwnd;
+ MSG msg;
+ WNDCLASSEX wc = {0};
+ WCHAR errbuf[2000];
+
+ // Window creation
+ wc.cbSize = sizeof(WNDCLASSEX);
+ wc.lpszClassName = L"pgkmgr";
+ wc.style = CS_HREDRAW | CS_VREDRAW;
+ wc.lpfnWndProc = (WNDPROC)WndProc;
+ wc.hInstance = hinst;
+ wc.hIcon = LoadIcon(hinst, MAKEINTRESOURCE(IDI_MAIN));
+ wc.hbrBackground = (HBRUSH)(COLOR_SCROLLBAR);
+
+ RegisterClassEx(&wc);
+
+ hwnd = CreateWindow(L"pgkmgr",
+ L"ReactOS - Package Manager v0.3",
+ WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ 500, 600,
+ NULL, NULL,
+ hinst,
+ NULL);
+
+
+ // Toolbar creation
+ InitCommonControls();
+
+ hTBar = CreateToolbarEx(hwnd, WS_CHILD|WS_VISIBLE|TBSTYLE_FLAT, 0, 8, hinst, IDB_TOOLBAR,
+ Buttons, sizeof(Buttons)/sizeof(TBBUTTON), TBSIZE, TBSIZE, TBSIZE, TBSIZE, sizeof(TBBUTTON));
+
+ // Show the windows
+ ShowWindow(hwnd, SW_SHOW);
+ UpdateWindow(hwnd);
+
+ // Load the tree
+ int error = PML_LoadTree(&tree, "tree.xml", AddItem);
+
+ if(error)
+ {
+ MessageBox(0,PML_TransError(error, (WCHAR*)errbuf, sizeof(errbuf)/sizeof(WCHAR)),0,0);
+ return 0;
+ }
+
+ // Read the help
+ Help();
+
+ // Start getting messages
+ while(GetMessage(&msg,NULL,0,0))
+ {
+ if(!TranslateAccelerator(hwnd, hHotKeys, &msg))
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+ }
+
+ // Close our handle
+ PML_CloseTree (tree);
+
+ return 0;
+}
+
+// Add a item to our tree
+int AddItem (int id, const char* name, int parent, int icon)
+{
+ TV_INSERTSTRUCT tvins;
+
+ tvins.item.lParam = (UINT)id;
+ tvins.item.mask = TVIF_TEXT|TVIF_PARAM;
+ tvins.item.pszText = (WCHAR*)name; //that is ok
+ tvins.item.cchTextMax = strlen(name);
+ tvins.hInsertAfter = TVI_LAST;
+
+ if(icon)
+ {
+ tvins.item.iImage = icon;
+ tvins.item.iSelectedImage = icon;
+ tvins.item.mask |= TVIF_IMAGE | TVIF_SELECTEDIMAGE;
+ }
+
+ if (parent==0)
+ tvins.hParent = TVI_ROOT;
+ else
+ tvins.hParent = nodes[parent];
+
+ nodes[id] = (HTREEITEM)SendMessage(hTree, TVM_INSERTITEMA, 0, (LPARAM)&tvins);
+
+ return 0;
+}
+
+// Load the Help from file and display it
+void Help (void)
+{
+ int i;
+ char buffer [2000];
+ FILE* file = fopen ("help.txt", "r");
+
+ if(!file)
+ return;
+
+ for(i=0; i<2000; i++)
+ {
+ buffer[i] = getc(file);
+ if(buffer[i]==EOF) break;
+ }
+ buffer[i] = 0;
+
+ SetText(buffer);
+}
+
+// Create our Controls
+void InitControls (HWND hwnd)
+{
+
+ HINSTANCE hinst = GetModuleHandle(NULL);
+ WCHAR errbuf[2000];
+
+ // Create the controls
+ hTree = CreateWindowEx(0, WC_TREEVIEW, L"TreeView", WS_CHILD|WS_VISIBLE|WS_BORDER|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS,
+ 0, 0, 0, 0, hwnd, NULL, hinst, NULL);
+
+ hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, L"edit", PML_TransError(IDS_LOAD, (WCHAR*)errbuf, sizeof(errbuf)/sizeof(WCHAR)), WS_CHILD|WS_VISIBLE|ES_MULTILINE,
+ 0, 0, 100, 100, hwnd, NULL, hinst, NULL);
+
+ hPopup = LoadMenu(hinst, MAKEINTRESOURCE(IDR_POPUP));
+
+ // Create Tree Icons
+ HIMAGELIST hIcon = ImageList_Create(16,16,ILC_COLOR32,1,1);
+ SendMessage(hTree, TVM_SETIMAGELIST, TVSIL_NORMAL, (LPARAM)(HIMAGELIST)hIcon);
+
+ ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(1)));
+ ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(11)));
+ ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(12)));
+ ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(13)));
+ ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(14)));
+
+ ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(2)));
+ ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(3)));
+ ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(4)));
+ ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(5)));
+ ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(6)));
+ ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(7)));
+ ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(8)));
+ ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(9)));
+ ImageList_AddIcon(hIcon, LoadIcon(hinst, MAKEINTRESOURCE(10)));
+
+ // Setup Hotkeys
+ hHotKeys = LoadAccelerators (hinst, MAKEINTRESOURCE(IDR_HOTKEYS));
+}
+
+// Set the Icons
+int SetIcon (int id, int icon)
+{
+ TVITEMEX item;
+
+ item.hItem = nodes[id];
+ item.iImage = icon;
+ item.iSelectedImage = icon;
+ item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
+
+ TreeView_SetItem(hTree, &item);
+
+ return 1;
+}
+
+// Set the Icons
+int Ask (const WCHAR* message)
+{
+ int ans = MessageBox (0,message,0,MB_YESNO);
+
+ if(ans == IDYES)
+ return 1;
+
+ return 0;
+}
+
+// En- or Disable a Button inside of the toolbar and the Context Menu
+int SetButton (DWORD id, BOOL state)
+{
+ // Change the Toorbar Button
+ TBBUTTONINFO ti;
+
+ ti.cbSize = sizeof (ti);
+ ti.dwMask = TBIF_STATE;
+
+ if(state)
+ ti.fsState = TBSTATE_ENABLED;
+ else
+ ti.fsState = TBSTATE_INDETERMINATE;
+
+ SendMessage (hTBar, TB_SETBUTTONINFO, id, (LPARAM)&ti);
+
+ // Change the Context Menu item
+ MENUITEMINFO mi;
+
+ mi.cbSize = sizeof (mi);
+ mi.fMask = MIIM_STATE;
+
+ if(state)
+ mi.fState = MFS_ENABLED;
+
+ else
+ mi.fState = MFS_GRAYED;
+
+ SetMenuItemInfo(hPopup, id, FALSE, &mi);
+
+ return 0;
+}
+
+// Set the text of the text box
+int SetText (const char* text)
+{
+ int i, j;
+ char buffer [2000];
+
+ if(!text)
+ return 1;
+
+ // the windows does not need "\n"
+ // for new lines but "\r\n"
+ for(i=0,j=0; text[i]; i++,j++)
+ {
+ buffer[j] = text[i];
+ if(buffer[j] == '\n')
+ {
+ buffer[j] = '\r';
+ buffer[++j] = '\n';
+ }
+ }
+ buffer[j] = 0;
+
+ SetWindowTextA(hEdit, buffer);
+
+ return 0;
+}
+
+// Windows Message Callback (this is where most things happen)
+LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch (message)
+ {
+ // at the very beginning ...
+ case WM_CREATE:
+ {
+ InitControls(hwnd);
+ }
+ break;
+
+ // calculate the size of the controls
+ case WM_SIZE:
+ {
+ RECT rcl;
+ SendMessage(hTBar, TB_AUTOSIZE, 0L, 0L);
+ GetWindowRect(hTBar, &rcl);
+
+ int win_top = rcl.bottom - rcl.top;
+ int win_hight = HIWORD(lParam) - win_top;
+
+ MoveWindow(hTree, 0, win_top, LOWORD(lParam), splitter_pos*win_hight/100, TRUE);
+ MoveWindow(hEdit, 0, (splitter_pos*win_hight/100)+win_top, LOWORD(lParam), win_hight, TRUE);
+ }
+ break;
+
+ // for the treeview
+ case WM_NOTIFY:
+ {
+ if(((LPNMHDR)lParam)->code == TVN_SELCHANGED)
+ {
+ selected = ((LPNMTREEVIEW)lParam)->itemNew.lParam;
+ PML_LoadPackage (tree, selected, SetButton);
+ SetText(PML_GetDescription (tree, selected));
+ }
+
+ else if ((int)(((LPNMHDR)lParam)->code) == NM_RCLICK) // <= aarrggg LISP
+ {
+ // which item has been click on
+ HTREEITEM item = TreeView_GetDropHilight(hTree);
+
+ if(item != NULL)
+ {
+ // mark the one as seleacted
+ SendMessage (hTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)item);
+ TreeView_EnsureVisible (hTree, item);
+ }
+
+ // create the context menu
+ if(selected != 0)
+ {
+ POINT pt;
+ GetCursorPos (&pt);
+ TrackPopupMenu (GetSubMenu(hPopup, 0), 0, (UINT)pt.x, (UINT)pt.y, 0, hwnd, NULL);
+ }
+ }
+ }
+ break;
+
+ // for the toolbar
+ case WM_COMMAND:
+ {
+ // All Actions
+ if(LOWORD(wParam) <= 5 && LOWORD(wParam) >= 1)
+ {
+ if(selected)
+ if(PML_SetAction(tree, selected, LOWORD(wParam)-1, SetIcon, Ask) == ERR_OK)
+ break;
+
+ MessageBeep(MB_ICONHAND);
+ }
+
+ // DoIt
+ else if(LOWORD(wParam)==6)
+ {
+ if(PML_DoIt(tree, SetStatus, Ask) == ERR_OK)
+ DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DOIT), hwnd, StatusProc);
+ else
+ MessageBeep(MB_ICONHAND);
+ }
+
+ // Help
+ else if(LOWORD(wParam)==7)
+ Help();
+
+ // Options
+ else if(LOWORD(wParam)==8)
+ DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_OPTIONS), hwnd, OptionsProc);
+ }
+ break;
+
+ // prozess hotkeys
+ case WM_HOTKEY:
+ {
+ if(PML_SetAction(tree, selected, wParam, SetIcon, Ask) != ERR_OK)
+ MessageBeep(MB_ICONHAND);
+ }
+ break;
+
+ // ... at the very end
+ case WM_DESTROY:
+ {
+ PostQuitMessage(0);
+ return 0;
+ }
+ }
+
+ return DefWindowProc (hwnd, message, wParam, lParam);
+}
+
+// Warning: This function is called from another thread
+int SetStatus (int status1, int status2, WCHAR* text)
+{
+ WCHAR errbuf[2000];
+
+ // Set the Rage to 1000
+ SendMessage(GetDlgItem(hStatus, IDC_STATUS1), PBM_SETRANGE32, 0, 1000);
+ SendMessage(GetDlgItem(hStatus, IDC_STATUS2), PBM_SETRANGE32, 0, 1000);
+
+ // The prozessbars and the text filds
+ if(text)
+ SetDlgItemText(hStatus, IDC_TSTATUS, text);
+
+ if(status1!=-1)
+ SendMessage(GetDlgItem(hStatus, IDC_STATUS1), PBM_SETPOS, status1, 0);
+
+ if(status2!=-1)
+ SendMessage(GetDlgItem(hStatus, IDC_STATUS2), PBM_SETPOS, status2, 0);
+
+ // If the Status is 1000 very thing is done
+ if(status1==1000)
+ {
+ EndDialog(hStatus, TRUE);
+ MessageBox(0,PML_TransError(status2, (WCHAR*)errbuf, sizeof(errbuf)/sizeof(WCHAR)),0,0);
+ }
+
+ return 0;
+}
+
+// Callback for the Status Dialog
+INT_PTR CALLBACK StatusProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ {
+ hStatus = hwnd;
+
+ } break;
+
+ case WM_COMMAND: // can only be the about button
+ case WM_CLOSE: // the close-window-[x]
+ {
+ PML_Abort();
+ EndDialog(hwnd, TRUE);
+ return 0;
+ }
+ }
+
+ return 0;
+}
+
+// Callback for the Options Dialog
+INT_PTR CALLBACK OptionsProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_CLOSE:
+ EndDialog(hwnd, TRUE);
+ return 0;
+ }
+
+ return 0;
+}