summaryrefslogtreecommitdiff
path: root/plugins/ShellExt/src/options.cpp
blob: d2b5f1cf7db362d75a5e53869389cdb78b5e53f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include "stdafx.h"
#include "resource.h"

static void AutoSize(HWND hwnd)
{
  HDC hDC = GetDC(hwnd);
  HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
  HFONT hOldFont = (HFONT)SelectObject(hDC, hFont);

  TCHAR szBuf[MAX_PATH];
  int i = GetWindowText(hwnd, szBuf, SIZEOF(szBuf));

  SIZE tS;
  GetTextExtentPoint32(hDC, szBuf, i, &tS);
  SelectObject(hDC, hOldFont);
  DeleteObject(hFont);
  ReleaseDC(hwnd, hDC);
  SetWindowPos(hwnd, HWND_BOTTOM, 0, 0, tS.cx + 10, tS.cy, SWP_NOMOVE | SWP_FRAMECHANGED);
}

////////////////////////////////////////////////////////////////////////////////////////////

static TCHAR* COM_OKSTR[2] = {
	LPGENT("Problem, registration missing/deleted."),
	LPGENT("Successfully created shell registration.") };
static TCHAR* COM_APPROVEDSTR[2] = { LPGENT("Not Approved"), LPGENT("Approved") };

static INT_PTR CALLBACK OptDialogProc(HWND hwndDlg, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
	int comReg, iCheck;
	TCHAR szBuf[MAX_PATH];

	switch(wMsg) {
	case WM_INITDIALOG:
      TranslateDialogDefault(hwndDlg);
      comReg = IsCOMRegistered();
		mir_sntprintf(szBuf, SIZEOF(szBuf), _T("%s (%s)"), 
			TranslateTS(COM_OKSTR[ (comReg & COMREG_OK) != 0 ]),
			TranslateTS(COM_APPROVEDSTR[ (comReg & COMREG_APPROVED) != 0 ]));
      SetDlgItemText(hwndDlg, IDC_STATUS, szBuf);
      // auto size the static windows to fit their text
      // they're rendering in a font not selected into the DC.
      AutoSize(GetDlgItem(hwndDlg, IDC_CAPMENUS));
      AutoSize(GetDlgItem(hwndDlg, IDC_CAPSTATUS));
      AutoSize(GetDlgItem(hwndDlg, IDC_CAPSHLSTATUS));
      // show all the options
      iCheck = db_get_b(0, SHLExt_Name, SHLExt_UseGroups, BST_UNCHECKED);
      CheckDlgButton(hwndDlg, IDC_USEGROUPS, iCheck ? BST_CHECKED : BST_UNCHECKED);
      EnableWindow(GetDlgItem(hwndDlg, IDC_CLISTGROUPS), iCheck = BST_CHECKED);
      CheckDlgButton(hwndDlg, IDC_CLISTGROUPS,
         db_get_b(0, SHLExt_Name, SHLExt_UseCListSetting, BST_UNCHECKED));
      CheckDlgButton(hwndDlg, IDC_NOPROF,
         db_get_b(0, SHLExt_Name, SHLExt_ShowNoProfile, BST_UNCHECKED));
      CheckDlgButton(hwndDlg, IDC_SHOWFULL,
         db_get_b(0, SHLExt_Name, SHLExt_UseHITContacts, BST_UNCHECKED));
      CheckDlgButton(hwndDlg, IDC_SHOWINVISIBLES,
         db_get_b(0, SHLExt_Name, SHLExt_UseHIT2Contacts, BST_UNCHECKED));
      CheckDlgButton(hwndDlg, IDC_USEOWNERDRAW,
         db_get_b(0, SHLExt_Name, SHLExt_ShowNoIcons, BST_UNCHECKED));
      CheckDlgButton(hwndDlg, IDC_HIDEOFFLINE,
         db_get_b(0, SHLExt_Name, SHLExt_ShowNoOffline, BST_UNCHECKED));
      // give the Remove button a Vista icon
      SendDlgItemMessage(hwndDlg, IDC_REMOVE, BCM_SETSHIELD, 0, 1);
		return TRUE;
	
  case WM_NOTIFY:
	  if (((LPNMHDR)lParam)->code == PSN_APPLY) {
		  db_set_b(0, SHLExt_Name, SHLExt_UseGroups,       IsDlgButtonChecked(hwndDlg, IDC_USEGROUPS));
		  db_set_b(0, SHLExt_Name, SHLExt_UseCListSetting, IsDlgButtonChecked(hwndDlg, IDC_CLISTGROUPS));
		  db_set_b(0, SHLExt_Name, SHLExt_ShowNoProfile,   IsDlgButtonChecked(hwndDlg, IDC_NOPROF));
		  db_set_b(0, SHLExt_Name, SHLExt_UseHITContacts,  IsDlgButtonChecked(hwndDlg, IDC_SHOWFULL));
		  db_set_b(0, SHLExt_Name, SHLExt_UseHIT2Contacts, IsDlgButtonChecked(hwndDlg, IDC_SHOWINVISIBLES));
		  db_set_b(0, SHLExt_Name, SHLExt_ShowNoIcons,     IsDlgButtonChecked(hwndDlg, IDC_USEOWNERDRAW));
		  db_set_b(0, SHLExt_Name, SHLExt_ShowNoOffline,   IsDlgButtonChecked(hwndDlg, IDC_HIDEOFFLINE));
	  }
	  break;

	case WM_COMMAND:
		// don't send the changed message if remove is clicked
		if ( LOWORD(wParam) != IDC_REMOVE)
			SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);

		switch( LOWORD(wParam)) {
		case IDC_USEGROUPS:
			EnableWindow(GetDlgItem(hwndDlg, IDC_CLISTGROUPS), BST_CHECKED == IsDlgButtonChecked(hwndDlg, IDC_USEGROUPS));
			break;
		case IDC_REMOVE:
			if (IDYES == MessageBox(0,
					TranslateT("Are you sure? This will remove all the settings stored in your database and all registry entries created for shlext to work with Explorer"),
					TranslateT("Disable/Remove shlext"), MB_YESNO | MB_ICONQUESTION)) {
				db_unset(0, SHLExt_Name, SHLExt_UseGroups);
				db_unset(0, SHLExt_Name, SHLExt_UseCListSetting);
				db_unset(0, SHLExt_Name, SHLExt_UseHITContacts);
				db_unset(0, SHLExt_Name, SHLExt_UseHIT2Contacts);
				db_unset(0, SHLExt_Name, SHLExt_ShowNoProfile);
				db_unset(0, SHLExt_Name, SHLExt_ShowNoIcons);
				db_unset(0, SHLExt_Name, SHLExt_ShowNoOffline);

				CheckUnregisterServer();
				SendMessage(hwndDlg, WM_INITDIALOG, 0, 0);
			}
		}
		break;
	}

	return 0;
}

int OnOptionsInit(WPARAM wParam, LPARAM lParam)
{
	OPTIONSDIALOGPAGE opt = { sizeof(opt) };
	opt.flags = ODPF_BOLDGROUPS;
	opt.pszGroup = "Services";
	opt.position = -1066;
	opt.pszTitle = "Shell context menus";
	opt.pszTemplate = MAKEINTRESOURCEA(IDD_SHLOPTS);
	opt.hInstance = hInst;
	opt.pfnDlgProc = OptDialogProc;
	Options_AddPage(wParam, &opt);
	return 0;
}