//------------------------------------------------------------------------------ bool SpeakAnnounce::readMessage(MCONTACT contact) { std::wstring title = m_user_info.nameString(contact) + L" (" + m_user_info.statusModeString(contact) + L"): "; HWND window = FindWindow(L"#32770", (title + TranslateW(L"Message Session")).c_str()); if (window) { // check if we dont want to read message if dialog is open if (m_db.getEventFlag(AnnounceDatabase::EventFlag_DialogOpen)) return false; // check if we dont want to read message if dialog if focused if ((window == GetForegroundWindow()) && m_db.getEventFlag(AnnounceDatabase::EventFlag_DialogFocused)) return false; } window = FindWindow(L"#32770", (title + TranslateW(L"Message Received")).c_str()); if (window) { // check if we dont want to read message if dialog is open if (m_db.getEventFlag(AnnounceDatabase::EventFlag_DialogOpen)) return false; // check if we dont want to read message if dialog if focused if ((window == GetForegroundWindow()) && m_db.getEventFlag(AnnounceDatabase::EventFlag_DialogFocused)) return false; } return true; }
void VerifyFingerprintMessage(ConnContext *context, bool verify) { MCONTACT hContact = (UINT_PTR)context->app_data; wchar_t msg[1024]; mir_snwprintf(msg, (verify) ? TranslateW(LANG_FINGERPRINT_VERIFIED) : TranslateW(LANG_FINGERPRINT_NOT_VERIFIED), contact_get_nameT(hContact)); ShowMessage(hContact, msg); SetEncryptionStatus(hContact, otr_context_get_trust(context)); }
int msgbox(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) { LPWSTR lpwText = mir_a2u(lpText); LPWSTR lpwCaption = mir_a2u(lpCaption); int r = MessageBoxW(hWnd, TranslateW(lpwText), TranslateW(lpwCaption), uType); mir_free(lpwCaption); mir_free(lpwText); return r; }
//------------------------------------------------------------------------------ // public: //------------------------------------------------------------------------------ EventInformation::EventInformation() : m_event_strings(), m_event_info() { // insert the event strings into a map for easy access m_event_strings[EVENTTYPE_MESSAGE] = TranslateW(L"incoming message from %u"); m_event_strings[EVENTTYPE_URL] = TranslateW(L"incoming URL from %u"); m_event_strings[EVENTTYPE_ADDED] = TranslateW(L"you have been added to %u's contact list"); m_event_strings[EVENTTYPE_AUTHREQUEST] = TranslateW(L"%u requests your authorization"); m_event_strings[EVENTTYPE_FILE] = TranslateW(L"there is an incoming file from %u"); memset(&m_event_info, 0, sizeof(m_event_info)); }
OtrlPolicy policy_from_string(const wchar_t *polstring) { if (mir_wstrcmp(polstring, TranslateW(LANG_POLICY_NEVER)) == 0) return OTRL_POLICY_NEVER; else if (mir_wstrcmp(polstring, TranslateW(LANG_POLICY_OPP)) == 0) return OTRL_POLICY_OPPORTUNISTIC; else if (mir_wstrcmp(polstring, TranslateW(LANG_POLICY_MANUAL)) == 0) return OTRL_POLICY_MANUAL_MOD; else if (mir_wstrcmp(polstring, TranslateW(LANG_POLICY_ALWAYS)) == 0) return OTRL_POLICY_ALWAYS; else return CONTACT_DEFAULT_POLICY; }
const wchar_t *policy_to_string(OtrlPolicy policy) { switch (policy) { case OTRL_POLICY_NEVER: return TranslateW(LANG_POLICY_NEVER); case OTRL_POLICY_OPPORTUNISTIC: return TranslateW(LANG_POLICY_OPP); case OTRL_POLICY_MANUAL: case OTRL_POLICY_MANUAL_MOD: return TranslateW(LANG_POLICY_MANUAL); case OTRL_POLICY_ALWAYS: return TranslateW(LANG_POLICY_ALWAYS); default: return TranslateW(LANG_POLICY_DEFAULT); } }
LPSTR TranslateU( LPCSTR lpText ) { int i; for(i=0;i<ca2u;i++) { if( pa2u[i].a == lpText ) { return pa2u[i].u; } } ca2u++; pa2u = (pA2U) mir_realloc(pa2u,sizeof(A2U)*ca2u); pa2u[i].a = (LPSTR) lpText; if( bCoreUnicode ) { LPWSTR lpwText = mir_a2u(lpText); LPWSTR lpwTran = TranslateW(lpwText); mir_free(lpwText); pa2u[i].u = mir_strdup(exp->utf8encode(lpwTran)); } else { LPSTR lpTran = Translate(lpText); LPWSTR lpwTran = mir_a2u(lpTran); lpTran = exp->utf8encode(lpwTran); mir_free(lpwTran); pa2u[i].u = mir_strdup(lpTran); } return pa2u[i].u; }
void CSAMWindow::checkItemValidity() { COMBOBOXEXITEM cbi = { 0 }; cbi.mask = CBEIF_IMAGE; cbi.iItem = SendDlgItemMessage(m_handle, IDC_COMBO, CB_GETCURSEL, 0, 0); SendDlgItemMessage(m_handle, IDC_COMBO, CBEM_GETITEM, 0, (LPARAM)&cbi); if (m_item->m_iIcon != cbi.iImage) m_item->m_iIcon = cbi.iImage, m_bChanged = TRUE; wchar_t tszInputMessage[EXTRASTATUS_MESSAGE_LIMIT]; GetDlgItemText(m_handle, IDC_MESSAGE, tszInputMessage, _countof(tszInputMessage)); PROTOACCOUNT *pdescr = Proto_GetAccount(m_parent->m_protoName); if (pdescr == nullptr) return; WPARAM i = SendMessage(m_hCombo, CB_GETCURSEL, 0, 0) + 1; wchar_t tszTitle[100]; CUSTOM_STATUS cs = { sizeof(cs) }; cs.flags = CSSF_MASK_NAME | CSSF_DEFAULT_NAME | CSSF_UNICODE; cs.ptszName = tszTitle; cs.wParam = &i; if (CallProtoService(pdescr->szModuleName, PS_GETCUSTOMSTATUSEX, 0, (LPARAM)&cs) == 0) mir_wstrncpy(m_item->m_tszTitle, TranslateW(tszTitle), _countof(m_item->m_tszTitle)); if (mir_wstrcmp(m_item->m_tszMessage, tszInputMessage)) mir_wstrcpy(m_item->m_tszMessage, tszInputMessage), m_bChanged = true; }
//------------------------------------------------------------------------------ void SpeakAnnounce::statusChange(DBCONTACTWRITESETTING *write_setting, HANDLE user) { const std::string STATUS = "Status"; // if the user is myself (NULL) then return // if it's not a status change then return // check and update the user's status, if status didn't change the return if ((NULL == user) || (STATUS != write_setting->szSetting) || (!m_user_info.updateStatus(user, write_setting->value.wVal))) { return; } // check if we just connected, and want to suppress status changes if (!m_db.getStatusFlag(AnnounceDatabase::StatusFlag_SuppressConnect) && m_protocol_info.isDisabled((char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)user, 0))) { return; } bool speak = false; switch (write_setting->value.wVal) { case ID_STATUS_OFFLINE: speak = m_db.getStatusFlag(AnnounceDatabase::StatusFlag_Offline); break; case ID_STATUS_ONLINE: speak = m_db.getStatusFlag(AnnounceDatabase::StatusFlag_Online); break; case ID_STATUS_AWAY: speak = m_db.getStatusFlag(AnnounceDatabase::StatusFlag_Away); break; case ID_STATUS_DND: speak = m_db.getStatusFlag(AnnounceDatabase::StatusFlag_Dnd); break; case ID_STATUS_NA: speak = m_db.getStatusFlag(AnnounceDatabase::StatusFlag_Na); break; case ID_STATUS_OCCUPIED: speak = m_db.getStatusFlag(AnnounceDatabase::StatusFlag_Occupied); break; case ID_STATUS_FREECHAT: speak = m_db.getStatusFlag(AnnounceDatabase::StatusFlag_FreeForChat); break; case ID_STATUS_INVISIBLE: speak = m_db.getStatusFlag(AnnounceDatabase::StatusFlag_Invisible); break; } if (!speak) { return; } // translate, insert name then speak std::wstring status_str = TranslateW(m_user_info.statusString(user).c_str()); m_user_info.insertName(status_str, user); status(status_str, user); }
//------------------------------------------------------------------------------ std::wstring UserInformation::nameString(MCONTACT user) const { //WCHAR *ret = reinterpret_cast<WCHAR *>(CallService(MS_CLIST_GETCONTACTDISPLAYNAME, reinterpret_cast<unsigned int>(user), 0)); char* ret = (char *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, WPARAM(user), 0); if (0 == ret) { return L""; } return TranslateW(mir_a2t_cp(ret, CP_UTF8)); }
void showPopupMsg(HANDLE hContact, LPCSTR lpzText, HICON hIcon, int type) { // type: // 0 - error // 1 - key sent // 2 - key recv // 3 - established // 4 - disabled // 5 - msg recv // 6 - msg sent // if(!bPopupExists) return; char nback[32]; mir_snprintf(nback,sizeof(nback),"popup%dback", $type); char ntext[32]; mir_snprintf(ntext,sizeof(ntext),"popup%dtext", $type); char ntime[32]; mir_snprintf(ntime,sizeof(ntime),"popup%dtime", $type); COLORREF colorBack = (COLORREF)DBGetContactSettingDword(0,szModuleName,nback,(DWORD)RGB(230,230,255)); COLORREF colorText = (COLORREF)DBGetContactSettingDword(0,szModuleName,ntext,(DWORD)RGB(0,0,0)); int timeout = (int)DBGetContactSettingWord(0,szModuleName,ntime,0); if( bCoreUnicode && bPopupUnicode ) { POPUPDATAW ppd; memset(&ppd,0,sizeof(POPUPDATAW)); ppd.lchContact = hContact; ppd.lchIcon = hIcon; LPWSTR lpwzContactName = (LPWSTR)CallService(MS_CLIST_GETCONTACTDISPLAYNAME,(WPARAM)hContact,GCMDF_UNICODE); wcscpy(ppd.lpwzContactName, lpwzContactName); LPWSTR lpwzText = mir_a2u(lpzText); wcscpy(ppd.lpwzText, TranslateW(lpwzText)); mir_free(lpwzText); ppd.colorBack = colorBack; ppd.colorText = colorText; ppd.iSeconds = timeout; // ppd.PluginWindowProc = (WNDPROC)PopupDlgProc; // ppd.PluginData = NULL; CallService(MS_POPUP_ADDPOPUPW, (WPARAM)&ppd, 0); } else { POPUPDATAEX ppd; memset(&ppd,0,sizeof(POPUPDATAEX)); ppd.lchContact = hContact; ppd.lchIcon = hIcon; LPSTR lpzContactName = (LPSTR)CallService(MS_CLIST_GETCONTACTDISPLAYNAME,(WPARAM)hContact,0); strcpy(ppd.lpzContactName, lpzContactName); strcpy(ppd.lpzText, Translate(lpzText)); ppd.colorBack = colorBack; ppd.colorText = colorText; ppd.iSeconds = timeout; // ppd.PluginWindowProc = (WNDPROC)PopupDlgProc; // ppd.PluginData = NULL; CallService(MS_POPUP_ADDPOPUPEX, (WPARAM)&ppd, 0); } }
void CSWindow::initButtons() { for (int i = 0; i < _countof(forms); i++) { if (forms[i].idc < 0) continue; SendDlgItemMessage(m_handle, forms[i].idc, BM_SETIMAGE, IMAGE_ICON, (LPARAM)IcoLib_GetIconByHandle(forms[i].hIcoLibItem)); SendDlgItemMessage(m_handle, forms[i].idc, BUTTONSETASFLATBTN, TRUE, 0); //maybe set as BUTTONSETDEFAULT? SendDlgItemMessage(m_handle, forms[i].idc, BUTTONADDTOOLTIP, (WPARAM)TranslateW(forms[i].ptszTitle), BATF_UNICODE); } }
MIR_CORE_DLL(TCHAR*) Langpack_PcharToTchar(const char *pszStr) { if (pszStr == NULL) return NULL; int len = (int)strlen(pszStr); TCHAR *result = (TCHAR*)alloca((len + 1)*sizeof(TCHAR)); MultiByteToWideChar(Langpack_GetDefaultCodePage(), 0, pszStr, -1, result, len); result[len] = 0; return mir_wstrdup(TranslateW(result)); }
void InitComboBox(HWND hWndCombo,FieldNames *lpNames) { DWORD dwItem; ResetComboBox(hWndCombo); for (SIZE_T i=0;lpNames[i].lpszText;i++) { dwItem=SendMessage(hWndCombo,CB_ADDSTRING,0,(LPARAM)TranslateW(lpNames[i].lpszText)); SendMessage(hWndCombo,CB_SETITEMDATA,dwItem,lpNames[i].dwCode); } }
INT_PTR CMraProto::MraSendNudge(WPARAM hContact, LPARAM) { if (m_bLoggedIn && hContact) { LPWSTR lpwszAlarmMessage = TranslateW(MRA_ALARM_MESSAGE); CMStringA szEmail; if (mraGetStringA(hContact, "e-mail", szEmail)) if (MraMessage(FALSE, hContact, 0, (MESSAGE_FLAG_RTF | MESSAGE_FLAG_ALARM), szEmail, lpwszAlarmMessage, NULL, 0)) return 0; } return 1; }
void showPopup(LPCSTR lpzText,HANDLE hContact,HICON hIcon, UINT type) { //type=0 key colors //type=1 session colors //type=2 SR colors if (!bPopupExists) return; COLORREF colorBack, colorText; int timeout=0; DBVARIANT dbv; if (type == 0) { colorBack = db_get_dw(0, MODULENAME, "colorKeyb", RGB(230,230,255)); colorText = db_get_dw(0, MODULENAME, "colorKeyt", RGB(0,0,0)); if (!db_get_s(0, MODULENAME, "timeoutKey", &dbv)) { timeout = atoi(dbv.pszVal); db_free(&dbv); } } else if (type == 1) { colorBack = db_get_dw(0, MODULENAME, "colorSecb", RGB(255,255,200)); colorText = db_get_dw(0, MODULENAME, "colorSect", RGB(0,0,0)); if (!db_get_s(0, MODULENAME, "timeoutSec" ,&dbv)) { timeout = atoi(dbv.pszVal); db_free(&dbv); } } else if (type >= 2) { colorBack = db_get_dw(0, MODULENAME, "colorSRb", RGB(200,255,200)); colorText = db_get_dw(0, MODULENAME, "colorSRt", RGB(0,0,0)); if (!db_get_s(0, MODULENAME, "timeoutSR", &dbv)) { timeout = atoi(dbv.pszVal); db_free(&dbv); } } POPUPDATAW ppd = {0}; ppd.lchContact = hContact; //Be sure to use a GOOD handle, since this will not be checked. ppd.lchIcon = hIcon; LPWSTR lpwzContactName = (LPWSTR)CallService(MS_CLIST_GETCONTACTDISPLAYNAME,(WPARAM)hContact,GSMDF_UNICODE); wcscpy(ppd.lpwzContactName, lpwzContactName); LPWSTR lpwzText = mir_a2u(lpzText); wcscpy(ppd.lpwzText, TranslateW(lpwzText)); mir_free(lpwzText); ppd.colorBack = colorBack; ppd.colorText = colorText; ppd.iSeconds = timeout; PUAddPopupW(&ppd); }
TCHAR* LangPackPcharToTchar( const char* pszStr ) { if ( pszStr == NULL ) return NULL; #if defined( _UNICODE ) { int len = (int)strlen( pszStr ); TCHAR* result = ( TCHAR* )alloca(( len+1 )*sizeof( TCHAR )); MultiByteToWideChar( LangPackGetDefaultCodePage(), 0, pszStr, -1, result, len ); result[len] = 0; return mir_wstrdup( TranslateW( result )); } #else return mir_strdup( Translate( pszStr )); #endif }
wchar_t *HTMLBuilder::getContactName(HANDLE hContact, const char* szProto) { CONTACTINFO ci; wchar_t *szName = NULL; ZeroMemory(&ci, sizeof(ci)); ci.cbSize = sizeof(ci); ci.hContact = hContact; ci.szProto = (char *)szProto; ci.dwFlag = CNF_DISPLAY | CNF_UNICODE; if (!CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM) & ci)) { if (ci.type == CNFT_ASCIIZ) { if (ci.pszVal) { if(!wcscmp((wchar_t *)ci.pszVal, TranslateW(L"'(Unknown Contact)'"))) { ci.dwFlag &= ~CNF_UNICODE; if (!CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM) & ci)) { szName = Utils::convertToWCS((char *)ci.pszVal); } } else { szName = Utils::dupString((wchar_t *)ci.pszVal); } miranda_sys_free(ci.pszVal); } } } if (szName != NULL) return szName; ci.dwFlag = CNF_UNIQUEID; if (!CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM) & ci)) { if (ci.type == CNFT_ASCIIZ) { if (ci.pszVal) { szName = Utils::convertToWCS((char *)ci.pszVal); miranda_sys_free(ci.pszVal); } } } if (szName != NULL) return szName; char *szNameStr = (char *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, 0); if (szNameStr != NULL) { return Utils::convertToWCS(szNameStr); } return Utils::dupString(TranslateT("(Unknown Contact)")); }
void CSAMWindow::setCombo() { PROTOACCOUNT *pdescr = Proto_GetAccount(m_parent->m_protoName); if (pdescr == nullptr) return; const char *szUniqueID = Proto_GetUniqueId(pdescr->szModuleName); if (szUniqueID == nullptr) return; DBVARIANT dbv; if (db_get(NULL, pdescr->szModuleName, szUniqueID, &dbv)) return; db_free(&dbv); WPARAM iStatus; wchar_t tszName[100]; CUSTOM_STATUS cs = { sizeof(cs) }; cs.flags = CSSF_MASK_NAME | CSSF_DEFAULT_NAME | CSSF_UNICODE; cs.ptszName = tszName; cs.wParam = &iStatus; SendMessage(m_hCombo, CBEM_SETIMAGELIST, 0, (LPARAM)m_parent->m_icons); for (int i = 1; i <= m_parent->m_statusCount; i++) { iStatus = i; if (CallProtoService(pdescr->szModuleName, PS_GETCUSTOMSTATUSEX, 0, (LPARAM)&cs) != 0) continue; COMBOBOXEXITEM cbi = { 0 }; cbi.mask = CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE; cbi.iItem = -1; cbi.iImage = cbi.iSelectedImage = i - 1; cbi.pszText = TranslateW(tszName); SendMessage(m_hCombo, CBEM_INSERTITEM, 0, (LPARAM)&cbi); } SendMessage(m_hCombo, CB_SETCURSEL, 0, 0); // first 0 sets selection to top }
void GetStatusText(MCONTACT hContact, WORD newStatus, WORD oldStatus, wchar_t *stzStatusText) { if (opt.UseAlternativeText) { switch (GetGender(hContact)) { case GENDER_MALE: wcsncpy(stzStatusText, StatusList[Index(newStatus)].lpzMStatusText, MAX_STATUSTEXT); break; case GENDER_FEMALE: wcsncpy(stzStatusText, StatusList[Index(newStatus)].lpzFStatusText, MAX_STATUSTEXT); break; case GENDER_UNSPECIFIED: wcsncpy(stzStatusText, StatusList[Index(newStatus)].lpzUStatusText, MAX_STATUSTEXT); break; } } else wcsncpy(stzStatusText, StatusList[Index(newStatus)].lpzStandardText, MAX_STATUSTEXT); if (opt.ShowPreviousStatus) { wchar_t buff[MAX_STATUSTEXT]; mir_snwprintf(buff, TranslateW(STRING_SHOWPREVIOUSSTATUS), StatusList[Index(oldStatus)].lpzStandardText); mir_wstrcat(mir_wstrcat(stzStatusText, L" "), buff); } }
//------------------------------------------------------------------------------ std::wstring EventInformation::getMessage() { const std::wstring intro = TranslateW(L"%u says"); return intro + L" " + mir_a2t_cp((char*)m_event_info.pBlob, CP_UTF8); }
static INT_PTR GetContactInfo(WPARAM, LPARAM lParam) { DBVARIANT dbv; CONTACTINFO *ci = (CONTACTINFO*)lParam; if (ci==NULL) return 1; if (ci->szProto==NULL) ci->szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEACCOUNT,(WPARAM)ci->hContact,0); if (ci->szProto==NULL) return 1; ci->type = 0; switch(ci->dwFlag & 0x7F) { case CNF_FIRSTNAME: return ProcessDatabaseValueDefault( ci, "FirstName" ); case CNF_LASTNAME: return ProcessDatabaseValueDefault( ci, "LastName" ); case CNF_NICK: return ProcessDatabaseValueDefault( ci, "Nick" ); case CNF_EMAIL: return ProcessDatabaseValueDefault( ci, "e-mail" ); case CNF_CITY: return ProcessDatabaseValueDefault( ci, "City" ); case CNF_STATE: return ProcessDatabaseValueDefault( ci, "State" ); case CNF_PHONE: return ProcessDatabaseValueDefault( ci, "Phone" ); case CNF_HOMEPAGE: return ProcessDatabaseValueDefault( ci, "Homepage" ); case CNF_ABOUT: return ProcessDatabaseValueDefault( ci, "About" ); case CNF_AGE: return ProcessDatabaseValueDefault( ci, "Age" ); case CNF_GENDER: return ProcessDatabaseValueDefault( ci, "Gender" ); case CNF_FAX: return ProcessDatabaseValueDefault( ci, "Fax" ); case CNF_CELLULAR: return ProcessDatabaseValueDefault( ci, "Cellular" ); case CNF_BIRTHDAY: return ProcessDatabaseValueDefault( ci, "BirthDay" ); case CNF_BIRTHMONTH: return ProcessDatabaseValueDefault( ci, "BirthMonth" ); case CNF_BIRTHYEAR: return ProcessDatabaseValueDefault( ci, "BirthYear" ); case CNF_STREET: return ProcessDatabaseValueDefault( ci, "Street" ); case CNF_ZIP: return ProcessDatabaseValueDefault( ci, "ZIP" ); case CNF_LANGUAGE1: return ProcessDatabaseValueDefault( ci, "Language1" ); case CNF_LANGUAGE2: return ProcessDatabaseValueDefault( ci, "Language2" ); case CNF_LANGUAGE3: return ProcessDatabaseValueDefault( ci, "Language3" ); case CNF_CONAME: return ProcessDatabaseValueDefault( ci, "Company" ); case CNF_CODEPT: return ProcessDatabaseValueDefault( ci, "CompanyDepartment" ); case CNF_COPOSITION: return ProcessDatabaseValueDefault( ci, "CompanyPosition" ); case CNF_COSTREET: return ProcessDatabaseValueDefault( ci, "CompanyStreet" ); case CNF_COCITY: return ProcessDatabaseValueDefault( ci, "CompanyCity" ); case CNF_COSTATE: return ProcessDatabaseValueDefault( ci, "CompanyState" ); case CNF_COZIP: return ProcessDatabaseValueDefault( ci, "CompanyZIP" ); case CNF_COHOMEPAGE: return ProcessDatabaseValueDefault( ci, "CompanyHomepage" ); case CNF_CUSTOMNICK: { char* saveProto = ci->szProto; ci->szProto = "CList"; if ( ci->hContact != NULL && !ProcessDatabaseValueDefault( ci, "MyHandle" )) { ci->szProto = saveProto; return 0; } ci->szProto = saveProto; break; } case CNF_COUNTRY: case CNF_COCOUNTRY: if ( !GetDatabaseString( ci, (ci->dwFlag & 0x7F) == CNF_COUNTRY ? "CountryName" : "CompanyCountryName", &dbv )) return 0; if ( !DBGetContactSetting( ci->hContact, ci->szProto, (ci->dwFlag & 0x7F)==CNF_COUNTRY ? "Country" : "CompanyCountry", &dbv )) { if ( dbv.type == DBVT_WORD ) { int i,countryCount; struct CountryListEntry *countries; CallService(MS_UTILS_GETCOUNTRYLIST,(WPARAM)&countryCount,(LPARAM)&countries); for(i=0;i<countryCount;i++) { if(countries[i].id!=dbv.wVal) continue; if ( ci->dwFlag & CNF_UNICODE ) { int cbLen = MultiByteToWideChar( CP_ACP, 0, ( LPCSTR )countries[i].szName, -1, NULL, 0 ); WCHAR* buf = ( WCHAR* )mir_alloc( sizeof( WCHAR )*(cbLen+1) ); if ( buf != NULL ) MultiByteToWideChar( CP_ACP, 0, ( LPCSTR )countries[i].szName, -1, buf, cbLen ); ci->pszVal = ( TCHAR* )buf; } else ci->pszVal = ( TCHAR* )mir_strdup(countries[i].szName); ci->type = CNFT_ASCIIZ; DBFreeVariant(&dbv); return 0; } } else return ProcessDatabaseValueDefault( ci, (ci->dwFlag & 0x7F)==CNF_COUNTRY ? "Country" : "CompanyCountry" ); DBFreeVariant(&dbv); } break; case CNF_FIRSTLAST: if( !GetDatabaseString( ci, "FirstName", &dbv )) { DBVARIANT dbv2; if(!GetDatabaseString(ci,"LastName",&dbv2)) { ci->type = CNFT_ASCIIZ; if ( ci->dwFlag & CNF_UNICODE ) { size_t len = wcslen(dbv.pwszVal) + wcslen(dbv2.pwszVal) + 2; WCHAR* buf = ( WCHAR* )mir_alloc( sizeof( WCHAR )*len ); if ( buf != NULL ) wcscat( wcscat( wcscpy( buf, dbv.pwszVal ), L" " ), dbv2.pwszVal ); ci->pszVal = ( TCHAR* )buf; } else { size_t len = strlen(dbv.pszVal) + strlen(dbv2.pszVal) + 2; char* buf = ( char* )mir_alloc( len ); if ( buf != NULL ) strcat( strcat( strcpy( buf, dbv.pszVal ), " " ), dbv2.pszVal ); ci->pszVal = ( TCHAR* )buf; } DBFreeVariant( &dbv ); DBFreeVariant( &dbv2 ); return 0; } DBFreeVariant( &dbv ); } break; case CNF_UNIQUEID: { char *uid = (char*)CallProtoService(ci->szProto,PS_GETCAPS,PFLAG_UNIQUEIDSETTING,0); if ((INT_PTR)uid!=CALLSERVICE_NOTFOUND&&uid) if (!ProcessDatabaseValueDefault(ci,uid)) return 0; break; } case CNF_DISPLAYUID: { if (!ProcessDatabaseValueDefault(ci, "display_uid")) return 0; char *uid = (char*)CallProtoService(ci->szProto,PS_GETCAPS,PFLAG_UNIQUEIDSETTING,0); if ((INT_PTR)uid!=CALLSERVICE_NOTFOUND&&uid) if (!ProcessDatabaseValueDefault(ci,uid)) return 0; break; } case CNF_DISPLAYNC: case CNF_DISPLAY: { int i; for( i=0; i < NAMEORDERCOUNT; i++ ) { switch(nameOrder[i]) { case 0: // custom name { // make sure we aren't in CNF_DISPLAYNC mode // don't get custom name for NULL contact char* saveProto = ci->szProto; ci->szProto = "CList"; if (ci->hContact!=NULL && (ci->dwFlag&0x7F)==CNF_DISPLAY && !ProcessDatabaseValueDefault(ci,"MyHandle")) { ci->szProto = saveProto; return 0; } ci->szProto = saveProto; break; } case 1: if ( !ProcessDatabaseValueDefault( ci, "Nick" )) // nick return 0; break; case 2: if ( !ProcessDatabaseValueDefault( ci, "FirstName" )) // First Name return 0; break; case 3: if ( !ProcessDatabaseValueDefault( ci, "e-mail" )) // E-mail return 0; break; case 4: if ( !ProcessDatabaseValueDefault( ci, "LastName" )) // Last Name return 0; break; case 5: // Unique id { // protocol must define a PFLAG_UNIQUEIDSETTING char *uid = (char*)CallProtoService(ci->szProto,PS_GETCAPS,PFLAG_UNIQUEIDSETTING,0); if ((INT_PTR)uid!=CALLSERVICE_NOTFOUND&&uid) { if (!GetDatabaseString(ci,uid,&dbv)) { if ( dbv.type == DBVT_BYTE || dbv.type == DBVT_WORD || dbv.type == DBVT_DWORD ) { long value = (dbv.type == DBVT_BYTE) ? dbv.bVal:(dbv.type==DBVT_WORD ? dbv.wVal : dbv.dVal); if ( ci->dwFlag & CNF_UNICODE ) { WCHAR buf[ 40 ]; _ltow( value, buf, 10 ); ci->pszVal = ( TCHAR* )mir_wstrdup( buf ); } else { char buf[ 40 ]; _ltoa( value, buf, 10 ); ci->pszVal = ( TCHAR* )mir_strdup(buf); } ci->type = CNFT_ASCIIZ; return 0; } if (dbv.type == DBVT_ASCIIZ && !(ci->dwFlag & CNF_UNICODE)) { ci->type = CNFT_ASCIIZ; ci->pszVal = dbv.ptszVal; return 0; } if (dbv.type == DBVT_WCHAR && (ci->dwFlag & CNF_UNICODE)) { ci->type = CNFT_ASCIIZ; ci->pszVal = dbv.ptszVal; return 0; } } } break; } case 6: // first + last name if(!GetDatabaseString(ci,"FirstName",&dbv)) { DBVARIANT dbv2; if(!GetDatabaseString(ci,"LastName",&dbv2)) { ci->type = CNFT_ASCIIZ; if ( ci->dwFlag & CNF_UNICODE ) { size_t len = wcslen(dbv.pwszVal) + wcslen(dbv2.pwszVal) + 2; WCHAR* buf = ( WCHAR* )mir_alloc( sizeof( WCHAR )*len ); if ( buf != NULL ) wcscat( wcscat( wcscpy( buf, dbv.pwszVal ), L" " ), dbv2.pwszVal ); ci->pszVal = ( TCHAR* )buf; } else { size_t len = strlen(dbv.pszVal) + strlen(dbv2.pszVal) + 2; char* buf = ( char* )mir_alloc( len ); if ( buf != NULL ) strcat( strcat( strcpy( buf, dbv.pszVal ), " " ), dbv2.pszVal ); ci->pszVal = ( TCHAR* )buf; } DBFreeVariant( &dbv ); DBFreeVariant( &dbv2 ); return 0; } DBFreeVariant( &dbv ); } break; case 7: if ( ci->dwFlag & CNF_UNICODE ) ci->pszVal = ( TCHAR* )mir_wstrdup( TranslateW( L"'(Unknown Contact)'" )); else ci->pszVal = ( TCHAR* )mir_strdup( Translate("'(Unknown Contact)'")); ci->type = CNFT_ASCIIZ; return 0; } } } break; case CNF_TIMEZONE: { HANDLE hTz = tmi.createByContact(ci->hContact, TZF_KNOWNONLY); if (hTz) { LPTIME_ZONE_INFORMATION tzi = tmi.getTzi(hTz); int offset = tzi->Bias + tzi->StandardBias; char str[80]; mir_snprintf(str, SIZEOF(str), offset ? "UTC%+d:%02d" : "UTC", offset / -60, abs(offset % 60)); ci->pszVal = ci->dwFlag & CNF_UNICODE ? (TCHAR*)mir_a2u(str) : (TCHAR*)mir_strdup(str); ci->type = CNFT_ASCIIZ; return 0; } break; } case CNF_MYNOTES: { char* saveProto = ci->szProto; ci->szProto = "UserInfo"; if (!ProcessDatabaseValueDefault(ci,"MyNotes")) { ci->szProto = saveProto; return 0; } ci->szProto = saveProto; break; } } return 1; }
INT_PTR CALLBACK CSWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { CSWindow* csw = (CSWindow*)GetWindowLongPtr(hwnd, GWLP_USERDATA); switch (message) { case WM_INITDIALOG: TranslateDialogDefault(hwnd); csw = (CSWindow*)lparam; arWindows.insert(csw); SetWindowLongPtr(hwnd, GWLP_USERDATA, lparam); csw->m_handle = hwnd; csw->initIcons(); csw->initButtons(); csw->m_listview = new CSListView(GetDlgItem(hwnd, IDC_CSLIST), csw); csw->m_listview->initItems(csw->m_itemslist->m_list->getListHead()); csw->toggleButtons(); csw->toggleEmptyListMessage(); csw->loadWindowPosition(); SetWindowText(hwnd, MODULENAME); return TRUE; case WM_COMMAND: switch (LOWORD(wparam)) { case IDC_MODIFY: case IDC_ADD: csw->m_addModifyDlg = new CSAMWindow(LOWORD(wparam), csw); csw->m_addModifyDlg->exec(); if (csw->m_addModifyDlg->m_bChanged) { if (LOWORD(wparam) == IDC_MODIFY) csw->m_itemslist->m_list->remove(csw->m_listview->getPositionInList()); int selection = csw->m_itemslist->m_list->add(csw->m_addModifyDlg->m_item); csw->m_bSomethingChanged = TRUE; csw->m_listview->reinitItems(csw->m_itemslist->m_list->getListHead()); csw->m_listview->setFullFocusedSelection(selection); csw->toggleButtons(); csw->toggleEmptyListMessage(); } delete csw->m_addModifyDlg; break; case IDC_REMOVE: if (getByte("ConfirmDeletion", DEFAULT_PLUGIN_CONFIRM_ITEMS_DELETION)) if (MessageBox(hwnd, TranslateT("Do you really want to delete selected item?"), TranslateW(MODULENAME), MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION) == IDNO) break; csw->m_itemslist->m_list->remove(csw->m_listview->getPositionInList()); csw->m_bSomethingChanged = TRUE; csw->m_listview->reinitItems(csw->m_itemslist->m_list->getListHead()); csw->toggleButtons(); csw->toggleEmptyListMessage(); break; case IDC_FAVOURITE: { int selection = csw->m_listview->getPositionInList(); StatusItem* f = new StatusItem(*csw->m_itemslist->m_list->get(selection)); f->m_bFavourite = !f->m_bFavourite; csw->m_itemslist->m_list->remove(selection); selection = csw->m_itemslist->m_list->add(f); csw->m_bSomethingChanged = TRUE; csw->m_listview->reinitItems(csw->m_itemslist->m_list->getListHead()); csw->m_listview->setFullFocusedSelection(selection); csw->toggleButtons(); } break; case IDC_UNDO: csw->m_itemslist->m_list->destroy(); csw->m_itemslist->loadItems(csw->m_protoName); csw->m_bSomethingChanged = FALSE; csw->m_listview->reinitItems(csw->m_itemslist->m_list->getListHead()); csw->toggleButtons(); csw->toggleEmptyListMessage(); break; case IDC_IMPORT: { int result = getByte("DeleteAfterImport", DEFAULT_PLUGIN_DELETE_AFTER_IMPORT); if (result == TRUE) result = IDYES; else { result = MessageBox(hwnd, TranslateT("Do you want old database entries to be deleted after Import?"), TranslateW(MODULENAME), MB_YESNOCANCEL | MB_DEFBUTTON2 | MB_ICONQUESTION); if (result == IDCANCEL) break; } importCustomStatuses(csw, result); csw->m_bSomethingChanged = TRUE; csw->toggleButtons(); csw->toggleEmptyListMessage(); } break; case IDC_FILTER: csw->toggleFilter(); csw->toggleButtons(); break; case IDC_FILTER_FIELD: if (HIWORD(wparam) == EN_CHANGE) csw->m_listview->reinitItems(csw->m_itemslist->m_list->getListHead()); break; case IDCLOSE: // close and save, no custom status case IDCANCEL: // close and save, no custom status case IDC_CANCEL: // close and save, cancel custom status case IDOK: // close and save, set selected custom status if (LOWORD(wparam) == IDOK && csw->toggleButtons()) SetStatus(IDOK, csw->m_itemslist->m_list->get(csw->m_listview->getPositionInList()), csw->m_protoName); if (LOWORD(wparam) == IDC_CANCEL) SetStatus(IDC_CANCEL, nullptr, csw->m_protoName); if (csw->m_bSomethingChanged) csw->m_itemslist->saveItems(csw->m_protoName); csw->saveWindowPosition(csw->m_handle); EndDialog(hwnd, FALSE); break; } return FALSE; case WM_NOTIFY: if (wparam == IDC_CSLIST) { NMHDR* pnmh = (NMHDR*)lparam; switch (pnmh->code) { case NM_DBLCLK: PostMessage(hwnd, WM_COMMAND, IDOK, 0L); break; case LVN_ITEMCHANGED: case NM_CLICK: csw->toggleButtons(); break; } } return FALSE; case WM_CTLCOLORSTATIC: SetTextColor((HDC)wparam, RGB(174, 174, 174)); if (((HWND)lparam == GetDlgItem(hwnd, IDC_NO_ITEMS)) || ((HWND)lparam == GetDlgItem(hwnd, IDC_ADD_SAMPLE))) return (INT_PTR)GetStockObject(WHITE_BRUSH); return NULL; case WM_DESTROY: SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); arWindows.remove(csw); delete csw->m_listview; csw->deinitIcons(); delete csw; break; } return FALSE; }
/** * This is the service procedure to retrieve contact information * * @param wParam - not used * @param lParam - pointer to a CONTACTINFO structure which tells what information is desired * * @retval 0 - if contact information was found and read correctly * @retval 1 - if any error occured or setting was not found **/ INT_PTR GetContactInfo(WPARAM wParam, LPARAM lParam) { CONTACTINFO *ci = (CONTACTINFO*) lParam; INT_PTR result; if (ci && ci->cbSize == sizeof(CONTACTINFO) && (ci->szProto != NULL || (ci->szProto = DB::Contact::Proto(ci->hContact)) != NULL)) { switch (ci->dwFlag & 0x7F) { // // contact name // case CNF_FIRSTNAME: { result = GCIVarEx(ci, SET_CONTACT_FIRSTNAME); } break; case CNF_LASTNAME: { result = GCIVarEx(ci, SET_CONTACT_LASTNAME); } break; case CNF_FIRSTLAST: { result = GCIVarEx(ci, SET_CONTACT_FIRSTLASTNAME); //first try to read "FullName" if(result) result = GCIFirstLast(ci); //fallback to "FirstName" + "LastName" } break; case CNF_NICK: { result = GCIVarEx(ci, SET_CONTACT_NICK); } break; case CNF_CUSTOMNICK: { LPSTR s = ci->szProto; ci->szProto = MOD_CLIST; result = GCIVar(ci, SET_CONTACT_MYHANDLE); ci->szProto = s; } break; case CNF_LANGUAGE1: { result = GCILangEx(ci, SET_CONTACT_LANG1); } break; case CNF_LANGUAGE2: { result = GCILangEx(ci, SET_CONTACT_LANG2); } break; case CNF_LANGUAGE3: { result = GCILangEx(ci, SET_CONTACT_LANG3); } break; // // private contact // case CNF_STREET: { result = GCIVarEx(ci, SET_CONTACT_STREET); } break; case CNF_ZIP: { result = GCIVarEx(ci, SET_CONTACT_ZIP); } break; case CNF_CITY: { result = GCIVarEx(ci, SET_CONTACT_CITY); } break; case CNF_STATE: { result = GCIVarEx(ci, SET_CONTACT_STATE); } break; case CNF_COUNTRY: { result = GCICountry(ci, SET_CONTACT_COUNTRY); } break; case CNF_PHONE: { result = GCIVarEx(ci, SET_CONTACT_PHONE); } break; case CNF_FAX: { result = GCIVarEx(ci, SET_CONTACT_FAX); } break; case CNF_CELLULAR: { result = GCIVarEx(ci, SET_CONTACT_CELLULAR); } break; case CNF_EMAIL: { result = GCIVarEx(ci, SET_CONTACT_EMAIL); } break; case CNF_HOMEPAGE: { result = GCIVarEx(ci, SET_CONTACT_HOMEPAGE); } break; // // company information // case CNF_CONAME: { result = GCIVarEx(ci, SET_CONTACT_COMPANY); } break; case CNF_CODEPT: { result = GCIVarEx(ci, SET_CONTACT_COMPANY_DEPARTMENT); } break; case CNF_COPOSITION: { result = GCIVarEx(ci, SET_CONTACT_COMPANY_POSITION); } break; case CNF_COSTREET: { result = GCIVarEx(ci, SET_CONTACT_COMPANY_STREET); } break; case CNF_COZIP: { result = GCIVarEx(ci, SET_CONTACT_COMPANY_ZIP); } break; case CNF_COCITY: { result = GCIVarEx(ci, SET_CONTACT_COMPANY_CITY); } break; case CNF_COSTATE: { result = GCIVarEx(ci, SET_CONTACT_COMPANY_STATE); } break; case CNF_COCOUNTRY: { result = GCICountry(ci, SET_CONTACT_COMPANY_COUNTRY); } break; case CNF_COPHONE: { result = GCIVarEx(ci, SET_CONTACT_COMPANY_PHONE); } break; case CNF_COFAX: { result = GCIVarEx(ci, SET_CONTACT_COMPANY_FAX); } break; case CNF_COCELLULAR: { result = GCIVarEx(ci, SET_CONTACT_COMPANY_CELLULAR); } break; case CNF_COEMAIL: { result = GCIVarEx(ci, SET_CONTACT_COMPANY_EMAIL); } break; case CNF_COHOMEPAGE: { result = GCIVarEx(ci, SET_CONTACT_COMPANY_HOMEPAGE); } break; // // personal information // case CNF_ABOUT: { result = GCIVarEx(ci, SET_CONTACT_ABOUT); } break; case CNF_MYNOTES: { result = GCIVarEx(ci, SET_CONTACT_MYNOTES); } break; case CNF_AGE: { result = GCIVarEx(ci, SET_CONTACT_AGE); } break; // returns age (byte, 0==unspecified) ?? case CNF_GENDER: { ci->bVal = GenderOf(ci->hContact, ci->szProto); ci->type = (ci->bVal != 0) ? CNFT_BYTE : 0; result = ci->type == 0; } break; case CNF_BIRTHDAY: { MAnnivDate mda; result = mda.DBGetBirthDate(ci->hContact, ci->szProto); if (result == 0) { ci->bVal = (BYTE) mda.Day(); ci->type = CNFT_BYTE; } } break; case CNF_BIRTHMONTH: { MAnnivDate mda; result = mda.DBGetBirthDate(ci->hContact, ci->szProto); if (result == 0) { ci->bVal = (BYTE) mda.Month(); ci->type = CNFT_BYTE; } } break; case CNF_BIRTHYEAR: { MAnnivDate mda; result = mda.DBGetBirthDate(ci->hContact, ci->szProto); if (result == 0) { ci->wVal = (WORD) mda.Year(); ci->type = CNFT_WORD; } } break; case CNF_BIRTHDATE: { MAnnivDate mda; result = mda.DBGetBirthDate(ci->hContact, ci->szProto); if (result == 0) { SYSTEMTIME st = mda.SystemTime(); ci->pszVal = NULL; if (ci->dwFlag & CNF_UNICODE) { WCHAR wszDate[80]; if (GetDateFormatW(LOCALE_USER_DEFAULT, wParam == 1 ? DATE_LONGDATE : DATE_SHORTDATE, &st, NULL, wszDate, SIZEOF(wszDate))) { ci->pszVal = (LPTSTR)mir_wcsdup(wszDate); } } else { CHAR szDate[80]; if (GetDateFormatA(LOCALE_USER_DEFAULT, wParam == 1 ? DATE_LONGDATE : DATE_SHORTDATE, &st, NULL, szDate, SIZEOF(szDate))) { ci->pszVal = (LPTSTR)mir_strdup(szDate); } } ci->type = (ci->pszVal != NULL) ? CNFT_ASCIIZ : 0; result = ci->type == 0; } } break; case CNF_TIMEZONE: { //use new core tz interface if(tmi.prepareList) { HANDLE hTz = tmi.createByContact(ci->hContact, TZF_KNOWNONLY); if (hTz) { LPTIME_ZONE_INFORMATION tzi = tmi.getTzi(hTz); int offset = tzi->Bias + tzi->StandardBias; char str[80]; mir_snprintf(str, SIZEOF(str), offset ? "UTC%+d:%02d" : "UTC", offset / -60, abs(offset % 60)); ci->pszVal = ci->dwFlag & CNF_UNICODE ? (TCHAR*)mir_a2u(str) : (TCHAR*)mir_strdup(str); ci->type = CNFT_ASCIIZ; return 0; } else { ci->pszVal = NULL; } } //fallback use old UIEX method else { CTimeZone* ptz = GetContactTimeZone(ci->hContact, ci->szProto); if (ptz) { if (ci->dwFlag & CNF_UNICODE) { ci->pszVal = (LPTSTR) mir_t2u(ptz->ptszDisplay); } else { ci->pszVal = (LPTSTR) mir_t2a(ptz->ptszDisplay); } } else { /* If a timezone does not exist in CTzMgr, it is a invalid timezone, because Windows and CTzMgr know all existing timezones and it would not be shown anywhere anyway as UserInfoEx displays only known windows timezones in the details dialog! */ ci->pszVal = NULL; } } ci->type = (ci->pszVal != NULL) ? CNFT_ASCIIZ : 0; result = ci->type == 0; } break; // // information about IM specific stuff // case CNF_UNIQUEID: { // protocol must define a PFLAG_UNIQUEIDSETTING result = CallProtoService(ci->szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0); if (result != CALLSERVICE_NOTFOUND && result != NULL) { result = GCIVar(ci, (LPCSTR) result); } } break; case CNF_DISPLAYUID: { if (!GCIVar(ci, "display_uid")) result=0; else { result = CallProtoService(ci->szProto,PS_GETCAPS,PFLAG_UNIQUEIDSETTING,0); if (result != CALLSERVICE_NOTFOUND && result != NULL) { result = GCIVar(ci, (LPCSTR) result); } } } break; case CNF_DISPLAYNC: case CNF_DISPLAY: { INT i; for (i = 0; i < NAMEORDERCOUNT; i++) { switch (gNameOrder[i]) { case 0: // custom name { // make sure we aren't in CNF_DISPLAYNC mode // don't get custom name for NULL contact if (ci->hContact != NULL && (ci->dwFlag & 0x7F) == CNF_DISPLAY) { BYTE dwFlag = ci->dwFlag; ci->dwFlag = (ci->dwFlag & CNF_UNICODE) | CNF_CUSTOMNICK; if (!GetContactInfo(NULL, (LPARAM)ci)) { ci->dwFlag = dwFlag; return 0; } ci->dwFlag = dwFlag; } } break; case 1: // nick { if (!GCIVarEx(ci, SET_CONTACT_NICK)) return 0; } break; case 2: // First Name { if (!GCIVarEx(ci, SET_CONTACT_FIRSTNAME)) return 0; } break; case 3: // E-mail { if (!GCIVarEx(ci, SET_CONTACT_EMAIL)) return 0; } break; case 4: // Last Name { if (!GCIVarEx(ci, SET_CONTACT_LASTNAME)) return 0; } break; case 5: // Unique id { // protocol must define a PFLAG_UNIQUEIDSETTING result = CallProtoService(ci->szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0); if (result != CALLSERVICE_NOTFOUND && result != NULL) { if (!GCIStr(ci, (LPCSTR) result)) return 0; } } break; case 6: // first + last name { if (!GCIFirstLast(ci)) return 0; } break; default: // unknown contact { if (ci->dwFlag & CNF_UNICODE) { ci->pszVal = (LPTSTR) mir_wcsdup(TranslateW(L"'(Unknown Contact)'")); } else { ci->pszVal = (LPTSTR) mir_strdup(Translate("'(Unknown Contact)'")); } ci->type = (ci->pszVal != NULL) ? CNFT_ASCIIZ : 0; return ci->type == 0; } } } } default: { result = 1; } } } else { result = 1; } return result; }
INT_PTR CALLBACK DlgProcPopupActions(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static bool windowInitialized = false; static UINT controls[] = { IDC_GRP_CUSTOMACTIONS, IDC_TXT_CUSTOMACTIONS, IDC_CHK_IMCONTACTSONLY, IDC_CHK_CONTACTSONLY, IDC_CHK_DONTCLOSE, IDC_GRP_SIZEPOSITION, IDC_CHK_LARGEICONS, IDC_TXT_POSITION, IDC_RD_TEXT, IDC_RD_LEFTICONS, IDC_RD_RIGHTICONS, IDC_GRP_ACTIONS, IDC_ACTIONS, IDC_GRP_SIZEPOSITION2, IDC_TXT_POSITION2, IDC_CB_LEFT, IDC_TXT_MIDDLE, IDC_CB_MIDDLE, IDC_TXT_RIGHT, IDC_CB_RIGHT }; switch (msg) { case WM_INITDIALOG: { int i; windowInitialized = false; TranslateDialogDefault(hwnd); SendMessage(GetDlgItem(hwnd, IDC_ICO_INFO), STM_SETICON, (WPARAM)IcoLib_GetIcon(ICO_MISC_NOTIFY,0), 0); CheckDlgButton(hwnd, IDC_CHK_ENABLEACTIONS, PopUpOptions.actions&ACT_ENABLE ? TRUE : FALSE); CheckDlgButton(hwnd, IDC_CHK_IMCONTACTSONLY, PopUpOptions.actions&ACT_DEF_IMONLY ? TRUE : FALSE); CheckDlgButton(hwnd, IDC_CHK_CONTACTSONLY, PopUpOptions.actions&ACT_DEF_NOGLOBAL ? TRUE : FALSE); CheckDlgButton(hwnd, IDC_CHK_DONTCLOSE, PopUpOptions.actions&ACT_DEF_KEEPWND ? TRUE : FALSE); CheckDlgButton(hwnd, IDC_CHK_LARGEICONS, PopUpOptions.actions&ACT_LARGE ? TRUE : FALSE); CheckDlgButton(hwnd, IDC_RD_TEXT, PopUpOptions.actions&ACT_TEXT ? TRUE : FALSE); CheckDlgButton(hwnd, IDC_RD_LEFTICONS, PopUpOptions.actions&ACT_LEFTICONS ? TRUE : FALSE); CheckDlgButton(hwnd, IDC_RD_RIGHTICONS, PopUpOptions.actions&ACT_RIGHTICONS ? TRUE : FALSE); { DWORD dwActiveItem = 0; HWND hCombo = GetDlgItem(hwnd, IDC_CB_LEFT); dwActiveItem = MouseOverride(hCombo, PopUpOptions.overrideLeft); SendDlgItemMessage(hwnd, IDC_CB_LEFT, CB_SETCURSEL, dwActiveItem, 0); dwActiveItem = 0; hCombo = GetDlgItem(hwnd, IDC_CB_MIDDLE); dwActiveItem = MouseOverride(hCombo, PopUpOptions.overrideMiddle); SendDlgItemMessage(hwnd, IDC_CB_MIDDLE, CB_SETCURSEL, dwActiveItem, 0); dwActiveItem = 0; hCombo = GetDlgItem(hwnd, IDC_CB_RIGHT); dwActiveItem = MouseOverride(hCombo, PopUpOptions.overrideRight); SendDlgItemMessage(hwnd, IDC_CB_RIGHT, CB_SETCURSEL, dwActiveItem, 0); } HWND hwndList = GetDlgItem(hwnd, IDC_ACTIONS); ListView_SetExtendedListViewStyleEx(hwndList, 0, LVS_EX_CHECKBOXES|LVS_EX_LABELTIP); HIMAGELIST hImgList = ImageList_Create(16, 16, ILC_MASK | (IsWinVerXPPlus()? ILC_COLOR32 : ILC_COLOR16), 10, 1); ListView_SetImageList(hwndList, hImgList, LVSIL_SMALL); LVCOLUMN column = {0}; column.mask = LVCF_TEXT|LVCF_WIDTH; column.pszText = TranslateT("Action"); column.cx = 175; ListView_InsertColumn(hwndList, 0, &column); if (IsWinVerXPPlus()) ListView_EnableGroupView(hwndList, TRUE); LIST<char> groups(1, strcmp); for (i = 0; i < gActions.getCount(); ++i) { char szGroup[64]; char *szName = strchr(gActions[i]->lpzTitle, '/'); if (!szName) szName = gActions[i]->lpzTitle; else ++szName; lstrcpynA(szGroup, gActions[i]->lpzTitle, szName - gActions[i]->lpzTitle); int grpId = 0; if (IsWinVerXPPlus() && ((grpId = groups.getIndex(szGroup)) < 0)) { LVGROUP group = {0}; group.cbSize = sizeof(group); group.mask = LVGF_HEADER|LVGF_GROUPID; LPWSTR wszGroup = mir_a2u(szGroup); group.pszHeader = TranslateW(wszGroup); group.cchHeader = lstrlenW(wszGroup); grpId = group.iGroupId = groups.getCount(); int grpId = ListView_InsertGroup(hwndList, -1, &group); mir_free(wszGroup); groups.insert(mir_strdup(szGroup), groups.getCount()); } if (g_popup.isOsUnicode) { LVITEMW item = {0}; item.mask = LVIF_IMAGE|LVIF_PARAM|LVIF_TEXT|LVIF_STATE|LVIF_INDENT; item.iItem = i; LPWSTR wszName = mir_a2u(szName); item.pszText = TranslateW(wszName); item.iImage = ImageList_AddIcon(hImgList, gActions[i]->lchIcon); item.lParam = i; if (IsWinVerXPPlus()) { item.mask |= LVIF_GROUPID; item.iGroupId = grpId; } item.iIndent = 0; ListView_InsertItemW(hwndList, &item); mir_free(wszName); } else { LVITEMA item = {0}; item.mask = LVIF_IMAGE|LVIF_PARAM|LVIF_TEXT|LVIF_STATE|LVIF_GROUPID|LVIF_INDENT; item.iItem = i; item.pszText = Translate(szName); item.iImage = ImageList_AddIcon(hImgList, gActions[i]->lchIcon); item.lParam = i; item.iGroupId = grpId; item.iIndent = 0; ListView_InsertItem(hwndList, &item); } ListView_SetItemState(hwndList, i, (gActions[i]->flags & PAF_ENABLED) ? 0x2000 : 0x1000, LVIS_STATEIMAGEMASK); } groups.destroy(); BOOL enabled = (PopUpOptions.actions&ACT_ENABLE) ? TRUE : FALSE; for (i = 0; i < SIZEOF(controls); ++i) EnableWindow(GetDlgItem(hwnd, controls[i]), enabled); windowInitialized = true; break; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDC_CHK_ENABLEACTIONS: { PopUpOptions.actions &= ~ACT_ENABLE; PopUpOptions.actions |= IsDlgButtonChecked(hwnd, IDC_CHK_ENABLEACTIONS) ? ACT_ENABLE : 0; SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); BOOL enabled = (PopUpOptions.actions&ACT_ENABLE) ? TRUE : FALSE; for (int i = 0; i < SIZEOF(controls); ++i) EnableWindow(GetDlgItem(hwnd, controls[i]), enabled); break; } case IDC_CHK_IMCONTACTSONLY: PopUpOptions.actions &= ~ACT_DEF_IMONLY; PopUpOptions.actions |= IsDlgButtonChecked(hwnd, IDC_CHK_IMCONTACTSONLY) ? ACT_DEF_IMONLY : 0; SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); break; case IDC_CHK_CONTACTSONLY: PopUpOptions.actions &= ~ACT_DEF_NOGLOBAL; PopUpOptions.actions |= IsDlgButtonChecked(hwnd, IDC_CHK_CONTACTSONLY) ? ACT_DEF_NOGLOBAL : 0; SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); break; case IDC_CHK_DONTCLOSE: PopUpOptions.actions &= ~ACT_DEF_KEEPWND; PopUpOptions.actions |= IsDlgButtonChecked(hwnd, IDC_CHK_DONTCLOSE) ? ACT_DEF_KEEPWND : 0; SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); break; case IDC_CHK_LARGEICONS: PopUpOptions.actions &= ~ACT_LARGE; PopUpOptions.actions |= IsDlgButtonChecked(hwnd, IDC_CHK_LARGEICONS) ? ACT_LARGE : 0; SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); break; case IDC_RD_TEXT: PopUpOptions.actions &= ~(ACT_TEXT|ACT_LEFTICONS|ACT_RIGHTICONS); PopUpOptions.actions |= IsDlgButtonChecked(hwnd, IDC_CHK_ENABLEACTIONS) ? ACT_TEXT : 0; SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); break; case IDC_RD_LEFTICONS: PopUpOptions.actions &= ~(ACT_TEXT|ACT_LEFTICONS|ACT_RIGHTICONS); PopUpOptions.actions |= IsDlgButtonChecked(hwnd, IDC_RD_LEFTICONS) ? ACT_LEFTICONS : 0; SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); break; case IDC_RD_RIGHTICONS: PopUpOptions.actions &= ~(ACT_TEXT|ACT_LEFTICONS|ACT_RIGHTICONS); PopUpOptions.actions |= IsDlgButtonChecked(hwnd, IDC_RD_RIGHTICONS) ? ACT_RIGHTICONS : 0; SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); break; case IDC_PREVIEW: PopUpPreview(); break; case IDC_CB_LEFT: case IDC_CB_MIDDLE: case IDC_CB_RIGHT: PopUpOptions.overrideLeft = SendDlgItemMessage(hwnd, IDC_CB_LEFT, CB_GETITEMDATA, SendDlgItemMessage(hwnd, IDC_CB_LEFT, CB_GETCURSEL,0,0),0); PopUpOptions.overrideMiddle = SendDlgItemMessage(hwnd, IDC_CB_MIDDLE, CB_GETITEMDATA, SendDlgItemMessage(hwnd, IDC_CB_MIDDLE, CB_GETCURSEL,0,0),0); PopUpOptions.overrideRight = SendDlgItemMessage(hwnd, IDC_CB_RIGHT, CB_GETITEMDATA, SendDlgItemMessage(hwnd, IDC_CB_RIGHT, CB_GETCURSEL,0,0),0); SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); break; } break; } case WM_NOTIFY: { switch (((LPNMHDR)lParam)->idFrom) { case 0: { switch (((LPNMHDR)lParam)->code) { case PSN_RESET: LoadOption_Actions(); break; case PSN_APPLY: { DBWriteContactSettingDword(NULL, MODULNAME, "Actions", PopUpOptions.actions); HWND hwndList = GetDlgItem(hwnd, IDC_ACTIONS); for (int i = 0; i < gActions.getCount(); ++i) { gActions[i]->flags = (ListView_GetItemState(hwndList, i, LVIS_STATEIMAGEMASK) == 0x2000) ? PAF_ENABLED : 0; DBWriteContactSettingByte(NULL, "PopUpActions", gActions[i]->lpzTitle, (gActions[i]->flags&PAF_ENABLED) ? 1 : 0); } //overrideActions DBWriteContactSettingDword(NULL, MODULNAME, "OverrideLeft", PopUpOptions.overrideLeft); DBWriteContactSettingDword(NULL, MODULNAME, "OverrideMiddle", PopUpOptions.overrideMiddle); DBWriteContactSettingDword(NULL, MODULNAME, "OverrideRight", PopUpOptions.overrideRight); break; } } break; } case IDC_ACTIONS: { NMLISTVIEW *nmlv = (NMLISTVIEW *)lParam; if (windowInitialized && nmlv && nmlv->hdr.code == LVN_ITEMCHANGED && nmlv->uOldState != 0 && (nmlv->uNewState == 0x1000 || nmlv->uNewState == 0x2000)) { SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); } break; } } break; } } return FALSE; }
/** 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); char *proto, *field, buff[256]; int i; LVITEM LvItem; DBVARIANT dbv; LVITEMW LvItemW; // for unicode nicks SendMessage(hList,LVM_DELETEALLITEMS,0,0); ZeroMemory(&LvItem, sizeof(LvItem)); LvItem.mask=LVIF_TEXT; // Text Style LvItem.cchTextMax = 256; // Max size of test ZeroMemory(&LvItemW, sizeof(LvItemW)); LvItemW.mask=LVIF_TEXT; // Text Style LvItemW.cchTextMax = 256; // Max size of test for(i = 0; i < chg->num_contacts; i++) { LvItem.iItem = i; LvItemW.iItem = i; { char *szCDN = (char *) CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)chg->hContact[i], 0); if(os_unicode_enabled) { wchar_t *swzCDN = (wchar_t *) CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)chg->hContact[i], GCDNF_UNICODE), *swzContactDisplayName; LvItemW.iSubItem = 0; // clist display name // detect if the clist provided unicode display name by comparing with non-unicode if(szCDN && swzCDN && strncmp(szCDN, (char *)swzCDN, strlen(szCDN)) != 0 && wcslen(swzCDN) >= strlen(szCDN)) { swzContactDisplayName = swzCDN; } else { // no? convert to unicode if(szCDN) { swzContactDisplayName = (wchar_t *) _malloca(sizeof(wchar_t) * (strlen(szCDN) + 1)); MultiByteToWideChar(CP_ACP, 0, (char *) szCDN, -1, swzContactDisplayName, (int)strlen((char *)szCDN) + 1); } else { swzContactDisplayName = TranslateW(L"(Unknown Contact)"); } } LvItemW.pszText = swzContactDisplayName; SendMessageW(hList, LVM_INSERTITEMW, (WPARAM)0, (LPARAM)&LvItemW); } else { LvItem.iSubItem = 0; // clist display name LvItem.pszText = szCDN; SendMessage(hList, LVM_INSERTITEM, (WPARAM)0, (LPARAM)&LvItem); } } LvItem.iSubItem = 1; // id proto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)chg->hContact[i], 0); if(proto) { field = (char *)CallProtoService(proto,PS_GETCAPS,PFLAG_UNIQUEIDSETTING,0); DBGetContactSetting(chg->hContact[i],proto,field,&dbv); switch(dbv.type) { case DBVT_ASCIIZ: sprintf(buff,"%s",dbv.pszVal); break; case DBVT_BYTE: sprintf(buff,"%d",dbv.bVal); break; case DBVT_WORD: sprintf(buff,"%d",dbv.wVal); break; case DBVT_DWORD: sprintf(buff,"%d",(int)dbv.dVal); break; default: //sprintf(buff,""); buff[0] = 0; } DBFreeVariant(&dbv); LvItem.pszText = buff; SendMessage(hList,LVM_SETITEM,0,(LPARAM)&LvItem); // Enter text to SubItems LvItem.iSubItem = 2; // protocol LvItem.pszText = proto; SendMessage(hList,LVM_SETITEM,0,(LPARAM)&LvItem); // Enter text to SubItems } else { LvItem.pszText = "Unknown"; SendMessage(hList,LVM_SETITEM,0,(LPARAM)&LvItem); // Enter text to SubItems LvItem.iSubItem = 2; // protocol LvItem.pszText = "Unknown"; SendMessage(hList,LVM_SETITEM,0,(LPARAM)&LvItem); // Enter text to SubItems } LvItem.iSubItem = 3; // Default (Yes/No) LvItem.pszText = (chg->hContact[i] == chg->hDefaultContact ? Translate("Yes") : Translate("No")); SendMessage(hList,LVM_SETITEM,0,(LPARAM)&LvItem); // Enter text to SubItems LvItem.iSubItem = 4; // Offline (Yes/No) LvItem.pszText = (chg->hContact[i] == chg->hOfflineContact ? Translate("Yes") : Translate("No")); SendMessage(hList,LVM_SETITEM,0,(LPARAM)&LvItem); // Enter text to SubItems } }
INT_PTR CALLBACK Meta_EditDialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hwnd; char *str; int sel, i; switch(msg) { case WM_INITDIALOG: { // Font necessary for all controls created with CreateWindowsEx //HFONT hfDefault = GetStockObject(DEFAULT_GUI_FONT); //HWND combo = GetDlgItem(hwndDlg,IDC_DEFAULT); int nb_contacts, default_contact_number, offline_contact_number; LVCOLUMN LvCol; TranslateDialogDefault( hwndDlg ); SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadIconEx(I_EDIT)); // Disable the 'Apply' button. EnableWindow(GetDlgItem(hwndDlg,IDC_VALIDATE),FALSE); // (from http://www.codeproject.com/listctrl/listview.asp) // initialize list hwnd = GetDlgItem(hwndDlg, IDC_LST_CONTACTS); SendMessage(hwnd,LVM_SETEXTENDEDLISTVIEWSTYLE, 0,LVS_EX_FULLROWSELECT); // Set style // Create list columns ZeroMemory(&LvCol, sizeof(LvCol)); LvCol.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; // Type of mask // Inserting Couloms as much as we want LvCol.pszText=Translate("Contact"); // First Header Text LvCol.cx=100; // width of column SendMessage(hwnd,LVM_INSERTCOLUMN,0,(LPARAM)&LvCol); // Insert/Show the coloum LvCol.pszText=Translate("Id"); // Next coloum LvCol.cx=130; // width of column SendMessage(hwnd,LVM_INSERTCOLUMN,1,(LPARAM)&LvCol); // ... LvCol.pszText=Translate("Protocol"); // LvCol.cx=100; // width of column SendMessage(hwnd,LVM_INSERTCOLUMN,2,(LPARAM)&LvCol); // LvCol.pszText=Translate("Default"); // LvCol.cx=60; // width of column SendMessage(hwnd,LVM_INSERTCOLUMN,3,(LPARAM)&LvCol); // LvCol.pszText=Translate("Send Offline"); // LvCol.cx=85; // width of column SendMessage(hwnd,LVM_INSERTCOLUMN,4,(LPARAM)&LvCol); // // disable buttons until a selection is made in the list hwnd = GetDlgItem(hwndDlg, IDC_BTN_REM); EnableWindow(hwnd, FALSE); hwnd = GetDlgItem(hwndDlg, IDC_BTN_SETDEFAULT); EnableWindow(hwnd, FALSE); hwnd = GetDlgItem(hwndDlg, IDC_BTN_SETOFFLINE); EnableWindow(hwnd, FALSE); hwnd = GetDlgItem(hwndDlg, IDC_BTN_UP); EnableWindow(hwnd, FALSE); hwnd = GetDlgItem(hwndDlg, IDC_BTN_DOWN); EnableWindow(hwnd, FALSE); nb_contacts = DBGetContactSettingDword((HANDLE)lParam, META_PROTO, "NumContacts", 0); default_contact_number = DBGetContactSettingDword((HANDLE)lParam, META_PROTO, "Default", (DWORD)-1); offline_contact_number = DBGetContactSettingDword((HANDLE)lParam, META_PROTO, "OfflineSend", (DWORD)-1); changes.hMeta = (HANDLE)lParam; changes.num_contacts = nb_contacts; changes.num_deleted = 0; changes.hDefaultContact = Meta_GetContactHandle((HANDLE)lParam, default_contact_number); changes.hOfflineContact = Meta_GetContactHandle((HANDLE)lParam, offline_contact_number); for(i = 0; i < nb_contacts; i++) changes.hContact[i] = Meta_GetContactHandle((HANDLE)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: { char *szCDN = (char *) CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)lParam, 0); if(os_unicode_enabled) { wchar_t *swzCDN = (wchar_t *) CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)lParam, GCDNF_UNICODE), *swzContactDisplayName; // detect if the clist provided unicode display name by comparing with non-unicode if(szCDN && swzCDN && strncmp(szCDN, (char *)swzCDN, strlen(szCDN)) != 0 && wcslen(swzCDN) >= strlen(szCDN)) { swzContactDisplayName = swzCDN; } else { // no? convert to unicode if(szCDN) { swzContactDisplayName = (wchar_t *) _malloca(sizeof(wchar_t) * (strlen(szCDN) + 1)); MultiByteToWideChar(CP_ACP, 0, (char *) szCDN, -1, swzContactDisplayName, (int)strlen((char *)szCDN) + 1); } else { swzContactDisplayName = TranslateW(L"(Unknown Contact)"); } } SetWindowTextW(GetDlgItem(hwndDlg,IDC_ED_NAME), swzContactDisplayName); } else { SetWindowText(GetDlgItem(hwndDlg,IDC_ED_NAME), szCDN); } } 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) { hwnd = GetDlgItem(hwndDlg, IDC_LST_CONTACTS); sel=SendMessage(hwnd,LVM_GETNEXTITEM,-1,LVNI_FOCUSED|LVNI_SELECTED); // return item selected // enable buttons hwnd = GetDlgItem(hwndDlg, IDC_BTN_REM); EnableWindow(hwnd, sel!=-1); hwnd = GetDlgItem(hwndDlg, IDC_BTN_SETDEFAULT); EnableWindow(hwnd, sel!=-1 && changes.hContact[sel] != changes.hDefaultContact); hwnd = GetDlgItem(hwndDlg, IDC_BTN_SETOFFLINE); EnableWindow(hwnd, sel!=-1 && changes.hContact[sel] != changes.hOfflineContact); hwnd = GetDlgItem(hwndDlg, IDC_BTN_UP); EnableWindow(hwnd, (sel > 0)); hwnd = GetDlgItem(hwndDlg, IDC_BTN_DOWN); EnableWindow(hwnd, (sel != -1) && (sel < changes.num_contacts - 1)); /* // custom draw stuff - change colour of listview things - doesn't affect selection :( } else if(((LPNMHDR)lParam)->code == NM_CUSTOMDRAW) { SetWindowLong(hwndDlg, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam)); return TRUE; */ } break; } 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(MessageBox(hwndDlg,Translate("You are going to remove all the contacts associated with this MetaContact.\nThis will delete the MetaContact.\n\nProceed Anyway?"), Translate("Delete MetaContact?"),MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON1)!=IDYES) return TRUE; else { Meta_Delete((WPARAM)changes.hMeta,(LPARAM)NULL); 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 button 'Apply' has been clicked. if(MessageBox(hwndDlg,Translate("You are going to remove all the contacts associated with this MetaContact.\nThis will delete the MetaContact.\n\nProceed Anyway?"), Translate("Delete MetaContact?"),MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON1)!=IDYES) { return TRUE; } else { Meta_Delete((WPARAM)changes.hMeta,(LPARAM)NULL); 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=SendMessage(hwnd,LVM_GETNEXTITEM,-1,LVNI_FOCUSED|LVNI_SELECTED); // return item 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); // Disable set default button EnableWindow(GetDlgItem(hwndDlg,IDC_BTN_SETDEFAULT),FALSE); // Enable the 'Apply' button. EnableWindow(GetDlgItem(hwndDlg,IDC_VALIDATE),TRUE); // repaint list return TRUE; case IDC_BTN_SETOFFLINE: hwnd = GetDlgItem(hwndDlg, IDC_LST_CONTACTS); sel=SendMessage(hwnd,LVM_GETNEXTITEM,-1,LVNI_FOCUSED|LVNI_SELECTED); // return item selected InvalidateRect(hwnd, 0, TRUE); changes.hOfflineContact = changes.hContact[sel]; FillContactList(hwndDlg, &changes); SetListSelection(hwnd, sel); // Disable set offline button EnableWindow(GetDlgItem(hwndDlg,IDC_BTN_SETOFFLINE),FALSE); // Enable the 'Apply' button. EnableWindow(GetDlgItem(hwndDlg,IDC_VALIDATE),TRUE); // repaint list return TRUE; case IDC_BTN_REM: hwnd = GetDlgItem(hwndDlg, IDC_LST_CONTACTS); sel=SendMessage(hwnd,LVM_GETNEXTITEM,-1,LVNI_FOCUSED|LVNI_SELECTED); // return item 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]; str = (char *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)changes.hDefaultContact, 0); SetWindowText(GetDlgItem(hwndDlg,IDC_ED_DEFAULT),str); } else { changes.hDefaultContact = 0; SetWindowText(GetDlgItem(hwndDlg,IDC_ED_DEFAULT),"None"); } } for(i = sel; i < changes.num_contacts; i++) changes.hContact[i] = changes.hContact[i + 1]; FillContactList(hwndDlg, &changes); // disable buttons hwnd = GetDlgItem(hwndDlg, IDC_BTN_REM); EnableWindow(hwnd, FALSE); hwnd = GetDlgItem(hwndDlg, IDC_BTN_SETDEFAULT); EnableWindow(hwnd, FALSE); hwnd = GetDlgItem(hwndDlg, IDC_BTN_SETOFFLINE); EnableWindow(hwnd, FALSE); hwnd = GetDlgItem(hwndDlg, IDC_BTN_UP); EnableWindow(hwnd, FALSE); hwnd = GetDlgItem(hwndDlg, IDC_BTN_DOWN); EnableWindow(hwnd, FALSE); // Enable the 'Apply' button. EnableWindow(GetDlgItem(hwndDlg,IDC_VALIDATE),TRUE); return TRUE; case IDC_BTN_UP: hwnd = GetDlgItem(hwndDlg, IDC_LST_CONTACTS); sel=SendMessage(hwnd,LVM_GETNEXTITEM,-1,LVNI_FOCUSED|LVNI_SELECTED); // return item selected { HANDLE temp = changes.hContact[sel]; changes.hContact[sel] = changes.hContact[sel - 1]; changes.hContact[sel - 1] = temp; } FillContactList(hwndDlg, &changes); sel--; SetListSelection(hwnd, sel); hwnd = GetDlgItem(hwndDlg, IDC_BTN_UP); EnableWindow(hwnd, (sel > 0)); hwnd = GetDlgItem(hwndDlg, IDC_BTN_DOWN); EnableWindow(hwnd, (sel < changes.num_contacts - 1)); // Enable the 'Apply' button. EnableWindow(GetDlgItem(hwndDlg,IDC_VALIDATE),TRUE); return TRUE; case IDC_BTN_DOWN: hwnd = GetDlgItem(hwndDlg, IDC_LST_CONTACTS); sel=SendMessage(hwnd,LVM_GETNEXTITEM,-1,LVNI_FOCUSED|LVNI_SELECTED); // return item selected { HANDLE temp = changes.hContact[sel]; changes.hContact[sel] = changes.hContact[sel + 1]; changes.hContact[sel + 1] = temp; } FillContactList(hwndDlg, &changes); sel++; SetListSelection(hwnd, sel); hwnd = GetDlgItem(hwndDlg, IDC_BTN_UP); EnableWindow(hwnd, (sel > 0)); hwnd = GetDlgItem(hwndDlg, IDC_BTN_DOWN); EnableWindow(hwnd, (sel < changes.num_contacts - 1)); // Enable the 'Apply' button. EnableWindow(GetDlgItem(hwndDlg,IDC_VALIDATE),TRUE); return TRUE; case IDC_CHK_FORCEDEFAULT: changes.force_default = IsDlgButtonChecked(hwndDlg, IDC_CHK_FORCEDEFAULT); // Enable the 'Apply' button. EnableWindow(GetDlgItem(hwndDlg,IDC_VALIDATE),TRUE); return TRUE; } } break; case WM_CLOSE: DestroyWindow(hwndDlg); return TRUE; case WM_DESTROY: ReleaseIconEx((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, 0)); EndDialog(hwndDlg, IDCANCEL); break; } return FALSE; }
static LRESULT CALLBACK MButtonWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { MButtonCtrl* bct = (MButtonCtrl *)GetWindowLongPtr(hwndDlg, 0); switch(msg) { case WM_NCCREATE: SetWindowLongPtr(hwndDlg, GWL_STYLE, GetWindowLongPtr(hwndDlg, GWL_STYLE) | BS_OWNERDRAW); bct = ( MButtonCtrl* )mir_calloc(sizeof(MButtonCtrl)); if (bct==NULL) return FALSE; bct->hwnd = hwndDlg; bct->stateId = PBS_NORMAL; bct->hFont = ( HFONT )GetStockObject(DEFAULT_GUI_FONT); LoadTheme(bct); if (SUCCEEDED(CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER, IID_IAccPropServices, (void**)&bct->pAccPropServices))) { // Annotating the Role of this object to be PushButton SetHwndPropInt(bct, OBJID_CLIENT, CHILDID_SELF, PROPID_ACC_ROLE, ROLE_SYSTEM_PUSHBUTTON); } else bct->pAccPropServices = NULL; SetWindowLongPtr(hwndDlg, 0, (LONG_PTR)bct); if (((CREATESTRUCT *)lParam)->lpszName) SetWindowText(hwndDlg, ((CREATESTRUCT *)lParam)->lpszName); return TRUE; case WM_DESTROY: if (bct) { if (bct->pAccPropServices) { bct->pAccPropServices->Release(); bct->pAccPropServices = NULL; } if (bct->hwndToolTips) { TOOLINFO ti = {0}; ti.cbSize = sizeof(ti); ti.uFlags = TTF_IDISHWND; ti.hwnd = bct->hwnd; ti.uId = (UINT_PTR)bct->hwnd; if (SendMessage(bct->hwndToolTips, TTM_GETTOOLINFO, 0, (LPARAM)&ti)) { SendMessage(bct->hwndToolTips, TTM_DELTOOL, 0, (LPARAM)&ti); } if ( SendMessage(bct->hwndToolTips, TTM_GETTOOLCOUNT, 0, (LPARAM)&ti) == 0 ) { int idx; TTooltips tt; tt.ThreadId = GetCurrentThreadId(); EnterCriticalSection(&csTips); if ( List_GetIndex( &lToolTips, &tt, &idx ) ) { mir_free( lToolTips.items[idx] ); List_Remove( &lToolTips, idx ); DestroyWindow( bct->hwndToolTips ); } LeaveCriticalSection(&csTips); bct->hwndToolTips = NULL; } } if (bct->arrow) IconLib_ReleaseIcon(bct->arrow, 0); DestroyTheme(bct); } break; // DONT! fall thru case WM_NCDESTROY: mir_free(bct); break; case WM_SETTEXT: bct->cHot = 0; if ( lParam != 0 ) { TCHAR *tmp = ( TCHAR* )lParam; while (*tmp) { if (*tmp=='&' && *(tmp+1)) { bct->cHot = _tolower(*(tmp+1)); break; } tmp++; } InvalidateRect(bct->hwnd, NULL, TRUE); } break; case WM_KEYUP: if (bct->stateId!=PBS_DISABLED && wParam == VK_SPACE) { if (bct->pushBtn) { if (bct->pbState) { bct->pbState = 0; bct->stateId = PBS_NORMAL; } else { bct->pbState = 1; bct->stateId = PBS_PRESSED; } InvalidateRect(bct->hwnd, NULL, TRUE); } SendMessage(GetParent(hwndDlg), WM_COMMAND, MAKELONG(GetDlgCtrlID(hwndDlg), BN_CLICKED), (LPARAM)hwndDlg); return 0; } break; case WM_SYSKEYUP: if (bct->stateId!=PBS_DISABLED && bct->cHot && bct->cHot == tolower((int)wParam)) { if (bct->pushBtn) { if (bct->pbState) { bct->pbState = 0; bct->stateId = PBS_NORMAL; } else { bct->pbState = 1; bct->stateId = PBS_PRESSED; } InvalidateRect(bct->hwnd, NULL, TRUE); } SendMessage(GetParent(hwndDlg), WM_COMMAND, MAKELONG(GetDlgCtrlID(hwndDlg), BN_CLICKED), (LPARAM)hwndDlg); return 0; } break; case WM_THEMECHANGED: // themed changed, reload theme object LoadTheme(bct); InvalidateRect(bct->hwnd, NULL, TRUE); // repaint it break; case WM_SETFONT: // remember the font so we can use it later bct->hFont = (HFONT)wParam; // maybe we should redraw? break; case WM_NCPAINT: case WM_PAINT: { PAINTSTRUCT ps; HDC hdcPaint; hdcPaint = BeginPaint(hwndDlg, &ps); if (hdcPaint) { PaintWorker(bct, hdcPaint); EndPaint(hwndDlg, &ps); } break; } case BM_SETIMAGE: { HGDIOBJ hnd = NULL; if (bct->hIcon) hnd = bct->hIcon; else if (bct->hBitmap) hnd = bct->hBitmap; if (wParam == IMAGE_ICON) { bct->hIcon = (HICON)lParam; bct->hBitmap = NULL; InvalidateRect(bct->hwnd, NULL, TRUE); } else if (wParam == IMAGE_BITMAP) { bct->hBitmap = (HBITMAP)lParam; bct->hIcon = NULL; InvalidateRect(bct->hwnd, NULL, TRUE); } return (LRESULT)hnd; } case BM_GETIMAGE: if (bct->hIcon) return (LRESULT)bct->hIcon; else if (bct->hBitmap) return (LRESULT)bct->hBitmap; else return 0; case BM_SETCHECK: if (!bct->pushBtn) break; if (wParam == BST_CHECKED) { bct->pbState = 1; bct->stateId = PBS_PRESSED; } else if (wParam == BST_UNCHECKED) { bct->pbState = 0; bct->stateId = PBS_NORMAL; } InvalidateRect(bct->hwnd, NULL, TRUE); break; case BM_GETCHECK: if (bct->pushBtn) { return bct->pbState?BST_CHECKED:BST_UNCHECKED; } return 0; case BUTTONSETARROW: // turn arrow on/off if (wParam) { if (!bct->arrow) { bct->arrow = LoadSkinIcon(SKINICON_OTHER_DOWNARROW); SetHwndPropInt(bct, OBJID_CLIENT, CHILDID_SELF, PROPID_ACC_ROLE, ROLE_SYSTEM_BUTTONDROPDOWN); } } else { if (bct->arrow) { IconLib_ReleaseIcon(bct->arrow, 0); bct->arrow = NULL; SetHwndPropInt(bct, OBJID_CLIENT, CHILDID_SELF, PROPID_ACC_ROLE, ROLE_SYSTEM_PUSHBUTTON); } } InvalidateRect(bct->hwnd, NULL, TRUE); break; case BUTTONSETDEFAULT: bct->defbutton = wParam?1:0; InvalidateRect(bct->hwnd, NULL, TRUE); break; case BUTTONSETASPUSHBTN: bct->pushBtn = 1; InvalidateRect(bct->hwnd, NULL, TRUE); break; case BUTTONSETASFLATBTN: bct->flatBtn = 1; InvalidateRect(bct->hwnd, NULL, TRUE); break; case BUTTONADDTOOLTIP: if ( wParam ) { TOOLINFO ti = {0}; if ( !bct->hwndToolTips ) { int idx; TTooltips tt; tt.ThreadId = GetCurrentThreadId(); EnterCriticalSection(&csTips); if ( List_GetIndex( &lToolTips, &tt, &idx )) { bct->hwndToolTips = ((TTooltips*)lToolTips.items[idx])->hwnd; } else { TTooltips *ptt = ( TTooltips* )mir_alloc( sizeof(TTooltips) ); ptt->ThreadId = tt.ThreadId; ptt->hwnd = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, _T(""), TTS_ALWAYSTIP, 0, 0, 0, 0, NULL, NULL, hMirandaInst, NULL); List_Insert( &lToolTips, ptt, idx ); bct->hwndToolTips = ptt->hwnd; } LeaveCriticalSection(&csTips); } ti.cbSize = sizeof(ti); ti.uFlags = TTF_IDISHWND; ti.hwnd = bct->hwnd; ti.uId = (UINT_PTR)bct->hwnd; if (SendMessage(bct->hwndToolTips, TTM_GETTOOLINFO, 0, (LPARAM)&ti)) SendMessage(bct->hwndToolTips, TTM_DELTOOL, 0, (LPARAM)&ti); ti.uFlags = TTF_IDISHWND|TTF_SUBCLASS; ti.uId = (UINT_PTR)bct->hwnd; #if defined( _UNICODE ) if ( lParam & BATF_UNICODE ) ti.lpszText = mir_wstrdup( TranslateW(( WCHAR* )wParam )); else ti.lpszText = LangPackPcharToTchar(( char* )wParam ); #else ti.lpszText = Translate(( char* )wParam ); #endif if (bct->pAccPropServices) { wchar_t *tmpstr = mir_t2u(ti.lpszText); bct->pAccPropServices->SetHwndPropStr(bct->hwnd, OBJID_CLIENT, CHILDID_SELF, PROPID_ACC_DESCRIPTION, tmpstr); mir_free(tmpstr); } SendMessage( bct->hwndToolTips, TTM_ADDTOOL, 0, (LPARAM)&ti); #if defined( _UNICODE ) mir_free( ti.lpszText ); #endif } break; case WM_SETFOCUS: // set keybord focus and redraw bct->focus = 1; InvalidateRect(bct->hwnd, NULL, TRUE); break; case WM_KILLFOCUS: // kill focus and redraw bct->focus = 0; InvalidateRect(bct->hwnd, NULL, TRUE); break; case WM_WINDOWPOSCHANGED: InvalidateRect(bct->hwnd, NULL, TRUE); break; case WM_ENABLE: // windows tells us to enable/disable bct->stateId = wParam?PBS_NORMAL:PBS_DISABLED; InvalidateRect(bct->hwnd, NULL, TRUE); break; case WM_MOUSELEAVE: // faked by the WM_TIMER if (bct->stateId!=PBS_DISABLED) { // don't change states if disabled bct->stateId = PBS_NORMAL; InvalidateRect(bct->hwnd, NULL, TRUE); } break; case WM_LBUTTONDOWN: if (bct->stateId!=PBS_DISABLED) { // don't change states if disabled bct->stateId = PBS_PRESSED; InvalidateRect(bct->hwnd, NULL, TRUE); } break; case WM_LBUTTONUP: { int showClick = 0; if (bct->pushBtn) { if (bct->pbState) bct->pbState = 0; else bct->pbState = 1; } if (bct->stateId!=PBS_DISABLED) { // don't change states if disabled if (bct->stateId==PBS_PRESSED) showClick = 1; if (msg==WM_LBUTTONUP) bct->stateId = PBS_HOT; else bct->stateId = PBS_NORMAL; InvalidateRect(bct->hwnd, NULL, TRUE); } if (showClick) // Tell your daddy you got clicked. SendMessage(GetParent(hwndDlg), WM_COMMAND, MAKELONG(GetDlgCtrlID(hwndDlg), BN_CLICKED), (LPARAM)hwndDlg); break; } case WM_MOUSEMOVE: if (bct->stateId == PBS_NORMAL) { bct->stateId = PBS_HOT; InvalidateRect(bct->hwnd, NULL, TRUE); } // Call timer, used to start cheesy TrackMouseEvent faker SetTimer(hwndDlg,BUTTON_POLLID,BUTTON_POLLDELAY,NULL); break; case WM_TIMER: // use a timer to check if they have did a mouseout if (wParam == BUTTON_POLLID) { RECT rc; POINT pt; GetWindowRect(hwndDlg,&rc); GetCursorPos(&pt); if(!PtInRect(&rc,pt)) { // mouse must be gone, trigger mouse leave PostMessage(hwndDlg,WM_MOUSELEAVE,0,0L); KillTimer(hwndDlg,BUTTON_POLLID); } } break; case WM_ERASEBKGND: return 1; } return DefWindowProc(hwndDlg, msg, wParam, lParam); }
static void FillCBList(HWND hwndDlg, int controlID, LPCTSTR* array) { for (LPCTSTR* current=array; *current; current++) SendDlgItemMessage(hwndDlg,controlID,CB_ADDSTRING,(WPARAM)NULL,(LPARAM)TranslateW(*current)); }