/*
Miranda NG SmileyAdd Plugin
Copyright (C) 2012-18 Miranda NG team (https://miranda-ng.org)
Copyright (C) 2005-11 Boris Krasnovskiy All Rights Reserved
Copyright (C) 2003-04 Rein-Peter de Boer
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 version 2
of the License.
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, see .
*/
#include "stdafx.h"
OptionsType opt;
#define UM_CHECKSTATECHANGE (WM_USER + 100)
class OptionsDialogType
{
private:
HWND m_hwndDialog;
SmileyCategoryListType tmpsmcat;
SmileyPackType smPack;
void InitDialog(void);
void DestroyDialog(void);
void AddCategory(void);
void ApplyChanges(void);
void UpdateControls(bool force = false);
void SetChanged(void);
bool BrowseForSmileyPacks(int item);
void FilenameChanged(void);
void ShowSmileyPreview(void);
void PopulateSmPackList(void);
void UpdateVisibleSmPackList(void);
void UserAction(HTREEITEM hItem);
long GetSelProto(HTREEITEM hItem = nullptr);
public:
OptionsDialogType(HWND hWnd) { m_hwndDialog = hWnd; }
BOOL DialogProcedure(UINT msg, WPARAM wParam, LPARAM lParam);
};
//OptionsDialog class functions
BOOL OptionsDialogType::DialogProcedure(UINT msg, WPARAM wParam, LPARAM lParam)
{
BOOL Result = FALSE;
switch (msg) {
case WM_INITDIALOG:
InitDialog();
Result = TRUE;
break;
case WM_DESTROY:
DestroyDialog();
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_FILENAME:
switch (HIWORD(wParam)) {
case EN_KILLFOCUS:
FilenameChanged();
break;
case EN_CHANGE:
if (GetFocus() == (HWND)lParam) SetChanged();
break;
}
break;
case IDC_BROWSE:
if (HIWORD(wParam) == BN_CLICKED)
if (BrowseForSmileyPacks(GetSelProto())) {
UpdateControls(true);
SetChanged();
}
break;
case IDC_SMLOPTBUTTON:
if (HIWORD(wParam) == BN_CLICKED)
ShowSmileyPreview();
break;
case IDC_USESTDPACK:
if (HIWORD(wParam) == BN_CLICKED) {
BOOL en = IsDlgButtonChecked(m_hwndDialog, IDC_USESTDPACK) == BST_CHECKED;
EnableWindow(GetDlgItem(m_hwndDialog, IDC_USEPHYSPROTO), en);
} // no break!
case IDC_USEPHYSPROTO:
if (HIWORD(wParam) == BN_CLICKED) {
PopulateSmPackList();
SetChanged();
}
break;
case IDC_ADDCATEGORY:
if (HIWORD(wParam) == BN_CLICKED)
AddCategory();
break;
case IDC_DELETECATEGORY:
if (HIWORD(wParam) == BN_CLICKED)
if (tmpsmcat.DeleteCustomCategory(GetSelProto())) {
PopulateSmPackList();
SetChanged();
}
break;
case IDC_SPACES:
case IDC_SCALETOTEXTHEIGHT:
case IDC_APPENDSPACES:
case IDC_SCALEALLSMILEYS:
case IDC_IEVIEWSTYLE:
case IDC_ANIMATESEL:
case IDC_ANIMATEDLG:
case IDC_INPUTSMILEYS:
case IDC_DCURSORSMILEY:
case IDC_DISABLECUSTOM:
case IDC_HQSCALING:
case IDC_SORTING_HORIZONTAL:
if (HIWORD(wParam) == BN_CLICKED)
SetChanged();
break;
case IDC_MAXCUSTSMSZ:
case IDC_MINSMSZ:
if (HIWORD(wParam) == EN_CHANGE && GetFocus() == (HWND)lParam)
SetChanged();
break;
}
break;
case UM_CHECKSTATECHANGE:
UserAction((HTREEITEM)lParam);
break;
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->idFrom) {
case 0:
switch (((LPNMHDR)lParam)->code) {
case PSN_APPLY:
ApplyChanges();
break;
}
break;
case IDC_CATEGORYLIST:
switch (((LPNMHDR)lParam)->code) {
case NM_CLICK:
{
TVHITTESTINFO ht = { 0 };
DWORD dwpos = GetMessagePos();
POINTSTOPOINT(ht.pt, MAKEPOINTS(dwpos));
MapWindowPoints(HWND_DESKTOP, ((LPNMHDR)lParam)->hwndFrom, &ht.pt, 1);
TreeView_HitTest(((LPNMHDR)lParam)->hwndFrom, &ht);
if (TVHT_ONITEM & ht.flags)
FilenameChanged();
if (TVHT_ONITEMSTATEICON & ht.flags)
PostMessage(m_hwndDialog, UM_CHECKSTATECHANGE, 0, (LPARAM)ht.hItem);
}
case TVN_KEYDOWN:
if (((LPNMTVKEYDOWN)lParam)->wVKey == VK_SPACE)
PostMessage(m_hwndDialog, UM_CHECKSTATECHANGE, 0,
(LPARAM)TreeView_GetSelection(((LPNMHDR)lParam)->hwndFrom));
break;
case TVN_SELCHANGED:
LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam;
if (pnmtv->itemNew.state & TVIS_SELECTED)
UpdateControls();
}
}
break;
}
return Result;
}
void OptionsDialogType::AddCategory(void)
{
wchar_t cat[30];
GetDlgItemText(m_hwndDialog, IDC_NEWCATEGORY, cat, _countof(cat));
CMStringW catd = cat;
if (!catd.IsEmpty()) {
tmpsmcat.AddCategory(cat, catd, smcCustom);
PopulateSmPackList();
SetChanged();
}
}
void OptionsDialogType::UserAction(HTREEITEM hItem)
{
HWND hLstView = GetDlgItem(m_hwndDialog, IDC_CATEGORYLIST);
if (TreeView_GetCheckState(hLstView, hItem)) {
if (!BrowseForSmileyPacks(GetSelProto(hItem)))
TreeView_SetCheckState(hLstView, hItem, TRUE)
}
else
tmpsmcat.GetSmileyCategory(GetSelProto(hItem))->ClearFilename();
if (hItem == TreeView_GetSelection(hLstView))
UpdateControls();
else
TreeView_SelectItem(hLstView, hItem);
SetChanged();
PopulateSmPackList();
}
void OptionsDialogType::SetChanged(void)
{
SendMessage(GetParent(m_hwndDialog), PSM_CHANGED, 0, 0);
}
void OptionsDialogType::UpdateControls(bool force)
{
const SmileyCategoryType *smc = tmpsmcat.GetSmileyCategory(GetSelProto());
if (smc == nullptr)
return;
const CMStringW &smf = smc->GetFilename();
SetDlgItemText(m_hwndDialog, IDC_FILENAME, smf);
if (smPack.GetFilename() != smf || force)
smPack.LoadSmileyFile(smf, smPack.GetName(), false, true);
HWND hLstView = GetDlgItem(m_hwndDialog, IDC_CATEGORYLIST);
TreeView_SetCheckState(hLstView, TreeView_GetSelection(hLstView), smPack.SmileyCount() != 0);
SetDlgItemText(m_hwndDialog, IDC_LIBAUTHOR, smPack.GetAuthor().c_str());
SetDlgItemText(m_hwndDialog, IDC_LIBVERSION, smPack.GetVersion().c_str());
SetDlgItemText(m_hwndDialog, IDC_LIBNAME, TranslateW(smPack.GetName().c_str()));
}
long OptionsDialogType::GetSelProto(HTREEITEM hItem)
{
HWND hLstView = GetDlgItem(m_hwndDialog, IDC_CATEGORYLIST);
TVITEM tvi = { 0 };
tvi.mask = TVIF_PARAM;
tvi.hItem = hItem == nullptr ? TreeView_GetSelection(hLstView) : hItem;
TreeView_GetItem(hLstView, &tvi);
return (long)tvi.lParam;
}
void OptionsDialogType::UpdateVisibleSmPackList(void)
{
bool useOne = IsDlgButtonChecked(m_hwndDialog, IDC_USESTDPACK) == BST_UNCHECKED;
bool usePhysProto = IsDlgButtonChecked(m_hwndDialog, IDC_USEPHYSPROTO) == BST_CHECKED;
SmileyCategoryListType::SmileyCategoryVectorType &smc = *tmpsmcat.GetSmileyCategoryList();
for (auto &it : smc) {
bool visiblecat = usePhysProto ? !it->IsAcc() : !it->IsPhysProto();
bool visible = useOne ? !it->IsProto() : visiblecat;
if (!visible && it->IsAcc() && !useOne) {
CMStringW PhysProtoName = L"AllProto";
CMStringW ProtoName = it->GetName();
DBVARIANT dbv;
if (db_get_ws(NULL, _T2A(ProtoName.GetBuffer()), "AM_BaseProto", &dbv) == 0) {
ProtoName = dbv.ptszVal;
db_free(&dbv);
}
else
ProtoName.Empty();
CMStringW FileName;
if (!ProtoName.IsEmpty()) {
PhysProtoName += ProtoName;
SmileyCategoryType *scm = tmpsmcat.GetSmileyCategory(PhysProtoName);
if (scm == nullptr)
visible = false;
else if (scm->GetFilename().IsEmpty())
visible = true;
}
}
it->SetVisible(visible);
}
}
void OptionsDialogType::PopulateSmPackList(void)
{
HWND hLstView = GetDlgItem(m_hwndDialog, IDC_CATEGORYLIST);
TreeView_SelectItem(hLstView, NULL);
TreeView_DeleteAllItems(hLstView);
TVINSERTSTRUCT tvi = {};
tvi.hParent = TVI_ROOT;
tvi.hInsertAfter = TVI_LAST;
tvi.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_STATE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
tvi.item.stateMask = TVIS_STATEIMAGEMASK | TVIS_SELECTED;
UpdateVisibleSmPackList();
SmileyCategoryListType::SmileyCategoryVectorType &smc = *tmpsmcat.GetSmileyCategoryList();
for (int i = 0; i < smc.getCount(); i++) {
if (smc[i].IsVisible()) {
tvi.item.pszText = (wchar_t*)smc[i].GetDisplayName().c_str();
if (!smc[i].IsProto()) {
tvi.item.iImage = 0;
tvi.item.iSelectedImage = 0;
}
else {
tvi.item.iImage = i;
tvi.item.iSelectedImage = i;
}
tvi.item.lParam = i;
tvi.item.state = INDEXTOSTATEIMAGEMASK(smPack.LoadSmileyFile(smc[i].GetFilename(), smc[i].GetDisplayName(), true, true) ? 2 : 1);
TreeView_InsertItem(hLstView, &tvi);
smPack.Clear();
}
}
TreeView_SelectItem(hLstView, TreeView_GetRoot(hLstView));
}
void OptionsDialogType::InitDialog(void)
{
TranslateDialogDefault(m_hwndDialog);
CheckDlgButton(m_hwndDialog, IDC_SPACES, opt.EnforceSpaces ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(m_hwndDialog, IDC_SCALETOTEXTHEIGHT, opt.ScaleToTextheight ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(m_hwndDialog, IDC_USESTDPACK, opt.UseOneForAll ? BST_UNCHECKED : BST_CHECKED);
CheckDlgButton(m_hwndDialog, IDC_USEPHYSPROTO, opt.UsePhysProto ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(m_hwndDialog, IDC_APPENDSPACES, opt.SurroundSmileyWithSpaces ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(m_hwndDialog, IDC_SCALEALLSMILEYS, opt.ScaleAllSmileys ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(m_hwndDialog, IDC_IEVIEWSTYLE, opt.IEViewStyle ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(m_hwndDialog, IDC_ANIMATESEL, opt.AnimateSel ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(m_hwndDialog, IDC_ANIMATEDLG, opt.AnimateDlg ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(m_hwndDialog, IDC_INPUTSMILEYS, opt.InputSmileys ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(m_hwndDialog, IDC_DCURSORSMILEY, opt.DCursorSmiley ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(m_hwndDialog, IDC_DISABLECUSTOM, opt.DisableCustom ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(m_hwndDialog, IDC_HQSCALING, opt.HQScaling ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(m_hwndDialog, IDC_SORTING_HORIZONTAL, opt.HorizontalSorting ? BST_CHECKED : BST_UNCHECKED);
EnableWindow(GetDlgItem(m_hwndDialog, IDC_USEPHYSPROTO), !opt.UseOneForAll);
SendDlgItemMessage(m_hwndDialog, IDC_MAXCUSTSPIN, UDM_SETRANGE32, 0, 99);
SendDlgItemMessage(m_hwndDialog, IDC_MAXCUSTSPIN, UDM_SETPOS, 0, opt.MaxCustomSmileySize);
SendDlgItemMessage(m_hwndDialog, IDC_MAXCUSTSMSZ, EM_LIMITTEXT, 2, 0);
SendDlgItemMessage(m_hwndDialog, IDC_MINSPIN, UDM_SETRANGE32, 0, 99);
SendDlgItemMessage(m_hwndDialog, IDC_MINSPIN, UDM_SETPOS, 0, opt.MinSmileySize);
SendDlgItemMessage(m_hwndDialog, IDC_MINSMSZ, EM_LIMITTEXT, 2, 0);
// Create and populate image list
HIMAGELIST hImList = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON),
ILC_MASK | ILC_COLOR32, g_SmileyCategories.NumberOfSmileyCategories(), 0);
tmpsmcat = g_SmileyCategories;
SmileyCategoryListType::SmileyCategoryVectorType &smc = *g_SmileyCategories.GetSmileyCategoryList();
for (auto &it : smc) {
HICON hIcon = nullptr;
if (it->IsProto()) {
hIcon = (HICON)CallProtoService(_T2A(it->GetName().c_str()), PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0);
if (hIcon == nullptr || (INT_PTR)hIcon == CALLSERVICE_NOTFOUND)
hIcon = (HICON)CallProtoService(_T2A(it->GetName().c_str()), PS_LOADICON, PLI_PROTOCOL, 0);
}
if (hIcon == nullptr || hIcon == (HICON)CALLSERVICE_NOTFOUND)
hIcon = GetDefaultIcon();
ImageList_AddIcon(hImList, hIcon);
DestroyIcon(hIcon);
}
HWND hLstView = GetDlgItem(m_hwndDialog, IDC_CATEGORYLIST);
TreeView_SetImageList(hLstView, hImList, TVSIL_NORMAL);
PopulateSmPackList();
}
void OptionsDialogType::DestroyDialog(void)
{
HWND hLstView = GetDlgItem(m_hwndDialog, IDC_CATEGORYLIST);
HIMAGELIST hImList = TreeView_SetImageList(hLstView, NULL, TVSIL_NORMAL);
ImageList_Destroy(hImList);
}
void OptionsDialogType::ApplyChanges(void)
{
ProcessAllInputAreas(true);
CloseSmileys();
opt.EnforceSpaces = IsDlgButtonChecked(m_hwndDialog, IDC_SPACES) == BST_CHECKED;
opt.ScaleToTextheight = IsDlgButtonChecked(m_hwndDialog, IDC_SCALETOTEXTHEIGHT) == BST_CHECKED;
opt.UseOneForAll = IsDlgButtonChecked(m_hwndDialog, IDC_USESTDPACK) == BST_UNCHECKED;
opt.UsePhysProto = IsDlgButtonChecked(m_hwndDialog, IDC_USEPHYSPROTO) == BST_CHECKED;
opt.SurroundSmileyWithSpaces = IsDlgButtonChecked(m_hwndDialog, IDC_APPENDSPACES) == BST_CHECKED;
opt.ScaleAllSmileys = IsDlgButtonChecked(m_hwndDialog, IDC_SCALEALLSMILEYS) == BST_CHECKED;
opt.IEViewStyle = IsDlgButtonChecked(m_hwndDialog, IDC_IEVIEWSTYLE) == BST_CHECKED;
opt.AnimateSel = IsDlgButtonChecked(m_hwndDialog, IDC_ANIMATESEL) == BST_CHECKED;
opt.AnimateDlg = IsDlgButtonChecked(m_hwndDialog, IDC_ANIMATEDLG) == BST_CHECKED;
opt.InputSmileys = IsDlgButtonChecked(m_hwndDialog, IDC_INPUTSMILEYS) == BST_CHECKED;
opt.DCursorSmiley = IsDlgButtonChecked(m_hwndDialog, IDC_DCURSORSMILEY) == BST_CHECKED;
opt.DisableCustom = IsDlgButtonChecked(m_hwndDialog, IDC_DISABLECUSTOM) == BST_CHECKED;
opt.HQScaling = IsDlgButtonChecked(m_hwndDialog, IDC_HQSCALING) == BST_CHECKED;
opt.HorizontalSorting = IsDlgButtonChecked(m_hwndDialog, IDC_SORTING_HORIZONTAL) == BST_CHECKED;
opt.MaxCustomSmileySize = GetDlgItemInt(m_hwndDialog, IDC_MAXCUSTSMSZ, nullptr, FALSE);
opt.MinSmileySize = GetDlgItemInt(m_hwndDialog, IDC_MINSMSZ, nullptr, FALSE);
opt.Save();
// Cleanup database
CMStringW empty;
SmileyCategoryListType::SmileyCategoryVectorType &smc = *g_SmileyCategories.GetSmileyCategoryList();
for (auto &it : smc)
if (tmpsmcat.GetSmileyCategory(it->GetName()) == nullptr)
opt.WritePackFileName(empty, it->GetName());
g_SmileyCategories = tmpsmcat;
g_SmileyCategories.SaveSettings();
g_SmileyCategories.ClearAndLoadAll();
smPack.LoadSmileyFile(tmpsmcat.GetSmileyCategory(GetSelProto())->GetFilename(), tmpsmcat.GetSmileyCategory(GetSelProto())->GetDisplayName(), false, true);
NotifyEventHooks(hEvent1, 0, 0);
ProcessAllInputAreas(false);
}
bool OptionsDialogType::BrowseForSmileyPacks(int item)
{
OPENFILENAME ofn = { 0 };
wchar_t filename[MAX_PATH] = L"";
ofn.lpstrFile = filename;
ofn.nMaxFile = _countof(filename);
CMStringW inidir;
SmileyCategoryType *smc = tmpsmcat.GetSmileyCategory(item);
if (smc->GetFilename().IsEmpty())
pathToAbsolute(L"Smileys", inidir);
else {
pathToAbsolute(smc->GetFilename(), inidir);
inidir.Truncate(inidir.ReverseFind('\\'));
}
ofn.lpstrInitialDir = inidir.c_str();
ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400;
ofn.hwndOwner = m_hwndDialog;
wchar_t filter[512], *pfilter;
mir_wstrcpy(filter, TranslateT("Smiley packs"));
mir_wstrcat(filter, L" (*.msl;*.asl;*.xep)");
pfilter = filter + mir_wstrlen(filter) + 1;
mir_wstrcpy(pfilter, L"*.msl;*.asl;*.xep");
pfilter = pfilter + mir_wstrlen(pfilter) + 1;
mir_wstrcpy(pfilter, TranslateT("All files"));
mir_wstrcat(pfilter, L" (*.*)");
pfilter = pfilter + mir_wstrlen(pfilter) + 1;
mir_wstrcpy(pfilter, L"*.*");
pfilter = pfilter + mir_wstrlen(pfilter) + 1;
*pfilter = '\0';
ofn.lpstrFilter = filter;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_READONLY |
OFN_EXPLORER | OFN_LONGNAMES | OFN_NOCHANGEDIR;
ofn.lpstrDefExt = L"msl";
if (GetOpenFileName(&ofn)) {
CMStringW relpath;
pathToRelative(filename, relpath);
smc->SetFilename(relpath);
return true;
}
return false;
}
void OptionsDialogType::FilenameChanged(void)
{
wchar_t str[MAX_PATH];
GetDlgItemText(m_hwndDialog, IDC_FILENAME, str, _countof(str));
SmileyCategoryType *smc = tmpsmcat.GetSmileyCategory(GetSelProto());
if (smc->GetFilename() != str) {
CMStringW temp(str);
smc->SetFilename(temp);
UpdateControls();
}
}
void OptionsDialogType::ShowSmileyPreview(void)
{
RECT rect;
GetWindowRect(GetDlgItem(m_hwndDialog, IDC_SMLOPTBUTTON), &rect);
SmileyToolWindowParam *stwp = new SmileyToolWindowParam;
stwp->pSmileyPack = &smPack;
stwp->hWndParent = m_hwndDialog;
stwp->hWndTarget = nullptr;
stwp->targetMessage = 0;
stwp->targetWParam = 0;
stwp->xPosition = rect.left;
stwp->yPosition = rect.bottom + 4;
stwp->direction = 1;
stwp->hContact = NULL;
mir_forkThread(SmileyToolThread, stwp);
}
void OptionsType::Save(void)
{
db_set_b(NULL, MODULENAME, "EnforceSpaces", EnforceSpaces);
db_set_b(NULL, MODULENAME, "ScaleToTextheight", ScaleToTextheight);
db_set_b(NULL, MODULENAME, "UseOneForAll", UseOneForAll);
db_set_b(NULL, MODULENAME, "UsePhysProto", UsePhysProto);
db_set_b(NULL, MODULENAME, "SurroundSmileyWithSpaces", SurroundSmileyWithSpaces);
db_set_b(NULL, MODULENAME, "ScaleAllSmileys", ScaleAllSmileys);
db_set_b(NULL, MODULENAME, "IEViewStyle", IEViewStyle);
db_set_b(NULL, MODULENAME, "AnimateSel", AnimateSel);
db_set_b(NULL, MODULENAME, "AnimateDlg", AnimateDlg);
db_set_b(NULL, MODULENAME, "InputSmileys", InputSmileys);
db_set_b(NULL, MODULENAME, "DCursorSmiley", DCursorSmiley);
db_set_b(NULL, MODULENAME, "DisableCustom", DisableCustom);
db_set_b(NULL, MODULENAME, "HQScaling", HQScaling);
db_set_dw(NULL, MODULENAME, "MaxCustomSmileySize", MaxCustomSmileySize);
db_set_dw(NULL, MODULENAME, "MinSmileySize", MinSmileySize);
db_set_b(NULL, MODULENAME, "HorizontalSorting", HorizontalSorting);
}
void OptionsType::Load(void)
{
EnforceSpaces = db_get_b(NULL, MODULENAME, "EnforceSpaces", FALSE) != 0;
ScaleToTextheight = db_get_b(NULL, MODULENAME, "ScaleToTextheight", FALSE) != 0;
UseOneForAll = db_get_b(NULL, MODULENAME, "UseOneForAll", TRUE) != 0;
UsePhysProto = db_get_b(NULL, MODULENAME, "UsePhysProto", FALSE) != 0;
SurroundSmileyWithSpaces = db_get_b(NULL, MODULENAME, "SurroundSmileyWithSpaces", FALSE) != 0;
ScaleAllSmileys = db_get_b(NULL, MODULENAME, "ScaleAllSmileys", FALSE) != 0;
IEViewStyle = db_get_b(NULL, MODULENAME, "IEViewStyle", FALSE) != 0;
AnimateSel = db_get_b(NULL, MODULENAME, "AnimateSel", TRUE) != 0;
AnimateDlg = db_get_b(NULL, MODULENAME, "AnimateDlg", TRUE) != 0;
InputSmileys = db_get_b(NULL, MODULENAME, "InputSmileys", TRUE) != 0;
DCursorSmiley = db_get_b(NULL, MODULENAME, "DCursorSmiley", FALSE) != 0;
DisableCustom = db_get_b(NULL, MODULENAME, "DisableCustom", FALSE) != 0;
HQScaling = db_get_b(NULL, MODULENAME, "HQScaling", FALSE) != 0;
SelWndBkgClr = db_get_dw(NULL, MODULENAME, "SelWndBkgClr", GetSysColor(COLOR_WINDOW));
MaxCustomSmileySize = db_get_dw(NULL, MODULENAME, "MaxCustomSmileySize", 0);
MinSmileySize = db_get_dw(NULL, MODULENAME, "MinSmileySize", 0);
HorizontalSorting = db_get_b(NULL, MODULENAME, "HorizontalSorting", 1) != 0;
}
void OptionsType::ReadPackFileName(CMStringW &filename, const CMStringW &name, const CMStringW &defaultFilename)
{
CMStringW settingKey = name + L"-filename";
ptrW tszValue(db_get_wsa(NULL, MODULENAME, _T2A(settingKey.c_str())));
filename = (tszValue != NULL) ? (wchar_t*)tszValue : defaultFilename;
}
void OptionsType::WritePackFileName(const CMStringW &filename, const CMStringW &name)
{
CMStringW settingKey = name + L"-filename";
db_set_ws(NULL, MODULENAME, _T2A(settingKey.c_str()), filename.c_str());
}
void OptionsType::ReadCustomCategories(CMStringW &cats)
{
ptrW tszValue(db_get_wsa(NULL, MODULENAME, "CustomCategories"));
if (tszValue != NULL)
cats = tszValue;
}
void OptionsType::WriteCustomCategories(const CMStringW &cats)
{
if (cats.IsEmpty())
db_unset(NULL, MODULENAME, "CustomCategories");
else
db_set_ws(NULL, MODULENAME, "CustomCategories", cats.c_str());
}
void OptionsType::ReadContactCategory(MCONTACT hContact, CMStringW &cats)
{
ptrW tszValue(db_get_wsa(hContact, MODULENAME, "CustomCategory"));
if (tszValue != NULL)
cats = tszValue;
}
void OptionsType::WriteContactCategory(MCONTACT hContact, const CMStringW &cats)
{
if (cats.IsEmpty())
db_unset(hContact, MODULENAME, "CustomCategory");
else
db_set_ws(hContact, MODULENAME, "CustomCategory", cats.c_str());
}
/////////////////////////////////////////////////////////////////////////////////////////
// Init and de-init functions, called from main
static INT_PTR CALLBACK DlgProcSmileysOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
OptionsDialogType *pOD = (OptionsDialogType*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
if (pOD == nullptr) {
pOD = new OptionsDialogType(hwndDlg);
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)pOD);
}
INT_PTR Result = pOD->DialogProcedure(msg, wParam, lParam);
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, Result);
if (msg == WM_NCDESTROY)
delete pOD;
return Result;
}
int SmileysOptionsInitialize(WPARAM addInfo, LPARAM)
{
OPTIONSDIALOGPAGE odp = { 0 };
odp.position = 910000000;
odp.hInstance = g_plugin.getInst();
odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_SMILEYS);
odp.szTitle.a = LPGEN("Smileys");
odp.szGroup.a = LPGEN("Customize");
odp.pfnDlgProc = DlgProcSmileysOptions;
odp.flags = ODPF_BOLDGROUPS;
g_plugin.addOptions(addInfo, &odp);
return 0;
}