From 6eb843fa1f9d7c63f1a89a152e93d9b38f893009 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Sun, 16 Feb 2014 12:47:53 +0000 Subject: MetaContacts moved to deprecated git-svn-id: http://svn.miranda-ng.org/main/trunk@8134 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/!Deprecated/MetaContacts/src/edit.cpp | 465 ++++++++++++++++++++++++++ 1 file changed, 465 insertions(+) create mode 100644 plugins/!Deprecated/MetaContacts/src/edit.cpp (limited to 'plugins/!Deprecated/MetaContacts/src/edit.cpp') diff --git a/plugins/!Deprecated/MetaContacts/src/edit.cpp b/plugins/!Deprecated/MetaContacts/src/edit.cpp new file mode 100644 index 0000000000..7a1a2cc303 --- /dev/null +++ b/plugins/!Deprecated/MetaContacts/src/edit.cpp @@ -0,0 +1,465 @@ +/* +MetaContacts Plugin for Miranda IM. + +Copyright © 2004 Universite Louis PASTEUR, STRASBOURG. + +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 +of the License, 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. +*/ + +/** @file edit.c +* +* Functions for the 'Edit' Dialog. +* Contains all the functions and all the structures +* needed to display and control the 'Edit' Dialog. +*/ + +#include "metacontacts.h" + +//! Holds the differents changes that have to made +typedef struct tag_CHANGES { + MCONTACT hMeta; //!< \c HANDLE of the MetaContact that is edited. + MCONTACT hDefaultContact; //!< \c HANDLE of the new default contact + MCONTACT hOfflineContact; + int num_deleted, //!< \c DWORD number of deleted contacts + num_contacts; //!< \c DWORD number of contacts + MCONTACT hDeletedContacts[MAX_CONTACTS]; //!< \c HANDLEs of the subcontacts to be removed from this metacontact + MCONTACT hContact[MAX_CONTACTS]; //!< \c HANDLEs of the subcontacts, in the order they should be in + int force_default; +} CHANGES; + +CHANGES changes; //!< \c global CHANGES structure + +/** Fills the list of contacts +* +* @param chg : Structure holding all the change info (See CHANGES). +*/ + +void FillContactList(HWND hWndDlg, CHANGES *chg) +{ + HWND hList = GetDlgItem(hWndDlg, IDC_LST_CONTACTS); + TCHAR buff[256]; + + SendMessage(hList, LVM_DELETEALLITEMS, 0, 0); + + LVITEM LvItem = { 0 }; + LvItem.mask = LVIF_TEXT; // Text Style + LvItem.cchTextMax = 256; // Max size of test + + for (int i = 0; i < chg->num_contacts; i++) { + LvItem.iItem = i; + + TCHAR *ptszCDN = pcli->pfnGetContactDisplayName(chg->hContact[i], GCDNF_TCHAR); + if (ptszCDN == NULL) + ptszCDN = TranslateT("(Unknown Contact)"); + + LvItem.iSubItem = 0; // clist display name + LvItem.pszText = ptszCDN; + ListView_InsertItem(hList, &LvItem); + + LvItem.iSubItem = 1; // id + char *szProto = GetContactProto(chg->hContact[i]); + if (szProto) { + char *szField = (char *)CallProtoService(szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0); + + DBVARIANT dbv; + if ( !db_get(chg->hContact[i], szProto, szField, &dbv)) { + switch(dbv.type) { + case DBVT_ASCIIZ: + _tcsncpy(buff, _A2T(dbv.pszVal), SIZEOF(buff)); + break; + case DBVT_WCHAR: + _tcsncpy(buff, dbv.ptszVal, SIZEOF(buff)); + break; + case DBVT_BYTE: + _itot(dbv.bVal, buff, 10); + break; + case DBVT_WORD: + _itot(dbv.wVal, buff, 10); + break; + case DBVT_DWORD: + _itot(dbv.dVal, buff, 10); + break; + default: + buff[0] = 0; + } + db_free(&dbv); + } + else buff[0] = 0; + + LvItem.pszText = buff; + SendMessage(hList,LVM_SETITEM,0,(LPARAM)&LvItem); // Enter text to SubItems + + LvItem.iSubItem = 2; // protocol + _tcsncpy(buff, _A2T(szProto), SIZEOF(buff)); + ListView_SetItem(hList, &LvItem); + } + else { + LvItem.pszText = _T("Unknown"); + ListView_SetItem(hList, &LvItem); + + LvItem.iSubItem = 2; // protocol + ListView_SetItem(hList, &LvItem); + } + LvItem.iSubItem = 3; // Default (Yes/No) + LvItem.pszText = (chg->hContact[i] == chg->hDefaultContact ? TranslateT("Yes") : TranslateT("No")); + ListView_SetItem(hList, &LvItem); + + LvItem.iSubItem = 4; // Offline (Yes/No) + LvItem.pszText = (chg->hContact[i] == chg->hOfflineContact ? TranslateT("Yes") : TranslateT("No")); + ListView_SetItem(hList, &LvItem); + } +} + +void SetListSelection(HWND hList, int sel) +{ + ListView_SetItemState(hList, sel, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); +} + +/** Scans the \c CHANGES and call the appropriate function for each change. +* +* @param chg : Structure holding all the change info (See CHANGES). +*/ + +void ApplyChanges(CHANGES *chg) +{ + int i; + + // remove removed contacts + for (i = 0; i < chg->num_deleted; i++) { + Meta_Delete((WPARAM)chg->hDeletedContacts[i], 0); + if (chg->hDeletedContacts[i] == chg->hDefaultContact) + chg->hDefaultContact = 0; + if (chg->hDeletedContacts[i] == chg->hOfflineContact) + chg->hOfflineContact = 0; + } + + // set contact positions + for (i = 0; i < chg->num_contacts; i++) { + if (Meta_GetContactNumber(chg->hContact[i]) != i) + Meta_SwapContacts(chg->hMeta, Meta_GetContactNumber(chg->hContact[i]), i); + } + + NotifyEventHooks(hSubcontactsChanged, (WPARAM)chg->hMeta, (LPARAM)chg->hDefaultContact); + + // set default + if (chg->hDefaultContact) + db_set_dw(chg->hMeta, META_PROTO, "Default", Meta_GetContactNumber(chg->hDefaultContact)); + else + db_set_dw(chg->hMeta, META_PROTO, "Default", 0); + NotifyEventHooks(hEventDefaultChanged, (WPARAM)chg->hMeta, (LPARAM)chg->hDefaultContact); + + // set offline + if (chg->hOfflineContact) + db_set_dw(chg->hMeta, META_PROTO, "OfflineSend", Meta_GetContactNumber(chg->hOfflineContact)); + else + db_set_dw(chg->hMeta, META_PROTO, "OfflineSend", (DWORD)-1); + + // fix nick + MCONTACT most_online = Meta_GetMostOnline(chg->hMeta); + Meta_CopyContactNick(chg->hMeta, most_online); + + // fix status + Meta_FixStatus(chg->hMeta); + + // fix avatar + most_online = Meta_GetMostOnlineSupporting(chg->hMeta, PFLAGNUM_4, PF4_AVATARS); + if (most_online) { + PROTO_AVATAR_INFORMATIONT AI; + + AI.cbSize = sizeof(AI); + AI.hContact = chg->hMeta; + AI.format = PA_FORMAT_UNKNOWN; + _tcscpy(AI.filename, _T("X")); + + if ((int)CallProtoService(META_PROTO, PS_GETAVATARINFOT, 0, (LPARAM)&AI) == GAIR_SUCCESS) + db_set_ts(chg->hMeta, "ContactPhoto", "File",AI.filename); + } + + if (MetaAPI_GetForceState((WPARAM)chg->hMeta, 0) != chg->force_default) + MetaAPI_ForceDefault((WPARAM)chg->hMeta, 0); +} + +LRESULT ProcessCustomDraw (LPARAM lParam) +{ + LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; + switch(lplvcd->nmcd.dwDrawStage) { + case CDDS_PREPAINT : //Before the paint cycle begins + //request notifications for individual listview items + return CDRF_NOTIFYITEMDRAW; + + case CDDS_ITEMPREPAINT: //Before an item is drawn + if (changes.hContact[(int)lplvcd->nmcd.dwItemSpec] == changes.hDefaultContact) { + lplvcd->clrText = RGB(255, 0, 0); + } + return CDRF_NEWFONT; + } + + return 0; +} + +/** Callback function for the 'Edit' Dialog. +* +* All the UI is controlled here, from display to functionnalities. +* +* @param hwndDlg : \c HANDLE to the 'Edit' \c Dialog. +* @param uMsg : Specifies the message received by this dialog. +* @param wParam : Specifies additional message-specific information. +* @param lParam : Specifies additional message-specific information (handle of MetaContact to edit) +* +* @return \c TRUE if the dialog processed the message, \c FALSE if it did not. +*/ + +#define WMU_SETTITLE (WM_USER + 1) + +INT_PTR CALLBACK Meta_EditDialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + HWND hwnd; + int sel, i; + + switch(msg) { + case WM_INITDIALOG: + TranslateDialogDefault( hwndDlg ); + SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadIconEx(I_EDIT)); + { + // Disable the 'Apply' button. + EnableWindow(GetDlgItem(hwndDlg,IDC_VALIDATE),FALSE); + + hwnd = GetDlgItem(hwndDlg, IDC_LST_CONTACTS); + ListView_SetExtendedListViewStyle(hwnd, LVS_EX_FULLROWSELECT); + + // Create list columns + LVCOLUMN LvCol = { 0 }; + LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; + + LvCol.pszText = TranslateT("Contact"); + LvCol.cx = 100; + ListView_InsertColumn(hwnd, 0, &LvCol); + + LvCol.pszText = TranslateT("ID"); + LvCol.cx = 130; + ListView_InsertColumn(hwnd, 1, &LvCol); + + LvCol.pszText = TranslateT("Protocol"); + LvCol.cx = 100; + ListView_InsertColumn(hwnd, 2, &LvCol); + + LvCol.pszText = TranslateT("Default"); + LvCol.cx = 60; + ListView_InsertColumn(hwnd, 3, &LvCol); + + LvCol.pszText = TranslateT("Send Offline"); + LvCol.cx = 85; + ListView_InsertColumn(hwnd, 4, &LvCol); + + // disable buttons until a selection is made in the list + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_REM), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_SETDEFAULT), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_SETOFFLINE), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_UP), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_DOWN), FALSE); + + int nb_contacts = db_get_dw(lParam, META_PROTO, "NumContacts", 0); + int default_contact_number = db_get_dw(lParam, META_PROTO, "Default", (DWORD)-1); + int offline_contact_number = db_get_dw(lParam, META_PROTO, "OfflineSend", (DWORD)-1); + + changes.hMeta = lParam; + changes.num_contacts = nb_contacts; + changes.num_deleted = 0; + changes.hDefaultContact = Meta_GetContactHandle(lParam, default_contact_number); + changes.hOfflineContact = Meta_GetContactHandle(lParam, offline_contact_number); + for (i = 0; i < nb_contacts; i++) + changes.hContact[i] = Meta_GetContactHandle(lParam, i); + changes.force_default = MetaAPI_GetForceState((WPARAM)lParam, 0); + + SendMessage(hwndDlg, WMU_SETTITLE, 0, lParam); + + CheckDlgButton(hwndDlg, IDC_CHK_FORCEDEFAULT, changes.force_default); + + FillContactList(hwndDlg, &changes); + } + return TRUE; + + case WMU_SETTITLE: + { + TCHAR *ptszCDN = pcli->pfnGetContactDisplayName(lParam, GCDNF_TCHAR); + if (ptszCDN == NULL) + ptszCDN = TranslateT("(Unknown Contact)"); + + SetWindowText(GetDlgItem(hwndDlg, IDC_ED_NAME), ptszCDN); + } + return TRUE; + + case WM_NOTIFY: // the message that is being sent always + switch(LOWORD(wParam)) { // hit control + case IDC_LST_CONTACTS: // did we hit our ListView contorl? + if (((LPNMHDR)lParam)->code == NM_CLICK) { + sel = ListView_GetNextItem(GetDlgItem(hwndDlg, IDC_LST_CONTACTS), -1, LVNI_FOCUSED|LVNI_SELECTED); // return item selected + + // enable buttons + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_REM), sel != -1); + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_SETDEFAULT), sel != -1 && changes.hContact[sel] != changes.hDefaultContact); + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_SETOFFLINE), sel != -1 && changes.hContact[sel] != changes.hOfflineContact); + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_UP), sel > 0); + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_DOWN), (sel != -1 && sel < changes.num_contacts - 1)); + } + } + break; + + case WM_COMMAND: + switch(HIWORD(wParam)) { + case BN_CLICKED: // A button ('Remove', 'OK', 'Cancel' or 'Apply', normally) has been clicked + switch(LOWORD(wParam)) { + case IDC_VALIDATE: // Apply changes, if there is still one contact attached to the metacontact. + if (changes.num_contacts == 0) { // Otherwise, delete the metacontact. + if (IDYES == MessageBox(hwndDlg, TranslateT(szDelMsg), TranslateT("Delete MetaContact?"), MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON1)) { + Meta_Delete((WPARAM)changes.hMeta, 0); + DestroyWindow(hwndDlg); + } + return TRUE; + } + ApplyChanges(&changes); + + // Disable the 'Apply' button. + EnableWindow(GetDlgItem(hwndDlg, IDC_VALIDATE), FALSE); + break; + + case IDOK: + if ( IsWindowEnabled(GetDlgItem(hwndDlg, IDC_VALIDATE))) { // If there are changes that could be made, + if (changes.num_contacts == 0) { // do the work that would have be done if the 'Apply' button was clicked. + if (IDYES == MessageBox(hwndDlg, TranslateT(szDelMsg), TranslateT("Delete MetaContact?"), MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON1)) { + Meta_Delete((WPARAM)changes.hMeta,0); + DestroyWindow(hwndDlg); + } + return TRUE; + } + ApplyChanges(&changes); + } + EndDialog(hwndDlg, IDOK); + return TRUE; + + case IDCANCEL: // Simply close the dialog + EndDialog(hwndDlg, IDCANCEL); + return TRUE; + + case IDC_BTN_SETDEFAULT: + hwnd = GetDlgItem(hwndDlg, IDC_LST_CONTACTS); + sel = ListView_GetNextItem(hwnd, -1, LVNI_FOCUSED | LVNI_SELECTED); + InvalidateRect(hwnd, 0, TRUE); + changes.hDefaultContact = changes.hContact[sel]; + SendMessage(hwndDlg, WMU_SETTITLE, 0, (LPARAM)changes.hContact[sel]); + + FillContactList(hwndDlg, &changes); + SetListSelection(hwnd, sel); + EnableWindow(GetDlgItem(hwndDlg,IDC_BTN_SETDEFAULT),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_VALIDATE),TRUE); + return TRUE; + + case IDC_BTN_SETOFFLINE: + hwnd = GetDlgItem(hwndDlg, IDC_LST_CONTACTS); + sel = ListView_GetNextItem(hwnd, -1, LVNI_FOCUSED | LVNI_SELECTED); + InvalidateRect(hwnd, 0, TRUE); + changes.hOfflineContact = changes.hContact[sel]; + + FillContactList(hwndDlg, &changes); + SetListSelection(hwnd, sel); + EnableWindow(GetDlgItem(hwndDlg,IDC_BTN_SETOFFLINE),FALSE); + EnableWindow(GetDlgItem(hwndDlg,IDC_VALIDATE),TRUE); + return TRUE; + + case IDC_BTN_REM: + hwnd = GetDlgItem(hwndDlg, IDC_LST_CONTACTS); + sel = ListView_GetNextItem(hwnd, -1, LVNI_FOCUSED | LVNI_SELECTED); + changes.num_contacts--; + changes.hDeletedContacts[changes.num_deleted++] = changes.hContact[sel]; + if (changes.hDefaultContact == changes.hContact[sel]) { + if (changes.num_contacts > 0) { + changes.hDefaultContact = changes.hContact[0]; + SetWindowText(GetDlgItem(hwndDlg,IDC_ED_DEFAULT), pcli->pfnGetContactDisplayName(changes.hDefaultContact, GCDNF_TCHAR)); + } + else { + changes.hDefaultContact = 0; + SetWindowText(GetDlgItem(hwndDlg,IDC_ED_DEFAULT), _T("None")); + } + } + + for (i = sel; i < changes.num_contacts; i++) + changes.hContact[i] = changes.hContact[i + 1]; + FillContactList(hwndDlg, &changes); + + // disable buttons + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_REM), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_SETDEFAULT), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_SETOFFLINE), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_UP), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_DOWN), FALSE); + + // Enable the 'Apply' button. + EnableWindow(GetDlgItem(hwndDlg,IDC_VALIDATE),TRUE); + return TRUE; + + case IDC_BTN_UP: + hwnd = GetDlgItem(hwndDlg, IDC_LST_CONTACTS); + sel = ListView_GetNextItem(hwnd, -1, LVNI_FOCUSED | LVNI_SELECTED); + { + MCONTACT temp = changes.hContact[sel]; + changes.hContact[sel] = changes.hContact[sel - 1]; + changes.hContact[sel-1] = temp; + } + FillContactList(hwndDlg, &changes); + sel--; + SetListSelection(hwnd, sel); + + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_UP), (sel > 0)); + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_DOWN), (sel < changes.num_contacts - 1)); + EnableWindow(GetDlgItem(hwndDlg,IDC_VALIDATE),TRUE); + return TRUE; + + case IDC_BTN_DOWN: + hwnd = GetDlgItem(hwndDlg, IDC_LST_CONTACTS); + sel = ListView_GetNextItem(hwnd, -1, LVNI_FOCUSED | LVNI_SELECTED); + { + MCONTACT temp = changes.hContact[sel]; + changes.hContact[sel] = changes.hContact[sel + 1]; + changes.hContact[sel + 1] = temp; + } + FillContactList(hwndDlg, &changes); + sel++; + SetListSelection(hwnd, sel); + + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_UP), (sel > 0)); + EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_DOWN), (sel < changes.num_contacts - 1)); + EnableWindow(GetDlgItem(hwndDlg,IDC_VALIDATE),TRUE); + return TRUE; + + case IDC_CHK_FORCEDEFAULT: + changes.force_default = IsDlgButtonChecked(hwndDlg, IDC_CHK_FORCEDEFAULT); + EnableWindow(GetDlgItem(hwndDlg,IDC_VALIDATE),TRUE); + return TRUE; + } + } + break; + + case WM_CLOSE: + DestroyWindow(hwndDlg); + return TRUE; + + case WM_DESTROY: + Skin_ReleaseIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, 0)); + EndDialog(hwndDlg, IDCANCEL); + break; + } + + return FALSE; +} -- cgit v1.2.3