mirror of https://github.com/roytam1/kmeleon.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
762 lines
26 KiB
762 lines
26 KiB
/* |
|
* Copyright (C) 2002-2003 Ulf Erikson <ulferikson@fastmail.fm> |
|
* |
|
* This program is free software; you can redistribute it and/or modify |
|
* it under the terms of the GNU General Public License as published by |
|
* the Free Software Foundation; either version 2, or (at your option) |
|
* any later version. |
|
* |
|
* This program is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
* GNU General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU General Public License |
|
* along with this program; if not, write to the Free Software |
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
|
*/ |
|
|
|
#ifdef __MINGW32__ |
|
# define _WIN32_IE 0x0500 |
|
# include <windows.h> |
|
# include <commctrl.h> |
|
# include "../missing.h" |
|
#endif |
|
|
|
#define KMELEON_PLUGIN_EXPORTS |
|
#include "kmeleon_plugin.h" |
|
#include "Utils.h" |
|
#include "LocalesUtils.h" |
|
Locale *gLoc = NULL; |
|
|
|
#include <errno.h> |
|
|
|
#define WHERE |
|
#include "op_hotlist.h" |
|
|
|
BOOL APIENTRY DllMain ( |
|
HANDLE hModule, |
|
DWORD ul_reason_for_call, |
|
LPVOID lpReserved) { |
|
|
|
return TRUE; |
|
} |
|
|
|
LRESULT CALLBACK WndProc ( |
|
HWND hWnd, UINT message, |
|
WPARAM wParam, |
|
LPARAM lParam); |
|
|
|
void * KMeleonWndProc; |
|
|
|
int Load(); |
|
void Create(HWND parent); |
|
void Config(HWND parent); |
|
void Destroy(HWND hWnd); |
|
void Quit(); |
|
void DoMenu(HMENU menu, char *param); |
|
long DoMessage(const char *to, const char *from, const char *subject, long data1, long data2); |
|
void DoRebar(HWND rebarWnd); |
|
int DoAccel(char *param); |
|
|
|
kmeleonPlugin kPlugin = { |
|
KMEL_PLUGIN_VER, |
|
"Opera Hotlist Plugin", |
|
DoMessage |
|
}; |
|
|
|
void Setup() |
|
{ |
|
if (!bIgnore) { |
|
HBITMAP bitmap; |
|
int ilc_bits = ILC_COLOR; |
|
|
|
wchar_t szFullPath[MAX_PATH]; |
|
kPlugin.kFuncs->FindSkinFile(L"hotlist.bmp", szFullPath, MAX_PATH); |
|
FILE *fp = _wfopen(szFullPath, L"r"); |
|
if (fp) { |
|
fclose(fp); |
|
bitmap = (HBITMAP)LoadImageW(NULL, szFullPath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); |
|
} else { |
|
bitmap = LoadBitmap(kPlugin.hDllInstance, MAKEINTRESOURCE(IDB_IMAGES)); |
|
} |
|
|
|
BITMAP bmp; |
|
GetObject(bitmap, sizeof(BITMAP), &bmp); |
|
|
|
ilc_bits = (bmp.bmBitsPixel == 32 ? ILC_COLOR32 : (bmp.bmBitsPixel == 24 ? ILC_COLOR24 : (bmp.bmBitsPixel == 16 ? ILC_COLOR16 : (bmp.bmBitsPixel == 8 ? ILC_COLOR8 : (bmp.bmBitsPixel == 4 ? ILC_COLOR4 : ILC_COLOR))))); |
|
gImagelist = ImageList_Create(bmp.bmWidth/6, bmp.bmHeight, ILC_MASK | ilc_bits, 4, 4); |
|
if (gImagelist && bitmap) |
|
ImageList_AddMasked(gImagelist, bitmap, RGB(255, 0, 255)); |
|
if (bitmap) |
|
DeleteObject(bitmap); |
|
} |
|
} |
|
|
|
long DoMessage(const char *to, const char *from, const char *subject, long data1, long data2) |
|
{ |
|
if (to[0] == '*' || stricmp(to, kPlugin.dllname) == 0) { |
|
if (stricmp(subject, "Load") == 0) { |
|
Load(); |
|
} |
|
else if (strcmp(subject, "Create") == 0) { |
|
Create((HWND)data1); |
|
} |
|
else if (strcmp(subject, "Config") == 0) { |
|
Config((HWND)data1); |
|
} |
|
else if (strcmp(subject, "Destroy") == 0) { |
|
Destroy((HWND)data1); |
|
} |
|
else if (strcmp(subject, "Quit") == 0) { |
|
Quit(); |
|
} |
|
else if (strcmp(subject, "DoMenu") == 0) { |
|
DoMenu((HMENU)data1, (char *)data2); |
|
} |
|
else if (stricmp(subject, "DoRebar") == 0) { |
|
DoRebar((HWND)data1); |
|
} |
|
else if (strcmp(subject, "DoAccel") == 0) { |
|
*(int *)data2 = DoAccel((char *)data1); |
|
} |
|
else if (strcmp(subject, "AddLink") == 0) { |
|
addLink((char *)data1, (char *)data2); |
|
} |
|
else if (strcmp(subject, "FindNick") == 0) { |
|
if (data1 && data2) |
|
findNick((char *)data1, (char **)data2); |
|
} |
|
else if (strcmp(subject, "DoLocale") == 0) { |
|
if (gLoc) delete gLoc; |
|
gLoc = Locale::kmInit(&kPlugin); |
|
} |
|
else if (strcmp(subject, "Setup") == 0) { |
|
Setup(); |
|
} |
|
else return 0; |
|
|
|
return 1; |
|
} |
|
return 0; |
|
} |
|
|
|
BOOL BrowseForHotlist(char *file) |
|
{ |
|
OPENFILENAME ofn; |
|
ofn.lStructSize = sizeof(OPENFILENAME); |
|
ofn.hInstance = kPlugin.hDllInstance; |
|
ofn.hwndOwner = NULL; |
|
ofn.lpstrCustomFilter = NULL; |
|
ofn.nMaxCustFilter = 0; |
|
ofn.nFilterIndex = 1; |
|
ofn.lpstrFileTitle = NULL; |
|
ofn.nMaxFileTitle = MAX_PATH; |
|
ofn.lpstrInitialDir = NULL; |
|
ofn.nFileOffset = 0; |
|
ofn.nFileExtension = 0; |
|
ofn.lpstrDefExt = NULL; |
|
ofn.lCustData = 0; |
|
ofn.lpfnHook = NULL; |
|
ofn.lpTemplateName = NULL; |
|
ofn.lpstrFilter = HOTLIST_FILTER; |
|
ofn.lpstrFile = file; |
|
ofn.nMaxFile = MAX_PATH; |
|
ofn.Flags = OFN_PATHMUSTEXIST | OFN_LONGNAMES | OFN_EXPLORER | OFN_HIDEREADONLY; |
|
ofn.lpstrTitle = PLUGIN_NAME; |
|
|
|
if (file && GetOpenFileName(&ofn)) { |
|
return true; |
|
} |
|
else { |
|
return false; |
|
} |
|
} |
|
|
|
// HotlistFile Dialog function |
|
BOOL CALLBACK HotlistFileDlgProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { |
|
static int ret; |
|
|
|
switch (uMsg) { |
|
case WM_INITDIALOG: |
|
{ |
|
ret = 0; |
|
|
|
HDC hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); |
|
int nHSize = GetDeviceCaps(hdcScreen, HORZSIZE); |
|
int nVSize = GetDeviceCaps(hdcScreen, VERTSIZE); |
|
DeleteDC(hdcScreen); |
|
|
|
WINDOWPLACEMENT wp; |
|
wp.length = sizeof (WINDOWPLACEMENT); |
|
GetWindowPlacement(hWnd, &wp); |
|
|
|
int width = wp.rcNormalPosition.right - wp.rcNormalPosition.left; |
|
int height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top; |
|
|
|
wp.showCmd = SW_RESTORE; |
|
wp.rcNormalPosition.left = nHSize; |
|
wp.rcNormalPosition.top = nVSize; |
|
wp.rcNormalPosition.right = nHSize + width; |
|
wp.rcNormalPosition.bottom = nVSize + height; |
|
SetWindowPlacement(hWnd, &wp); |
|
|
|
SendDlgItemMessage(hWnd, IDC_REBARENABLED, BM_SETCHECK, bRebarEnabled, 0); |
|
break; |
|
} |
|
case WM_COMMAND: |
|
switch(HIWORD(wParam)) { |
|
case BN_CLICKED: |
|
switch (LOWORD(wParam)) { |
|
case ID_CREATE: |
|
ret = ID_CREATE; |
|
SendMessage(hWnd, WM_CLOSE, 0, 0); |
|
break; |
|
case ID_SEARCH: |
|
ret = ID_SEARCH; |
|
SendMessage(hWnd, WM_CLOSE, 0, 0); |
|
break; |
|
case IDCANCEL: |
|
ret = IDCANCEL; |
|
SendMessage(hWnd, WM_CLOSE, 0, 0); |
|
break; |
|
} |
|
} |
|
break; |
|
case WM_CLOSE: |
|
EndDialog(hWnd, ret); |
|
break; |
|
default: |
|
return FALSE; |
|
} |
|
return TRUE; |
|
} |
|
|
|
void getHotlistFile() { |
|
FILE *bmFile; |
|
bool defFile = false; |
|
kPlugin.kFuncs->GetPreference(PREF_STRING, PREFERENCE_HOTLIST_FILE, gHotlistFile, (char*)""); |
|
|
|
if (!gHotlistFile[0]) { |
|
kPlugin.kFuncs->GetFolder(UserSettingsFolder, gHotlistFile, MAX_PATH); |
|
strcat(gHotlistFile, "\\" HOTLIST_DEFAULT_FILENAME); |
|
defFile = true; |
|
} |
|
|
|
bmFile = fopen(gHotlistFile, "a"); |
|
while (!bmFile && !bIgnore) { |
|
retry: |
|
kPlugin.kFuncs->GetFolder(UserSettingsFolder, gHotlistFile, MAX_PATH); |
|
strcat(gHotlistFile, "\\" HOTLIST_DEFAULT_FILENAME); |
|
|
|
while (!bmFile && !bIgnore) { |
|
int ret = gLoc->DialogBoxParam(MAKEINTRESOURCE(IDD_INSTALL), NULL, (DLGPROC)HotlistFileDlgProc, 0); |
|
if (ret == IDCANCEL || ret == ID_CREATE) { |
|
bIgnore = (ret == IDCANCEL); |
|
break; |
|
} |
|
if (!BrowseForHotlist(gHotlistFile)) { |
|
goto retry; |
|
} |
|
bmFile = fopen(gHotlistFile, "r"); |
|
if (!bmFile && errno == ENOENT) { |
|
if (MessageBox(NULL, gLoc->GetStringFormat(IDS_FILENOTFOUND, gHotlistFile), PLUGIN_NAME, |
|
MB_ICONEXCLAMATION | MB_YESNO) == IDYES) |
|
break; |
|
} |
|
} |
|
|
|
if (!bmFile && !bIgnore) { |
|
bmFile = fopen(gHotlistFile, "wb"); |
|
if (bmFile) { |
|
fprintf(bmFile, |
|
"Opera Hotlist version 2.0\r\n" |
|
"Options:encoding=utf8,version=3\r\n\r\n"); |
|
bDOS = 1; |
|
MessageBox(NULL, gLoc->GetStringFormat(IDS_FILECREATED, gHotlistFile), PLUGIN_NAME, MB_ICONINFORMATION | MB_OK); |
|
} |
|
else { |
|
MessageBox(NULL, gLoc->GetStringFormat(IDS_CANTCREATEFILE, gHotlistFile), PLUGIN_NAME, MB_ICONERROR | MB_OK); |
|
} |
|
} |
|
} |
|
if (bmFile) |
|
fclose(bmFile); |
|
|
|
if (!bIgnore && !defFile) |
|
kPlugin.kFuncs->SetPreference(PREF_STRING, PREFERENCE_HOTLIST_FILE, gHotlistFile, false); |
|
} |
|
|
|
int Load(){ |
|
gLoc = Locale::kmInit(&kPlugin); |
|
HDC hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); |
|
nHSize = GetDeviceCaps(hdcScreen, HORZSIZE); |
|
nHRes = GetDeviceCaps(hdcScreen, HORZRES); |
|
DeleteDC(hdcScreen); |
|
|
|
wm_deferhottrack = kPlugin.kFuncs->GetCommandIDs(1); |
|
wm_deferbringtotop = kPlugin.kFuncs->GetCommandIDs(1); |
|
|
|
nConfigCommand = kPlugin.kFuncs->GetCommandIDs(1); |
|
nAddCommand = kPlugin.kFuncs->GetCommandIDs(1); |
|
nEditCommand = kPlugin.kFuncs->GetCommandIDs(1); |
|
nAddLinkCommand = kPlugin.kFuncs->GetCommandIDs(1); |
|
nUpdateTB = kPlugin.kFuncs->GetCommandIDs(1); |
|
|
|
nDropdownCommand = kPlugin.kFuncs->GetCommandIDs(1); |
|
kPlugin.kFuncs->GetPreference(PREF_BOOL, PREFERENCE_REBAR_ENABLED, &bRebarEnabled, &bRebarEnabled); |
|
kPlugin.kFuncs->GetPreference(PREF_BOOL, PREFERENCE_CHEVRON_ENABLED, &bChevronEnabled, &bChevronEnabled); |
|
kPlugin.kFuncs->GetPreference(PREF_BOOL, PREFERENCE_HOTLIST_RESYNCH, &bResynchHotlist, &bResynchHotlist); |
|
kPlugin.kFuncs->GetPreference(PREF_STRING, PREFERENCE_TOOLBAR_FOLDER, gToolbarFolder, (char*)""); |
|
kPlugin.kFuncs->GetPreference(PREF_STRING, PREFERENCE_MENU_FOLDER, gMenuFolder, (char*)""); |
|
kPlugin.kFuncs->GetPreference(PREF_STRING, PREFERENCE_NEWITEM_FOLDER, gNewitemFolder, (char*)""); |
|
kPlugin.kFuncs->GetPreference(PREF_INT, PREFERENCE_MENU_MAXLEN, &gMaxMenuLength, &gMaxMenuLength); |
|
kPlugin.kFuncs->GetPreference(PREF_BOOL, PREFERENCE_MENU_AUTOLEN, &gMenuAutoDetect, &gMenuAutoDetect); |
|
if (gMaxMenuLength < 1) gMaxMenuLength = 20; |
|
gMenuSortOrder = 3*8*8 + 2*8 + 1; |
|
kPlugin.kFuncs->GetPreference(PREF_INT, PREFERENCE_MENU_SORTORDER, &gMenuSortOrder, &gMenuSortOrder); |
|
nButtonMinWidth = 10; |
|
kPlugin.kFuncs->GetPreference(PREF_INT, PREFERENCE_BUTTON_MINWIDTH, &nButtonMinWidth, &nButtonMinWidth); |
|
nButtonMaxWidth = 35; |
|
kPlugin.kFuncs->GetPreference(PREF_INT, PREFERENCE_BUTTON_MAXWIDTH, &nButtonMaxWidth, &nButtonMaxWidth); |
|
bButtonIcons = true; |
|
kPlugin.kFuncs->GetPreference(PREF_BOOL, PREFERENCE_BUTTON_ICONS, &bButtonIcons, &bButtonIcons); |
|
|
|
ghMutex = CreateMutex(NULL, FALSE, "HotlistFileMutex"); |
|
|
|
getHotlistFile(); |
|
bEmpty = true; |
|
|
|
int ret = op_readFile(gHotlistFile); |
|
lpszHotlistFile = strdup(gHotlistFile); |
|
if (ret < 0) { |
|
if (!gHotlistFile || !*gHotlistFile) |
|
MessageBox(NULL, |
|
"No hotlist specified.", |
|
"Hotlist Error", MB_ICONSTOP|MB_OK); |
|
else { |
|
if (!bCreate || errno != ENOENT) { |
|
char tmp[2048]; |
|
strcpy(tmp, "Unable to open hotlist file\r\n'"); |
|
strcat(tmp, gHotlistFile); |
|
strcat(tmp, "'."); |
|
if (errno == ENOENT) { |
|
strcat(tmp, "\r\nFile not found."); |
|
} |
|
MessageBox(NULL, tmp, "Hotlist Error", MB_ICONSTOP|MB_OK); |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
return true; |
|
} |
|
|
|
void Create(HWND parent){ |
|
KMeleonWndProc = (void *) GetWindowLong(parent, GWL_WNDPROC); |
|
SetWindowLong(parent, GWL_WNDPROC, (LONG)WndProc); |
|
|
|
if (!bIgnore) |
|
pNewTB = create_TB(parent); |
|
} |
|
|
|
// Preferences Dialog function |
|
BOOL CALLBACK PrefDlgProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { |
|
int nTmp; |
|
char szTmp[MAX_PATH+1]; |
|
static int sorting; |
|
static int rebuild; |
|
|
|
switch (uMsg) { |
|
case WM_INITDIALOG: |
|
sorting = rebuild = 0; |
|
|
|
kPlugin.kFuncs->GetPreference(PREF_STRING, PREFERENCE_HOTLIST_FILE, szTmp, gHotlistFile); |
|
SetDlgItemText(hWnd, IDC_HOTLIST_FILE, szTmp); |
|
|
|
kPlugin.kFuncs->GetPreference(PREF_INT, PREFERENCE_MENU_MAXLEN, &nTmp, &gMaxMenuLength); |
|
if (nTmp < 1) nTmp = 20; |
|
SetDlgItemInt(hWnd, IDC_MAX_MENU_LENGTH, nTmp, TRUE); |
|
|
|
kPlugin.kFuncs->GetPreference(PREF_BOOL, PREFERENCE_MENU_AUTOLEN, &nTmp, &gMenuAutoDetect); |
|
SendDlgItemMessage(hWnd, IDC_MENU_AUTODETECT, BM_SETCHECK, nTmp, 0); |
|
if (nTmp) { |
|
EnableWindow(GetDlgItem(hWnd, IDC_MAX_MENU_LENGTH), false); |
|
} |
|
|
|
kPlugin.kFuncs->GetPreference(PREF_INT, PREFERENCE_MENU_SORTORDER, &nTmp, &gMenuSortOrder); |
|
if (nTmp==3 || nTmp==7 || nTmp==3*8+2 || nTmp==7*8+2 || |
|
nTmp==3*8+1 || nTmp==7*8+1 || |
|
nTmp==3*8*8+2*8+1 || nTmp==7*8*8+2*8+1) { |
|
while (nTmp > 8) { |
|
if ((nTmp % 8) == 1) |
|
SendDlgItemMessage(hWnd, IDC_FOLDERFIRST, BM_SETCHECK, 1, 0); |
|
if ((nTmp % 8) == 2) |
|
SendDlgItemMessage(hWnd, IDC_USEORDER, BM_SETCHECK, 1, 0); |
|
nTmp = nTmp / 8; |
|
} |
|
CheckRadioButton(hWnd, IDC_SORTORDER_AZ, IDC_SORTORDER_ZA, |
|
nTmp != 7 ? IDC_SORTORDER_AZ : IDC_SORTORDER_ZA); |
|
sorting = 1; |
|
} else { |
|
sorting = 0; |
|
EnableWindow(GetDlgItem(hWnd, IDC_SORTORDER_AZ), false); |
|
EnableWindow(GetDlgItem(hWnd, IDC_SORTORDER_ZA), false); |
|
EnableWindow(GetDlgItem(hWnd, IDC_FOLDERFIRST), false); |
|
EnableWindow(GetDlgItem(hWnd, IDC_USEORDER), false); |
|
} |
|
|
|
kPlugin.kFuncs->GetPreference(PREF_BOOL, PREFERENCE_REBAR_ENABLED, &nTmp, &bRebarEnabled); |
|
SendDlgItemMessage(hWnd, IDC_REBARENABLED, BM_SETCHECK, nTmp, 0); |
|
if (!nTmp) { |
|
EnableWindow(GetDlgItem(hWnd, IDC_MIN_TB_SIZE), false); |
|
EnableWindow(GetDlgItem(hWnd, IDC_MAX_TB_SIZE), false); |
|
} |
|
|
|
kPlugin.kFuncs->GetPreference(PREF_INT, PREFERENCE_BUTTON_MINWIDTH, &nTmp, &nButtonMinWidth); |
|
SetDlgItemInt(hWnd, IDC_MIN_TB_SIZE, nButtonMinWidth, TRUE); |
|
|
|
kPlugin.kFuncs->GetPreference(PREF_INT, PREFERENCE_BUTTON_MAXWIDTH, &nTmp, &nButtonMaxWidth); |
|
SetDlgItemInt(hWnd, IDC_MAX_TB_SIZE, nButtonMaxWidth, TRUE); |
|
|
|
break; |
|
case WM_COMMAND: |
|
switch(HIWORD(wParam)) { |
|
case BN_CLICKED: |
|
switch (LOWORD(wParam)) { |
|
case IDC_MENU_AUTODETECT: |
|
if (SendDlgItemMessage(hWnd, IDC_MENU_AUTODETECT, BM_GETCHECK, 0, 0)) { |
|
EnableWindow(GetDlgItem(hWnd, IDC_MAX_MENU_LENGTH), false); |
|
} |
|
else { |
|
EnableWindow(GetDlgItem(hWnd, IDC_MAX_MENU_LENGTH), true); |
|
} |
|
break; |
|
case IDC_REBARENABLED: |
|
if (SendDlgItemMessage(hWnd, IDC_REBARENABLED, BM_GETCHECK, 0, 0)) { |
|
EnableWindow(GetDlgItem(hWnd, IDC_MIN_TB_SIZE), true); |
|
EnableWindow(GetDlgItem(hWnd, IDC_MAX_TB_SIZE), true); |
|
} |
|
else { |
|
EnableWindow(GetDlgItem(hWnd, IDC_MIN_TB_SIZE), false); |
|
EnableWindow(GetDlgItem(hWnd, IDC_MAX_TB_SIZE), false); |
|
} |
|
break; |
|
case IDC_BROWSE: |
|
{ |
|
HWND hBookmarksFileWnd = GetDlgItem(hWnd, IDC_HOTLIST_FILE); |
|
GetWindowText(hBookmarksFileWnd, szTmp, MAX_PATH); |
|
nTmp = strlen(szTmp); |
|
while (--nTmp >= 0) { |
|
if (szTmp[nTmp] == '/') |
|
szTmp[nTmp] = '\\'; |
|
} |
|
if (BrowseForHotlist(szTmp)) { |
|
SetWindowText(hBookmarksFileWnd, szTmp); |
|
SetFocus(hBookmarksFileWnd); |
|
} |
|
} |
|
break; |
|
case IDOK: |
|
{ |
|
GetDlgItemText(hWnd, IDC_HOTLIST_FILE, szTmp, MAX_PATH); |
|
if (strcmp(gHotlistFile, szTmp) != 0) { |
|
if (gHotlistModified) { |
|
op_writeFile(lpszHotlistFile); |
|
} |
|
free(lpszHotlistFile); |
|
lpszHotlistFile = strdup(szTmp); |
|
if (lpszHotlistFile && *lpszHotlistFile) { |
|
delete gHotlistRoot.child; |
|
delete gHotlistRoot.next; |
|
gHotlistRoot.child = NULL; |
|
gHotlistRoot.next = NULL; |
|
if (op_readFile(lpszHotlistFile)) { |
|
strcpy(gHotlistFile, szTmp); |
|
kPlugin.kFuncs->SetPreference(PREF_STRING, PREFERENCE_HOTLIST_FILE, szTmp, FALSE); |
|
} else { |
|
free(lpszHotlistFile); |
|
lpszHotlistFile = strdup(gHotlistFile); |
|
if (lpszHotlistFile && *lpszHotlistFile) { |
|
delete gHotlistRoot.child; |
|
delete gHotlistRoot.next; |
|
gHotlistRoot.child = NULL; |
|
gHotlistRoot.next = NULL; |
|
op_readFile(lpszHotlistFile); |
|
} |
|
} |
|
} |
|
rebuild = 1; |
|
} |
|
|
|
nTmp = GetDlgItemInt(hWnd, IDC_MAX_MENU_LENGTH, NULL, TRUE); |
|
if (nTmp < 1) nTmp = 20; |
|
kPlugin.kFuncs->SetPreference(PREF_INT, PREFERENCE_MENU_MAXLEN, &nTmp, FALSE); |
|
if (nTmp != gMaxMenuLength) { |
|
gMaxMenuLength = nTmp; |
|
rebuild = 1; |
|
} |
|
|
|
nTmp = SendDlgItemMessage(hWnd, IDC_MENU_AUTODETECT, BM_GETCHECK, 0, 0); |
|
kPlugin.kFuncs->SetPreference(PREF_BOOL, PREFERENCE_MENU_AUTOLEN, &nTmp, FALSE); |
|
if (nTmp != gMenuAutoDetect) { |
|
gMenuAutoDetect = nTmp; |
|
rebuild = 1; |
|
} |
|
|
|
if (sorting) { |
|
sorting = 0; |
|
|
|
nTmp = IsDlgButtonChecked(hWnd, IDC_SORTORDER_AZ); |
|
sorting = sorting + 3*(nTmp==BST_CHECKED); |
|
|
|
nTmp = IsDlgButtonChecked(hWnd, IDC_SORTORDER_ZA); |
|
sorting = sorting + 7*(nTmp==BST_CHECKED); |
|
|
|
nTmp = IsDlgButtonChecked(hWnd, IDC_USEORDER); |
|
if (nTmp == BST_CHECKED) |
|
sorting = 8*sorting + 2; |
|
|
|
nTmp = IsDlgButtonChecked(hWnd, IDC_FOLDERFIRST); |
|
if (nTmp == BST_CHECKED) |
|
sorting = 8*sorting + 1; |
|
|
|
kPlugin.kFuncs->SetPreference(PREF_INT, PREFERENCE_MENU_SORTORDER, &sorting, FALSE); |
|
gMenuSortOrder = sorting; |
|
rebuild = 1; |
|
} |
|
|
|
nTmp = SendDlgItemMessage(hWnd, IDC_REBARENABLED, BM_GETCHECK, 0, 0); |
|
kPlugin.kFuncs->SetPreference(PREF_BOOL, PREFERENCE_REBAR_ENABLED, &nTmp, FALSE); |
|
|
|
nTmp = GetDlgItemInt(hWnd, IDC_MIN_TB_SIZE, NULL, TRUE); |
|
if (nTmp < 1) nTmp = 0; |
|
kPlugin.kFuncs->SetPreference(PREF_INT, PREFERENCE_BUTTON_MINWIDTH, &nTmp, FALSE); |
|
|
|
nTmp = GetDlgItemInt(hWnd, IDC_MAX_TB_SIZE, NULL, TRUE); |
|
kPlugin.kFuncs->SetPreference(PREF_INT, PREFERENCE_BUTTON_MAXWIDTH, &nTmp, FALSE); |
|
|
|
if (rebuild) |
|
RebuildMenu(); |
|
|
|
// fall through... |
|
} |
|
case IDCANCEL: |
|
SendMessage(hWnd, WM_CLOSE, 0, 0); |
|
} |
|
} |
|
break; |
|
case WM_CLOSE: |
|
EndDialog(hWnd, 0); |
|
break; |
|
default: |
|
return FALSE; |
|
} |
|
return TRUE; |
|
} |
|
|
|
void Config(HWND hWndParent){ |
|
gLoc->DialogBoxParam(MAKEINTRESOURCE(IDD_CONFIG), hWndParent, (DLGPROC)PrefDlgProc, 0); |
|
} |
|
|
|
void Quit(){ |
|
hWndFront = NULL; |
|
if (ghWndEdit) |
|
SendMessage(ghWndEdit, WM_CLOSE, 0, 0); |
|
if (gImagelist) |
|
ImageList_Destroy(gImagelist); |
|
if (gHotlistModified) { |
|
op_writeFile(lpszHotlistFile); |
|
} |
|
if (lpszHotlistFile) free(lpszHotlistFile); |
|
|
|
while (root) |
|
remove_TB(root->hWnd); |
|
|
|
TCHAR tmp[MAX_PATH]; |
|
|
|
kPlugin.kFuncs->GetFolder(UserSettingsFolder, tmp, MAX_PATH); |
|
strcat(tmp, HOTLIST_DEFAULT_FILENAME); |
|
if (_tcscmp(tmp, gHotlistFile) == 0) |
|
kPlugin.kFuncs->DelPreference(PREFERENCE_HOTLIST_FILE); |
|
delete gLoc; |
|
} |
|
|
|
void DoMenu(HMENU menu, char *param){ |
|
if (*param != 0){ |
|
char *action = param; |
|
char *string = strchr(param, ','); |
|
if (string) { |
|
*string = 0; |
|
string = SkipWhiteSpace(string+1); |
|
} |
|
else |
|
string = action; |
|
|
|
int command = 0; |
|
if (stricmp(action, "Add") == 0){ |
|
command = nAddCommand; |
|
} |
|
if (stricmp(action, "AddLink") == 0){ |
|
command = nAddLinkCommand; |
|
} |
|
if (stricmp(param, "Config") == 0) |
|
command = nConfigCommand; |
|
if (stricmp(param, "Edit") == 0) |
|
command = nEditCommand; |
|
if (command && string && *string && (!bIgnore || command == nConfigCommand)) { |
|
AppendMenu(menu, MF_STRING, command, string); |
|
return; |
|
} |
|
return; |
|
} |
|
|
|
if (bIgnore) |
|
return; |
|
|
|
gMenuHotlist = menu; |
|
if (gMenuHotlist) |
|
nFirstHotlistPosition = GetMenuItemCount(gMenuHotlist); |
|
else |
|
return; |
|
|
|
if (gMenuSortOrder) |
|
gHotlistRoot.sort(gMenuSortOrder); |
|
BuildMenu(menu, gHotlistRoot.FindSpecialNode(BOOKMARK_FLAG_BM), false); |
|
|
|
} |
|
|
|
int DoAccel(char *param) { |
|
if (stricmp(param, "Config") == 0) |
|
return nConfigCommand; |
|
if (stricmp(param, "Add") == 0) |
|
return nAddCommand; |
|
if (stricmp(param, "Edit") == 0) |
|
return nEditCommand; |
|
if (stricmp(param, "AddLink") == 0) |
|
return nAddLinkCommand; |
|
return 0; |
|
} |
|
|
|
void DoRebar(HWND rebarWnd) { |
|
if (bIgnore) |
|
return; |
|
|
|
if (bRebarEnabled) { |
|
|
|
DWORD dwStyle = 0x40 | /*the 40 gets rid of an ugly border on top. I have no idea what flag it corresponds to...*/ |
|
CCS_NOPARENTALIGN | CCS_NORESIZE | CCS_ADJUSTABLE | TBSTYLE_ALTDRAG | |
|
TBSTYLE_FLAT | TBSTYLE_TRANSPARENT | TBSTYLE_LIST | TBSTYLE_TOOLTIPS; |
|
|
|
// Create the toolbar control to be added. |
|
HWND hWndTB = CreateWindowEx(0, TOOLBARCLASSNAME, "", |
|
WS_CHILD | dwStyle, |
|
0,0,0,0, |
|
rebarWnd, (HMENU)/*id*/200, |
|
kPlugin.hDllInstance, NULL |
|
); |
|
|
|
if (!hWndTB){ |
|
MessageBox(NULL, TOOLBAND_FAILED_TO_CREATE, NULL, 0); |
|
return; |
|
} |
|
|
|
SetWindowText(hWndTB, TOOLBAND_NAME); |
|
|
|
//SendMessage(hWndTB, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_DRAWDDARROWS); |
|
|
|
if (pNewTB) { |
|
pNewTB->hWndTB = hWndTB; |
|
if (gImagelist && bButtonIcons) |
|
SendMessage(hWndTB, TB_SETIMAGELIST, 0, (LPARAM)gImagelist); |
|
else |
|
SendMessage(hWndTB, TB_SETIMAGELIST, 0, (LPARAM)NULL); |
|
} |
|
|
|
BuildRebar(hWndTB); |
|
|
|
// Get the height of the toolbar. |
|
DWORD dwBtnSize = SendMessage(hWndTB, TB_GETBUTTONSIZE, 0,0); |
|
|
|
REBARBANDINFO rbBand = {0}; |
|
rbBand.cbSize = sizeof(REBARBANDINFO); // Required |
|
rbBand.fMask = //RBBIM_TEXT | |
|
RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | |
|
RBBIM_SIZE | RBBIM_IDEALSIZE; |
|
|
|
rbBand.fStyle = RBBS_CHILDEDGE | RBBS_FIXEDBMP | RBBS_VARIABLEHEIGHT; |
|
rbBand.lpText = PLUGIN_NAME; |
|
rbBand.hwndChild = hWndTB; |
|
rbBand.cxMinChild = 0; |
|
rbBand.cyMinChild = HIWORD(dwBtnSize); |
|
rbBand.cyIntegral = 1; |
|
rbBand.cyMaxChild = rbBand.cyMinChild; |
|
rbBand.cxIdeal = 100; |
|
rbBand.cx = rbBand.cxIdeal; |
|
|
|
if (nButtonMinWidth > 0) |
|
wpOrigTBWndProc = (WNDPROC) SetWindowLong(hWndTB, |
|
GWL_WNDPROC, (LONG) WndTBSubclassProc); |
|
|
|
pNewTB = NULL; |
|
|
|
// Register the band name and child hwnd |
|
kPlugin.kFuncs->RegisterBand(hWndTB, TOOLBAND_NAME, true); |
|
|
|
// Add the band that has the toolbar. |
|
SendMessage(rebarWnd, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); |
|
} |
|
} |
|
|
|
extern "C" { |
|
KMELEON_PLUGIN kmeleonPlugin *GetKmeleonPlugin() { |
|
return &kPlugin; |
|
} |
|
|
|
KMELEON_PLUGIN int DrawBitmap(DRAWITEMSTRUCT *dis) { |
|
if (dis==NULL || gImagelist==NULL) return 0; |
|
|
|
if (GetMenuState((HMENU)dis->hwndItem, dis->itemID, 0) & MF_POPUP){ |
|
|
|
int top = (dis->rcItem.bottom - dis->rcItem.top - 16) / 2; |
|
top += dis->rcItem.top; |
|
|
|
if (dis->itemState & ODS_SELECTED){ |
|
ImageList_Draw(gImagelist, IMAGE_FOLDER_OPEN, dis->hDC, dis->rcItem.left, top, ILD_TRANSPARENT | ILD_FOCUS ); |
|
} |
|
else{ |
|
ImageList_Draw(gImagelist, IMAGE_FOLDER_CLOSED, dis->hDC, dis->rcItem.left, top, ILD_TRANSPARENT); |
|
} |
|
return 18; |
|
} |
|
// FIXME - This is probably way too slow to be useful. |
|
CBookmarkNode* node = gHotlistRoot.FindNode(LOWORD(dis->itemID)); |
|
if (node) { |
|
|
|
UINT flags = ILD_NORMAL; |
|
if (dis->itemState & ODS_SELECTED) |
|
flags |= ILD_FOCUS; |
|
|
|
HIMAGELIST hList = gImagelist; |
|
UINT idx = IMAGE_BOOKMARK; |
|
|
|
UINT i = GetSiteIcon((char*)node->url.c_str()); |
|
if (i > 0) { |
|
idx = i; |
|
hList = kPlugin.kFuncs->GetDefSizeIconList(); |
|
} |
|
|
|
int cx,cy = 16; |
|
ImageList_GetIconSize(gImagelist, &cx, &cy); |
|
int top = (dis->rcItem.bottom - dis->rcItem.top - cy) / 2; |
|
top += dis->rcItem.top; |
|
|
|
ImageList_Draw(hList, idx, dis->hDC, dis->rcItem.left, top, flags); |
|
|
|
return cx; |
|
} |
|
|
|
return 0; |
|
} |
|
}
|
|
|