void NonlinearForceDensityNoDeriv::force_value( const FEMesh *mesh, const Element *element, const Equation *eqn, const MasterPosition &point, double time, SmallSystem *eqndata) const { DoubleVec fieldVal(3), force(3); Coord coord; // first compute the current value of the displacement field at the gauss point fieldVal[0] = fieldVal[1] = 0.0; #if DIM==3 fieldVal[2] = 0.0; #endif for(CleverPtr<ElementFuncNodeIterator> node(element->funcnode_iterator()); !node->end(); ++*node) { double shapeFuncVal = node->shapefunction( point ); fieldVal[0] += shapeFuncVal * (*displacement)( *node, 0 )->value( mesh ); fieldVal[1] += shapeFuncVal * (*displacement)( *node, 1 )->value( mesh ); #if DIM==3 fieldVal[2] += shapeFuncVal * (*displacement)( *node, 2 )->value( mesh ); #endif } // now compute the force density value for the current coordinate x,y,z, // time and displacement, // the nonlinear force density function returns the corresponding // force value in the array 'force', coord = element->from_master( point ); #if DIM==2 nonlin_force_density( coord.x, coord.y, 0.0, time, fieldVal, force ); #elif DIM==3 nonlin_force_density( coord.x, coord.y, coord.z, time, fieldVal, force ); #endif eqndata->force_vector_element(0) -= force[0]; eqndata->force_vector_element(1) -= force[1]; #if DIM==3 eqndata->force_vector_element(2) -= force[2]; #endif } // end of 'NonlinearForceDensityNoDeriv::force_value'
void NonlinearForceDensity::force_deriv_matrix(const FEMesh *mesh, const Element *element, const Equation *eqn, const ElementFuncNodeIterator &j, const MasterPosition &point, double time, SmallSystem *eqndata) const { SmallMatrix forceDeriv(3); DoubleVec fieldVal(3); double shapeFuncVal; Coord coord; // first compute the current value of the displacement field at the gauss point fieldVal[0] = fieldVal[1] = 0.0; #if DIM==3 fieldVal[2] = 0.0; #endif for(CleverPtr<ElementFuncNodeIterator> node(element->funcnode_iterator()); !node->end(); ++*node){ shapeFuncVal = node->shapefunction( point ); fieldVal[0] += shapeFuncVal * (*displacement)( *node, 0 )->value( mesh ); fieldVal[1] += shapeFuncVal * (*displacement)( *node, 1 )->value( mesh ); #if DIM==3 fieldVal[2] += shapeFuncVal * (*displacement)( *node, 2 )->value( mesh ); #endif } // now compute the value of the force density derivative function // for the current coordinate x,y,z, time and displacement, // the nonlinear force density derivative function returns the // corresponding force derivative value in the array 'forceDeriv', // the function definition is given in USER_CODE.C coord = element->from_master( point ); #if DIM==2 nonlin_force_density_deriv( coord.x, coord.y, 0.0, time, fieldVal, forceDeriv ); #elif DIM==3 nonlin_force_density_deriv( coord.x, coord.y, coord.z, time, fieldVal, forceDeriv ); #endif // compute the value of the jth shape function at gauss point point and add // its contribution Df(point,field)*phi_j(point) to the small mass-like matrix shapeFuncVal = j.shapefunction( point ); for(IteratorP eqncomp = eqn->iterator(); !eqncomp.end(); ++eqncomp) { int eqno = eqncomp.integer(); for (IteratorP fieldcomp = displacement->iterator(); !fieldcomp.end(); ++fieldcomp) { // TODO: get rid of this loop, and write component contributions explicitly int fieldno = fieldcomp.integer(); eqndata->force_deriv_matrix_element( eqncomp, displacement, fieldcomp, j ) -= forceDeriv( eqno, fieldno ) * shapeFuncVal; } } } // end of 'NonlinearForceDensity::force_deriv_matrix'
static INT_PTR CALLBACK ContactDlgProc(HWND hwndDlg, UINT msg, WPARAM, LPARAM lParam) { const unsigned long iPageId = 5; CJabberProto *ppro = (CJabberProto*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); switch (msg) { case WM_INITDIALOG: if (!lParam) break; // Launched from userinfo ppro = (CJabberProto*)lParam; { LVCOLUMN lvc; RECT rc; SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); TranslateDialogDefault(hwndDlg); GetClientRect(GetDlgItem(hwndDlg, IDC_EMAILS), &rc); rc.right -= GetSystemMetrics(SM_CXVSCROLL); lvc.mask = LVCF_WIDTH; lvc.cx = 30; ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_EMAILS), 0, &lvc); ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_PHONES), 0, &lvc); lvc.cx = rc.right - 30 - 40; ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_EMAILS), 1, &lvc); ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_PHONES), 1, &lvc); lvc.cx = 20; ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_EMAILS), 2, &lvc); ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_EMAILS), 3, &lvc); ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_PHONES), 2, &lvc); ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_PHONES), 3, &lvc); SendMessage(hwndDlg, M_REMAKELISTS, 0, 0); ppro->WindowSubscribe(hwndDlg); } break; case M_REMAKELISTS: { int i; char idstr[33]; TCHAR number[20]; //e-mails ListView_DeleteAllItems(GetDlgItem(hwndDlg, IDC_EMAILS)); LVITEM lvi; lvi.mask = LVIF_TEXT | LVIF_PARAM; lvi.iSubItem = 0; lvi.iItem = 0; for (i=0;;i++) { mir_snprintf(idstr, "e-mail%d", i); ptrT email( ppro->getTStringA(idstr)); if (email == NULL) break; mir_sntprintf(number, _T("%d"), i+1); lvi.pszText = number; lvi.lParam = (LPARAM)i; ListView_InsertItem(GetDlgItem(hwndDlg, IDC_EMAILS), &lvi); ListView_SetItemText(GetDlgItem(hwndDlg, IDC_EMAILS), lvi.iItem, 1, email); lvi.iItem++; } lvi.mask = LVIF_PARAM; lvi.lParam = -1; ListView_InsertItem(GetDlgItem(hwndDlg, IDC_EMAILS), &lvi); //phones ListView_DeleteAllItems(GetDlgItem(hwndDlg, IDC_PHONES)); lvi.mask = LVIF_TEXT | LVIF_PARAM; lvi.iSubItem = 0; lvi.iItem = 0; for (i=0;;i++) { mir_snprintf(idstr, "Phone%d", i); ptrT phone( ppro->getTStringA(idstr)); if (phone == NULL) break; mir_sntprintf(number, _T("%d"), i+1); lvi.pszText = number; lvi.lParam = (LPARAM)i; ListView_InsertItem(GetDlgItem(hwndDlg, IDC_PHONES), &lvi); ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PHONES), lvi.iItem, 1, phone); lvi.iItem++; } lvi.mask = LVIF_PARAM; lvi.lParam = -1; ListView_InsertItem(GetDlgItem(hwndDlg, IDC_PHONES), &lvi); } break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_PARAMCHANGED: SendMessage(hwndDlg, WM_INITDIALOG, 0, ((PSHNOTIFY*)lParam)->lParam); break; case PSN_APPLY: ppro->m_vCardUpdates &= ~(1UL << iPageId); ppro->SaveVcardToDB(hwndDlg, iPageId); if (!ppro->m_vCardUpdates) ppro->SetServerVcard(ppro->m_bPhotoChanged, ppro->m_szPhotoFileName); break; } break; case IDC_EMAILS: case IDC_PHONES: switch (((LPNMHDR)lParam)->code) { case NM_CUSTOMDRAW: { NMLVCUSTOMDRAW *nm = (NMLVCUSTOMDRAW *)lParam; switch (nm->nmcd.dwDrawStage) { case CDDS_PREPAINT: case CDDS_ITEMPREPAINT: SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, CDRF_NOTIFYSUBITEMDRAW); return TRUE; case CDDS_SUBITEM | CDDS_ITEMPREPAINT: RECT rc; HICON hIcon; ListView_GetSubItemRect(nm->nmcd.hdr.hwndFrom, nm->nmcd.dwItemSpec, nm->iSubItem, LVIR_LABEL, &rc); if (nm->nmcd.lItemlParam == -1 && nm->iSubItem == 3) hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_ADDCONTACT), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0); else if (nm->iSubItem == 2 && nm->nmcd.lItemlParam != -1) hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_EDIT), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0); else if (nm->iSubItem == 3 && nm->nmcd.lItemlParam != -1) hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_DELETE), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0); else break; DrawIconEx(nm->nmcd.hdc, (rc.left + rc.right - GetSystemMetrics(SM_CXSMICON)) / 2, (rc.top + rc.bottom - GetSystemMetrics(SM_CYSMICON)) / 2, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL); DestroyIcon(hIcon); SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, CDRF_SKIPDEFAULT); return TRUE; } } break; case NM_CLICK: NMLISTVIEW *nm = (NMLISTVIEW *)lParam; if (nm->iSubItem < 2) break; const char* szIdTemplate = (nm->hdr.idFrom == IDC_PHONES) ? "Phone%d" : "e-mail%d"; const char* szFlagTemplate = (nm->hdr.idFrom == IDC_PHONES) ? "PhoneFlag%d" : "e-mailFlag%d"; LVHITTESTINFO hti; hti.pt.x = (short)LOWORD(GetMessagePos()); hti.pt.y = (short)HIWORD(GetMessagePos()); ScreenToClient(nm->hdr.hwndFrom, &hti.pt); if (ListView_SubItemHitTest(nm->hdr.hwndFrom, &hti) == -1) break; LVITEM lvi; lvi.mask = LVIF_PARAM; lvi.iItem = hti.iItem; lvi.iSubItem = 0; ListView_GetItem(nm->hdr.hwndFrom, &lvi); if (lvi.lParam == -1) { if (hti.iSubItem == 3) { //add EditDlgParam param = { -1, ppro }; int res; if (nm->hdr.idFrom == IDC_PHONES) res = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_VCARD_ADDPHONE), hwndDlg, EditPhoneDlgProc, (LPARAM)¶m); else res = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_VCARD_ADDEMAIL), hwndDlg, EditEmailDlgProc, (LPARAM)¶m); if (res != IDOK) break; SendMessage(hwndDlg, M_REMAKELISTS, 0, 0); ppro->m_vCardUpdates |= (1UL << iPageId); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); } } else { if (hti.iSubItem == 3) { //delete char idstr[33]; int i; for (i = lvi.lParam;; i++) { mir_snprintf(idstr, szIdTemplate, i + 1); ptrA fieldVal(ppro->getStringA(idstr)); if (fieldVal == NULL) break; mir_snprintf(idstr, szIdTemplate, i); ppro->setString(idstr, fieldVal); mir_snprintf(idstr, szFlagTemplate, i + 1); WORD nFlag = ppro->getWord(idstr, 0); mir_snprintf(idstr, szFlagTemplate, i); ppro->setWord(idstr, nFlag); } mir_snprintf(idstr, szIdTemplate, i); ppro->delSetting(idstr); mir_snprintf(idstr, szFlagTemplate, i); ppro->delSetting(idstr); SendMessage(hwndDlg, M_REMAKELISTS, 0, 0); ppro->m_vCardUpdates |= (1UL << iPageId); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); } else if (hti.iSubItem == 2) { EditDlgParam param = { (int)lvi.lParam, ppro }; int res; if (nm->hdr.idFrom == IDC_PHONES) res = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_VCARD_ADDPHONE), hwndDlg, EditPhoneDlgProc, (LPARAM)¶m); else res = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_VCARD_ADDEMAIL), hwndDlg, EditEmailDlgProc, (LPARAM)¶m); if (res != IDOK) break; SendMessage(hwndDlg, M_REMAKELISTS, 0, 0); ppro->m_vCardUpdates |= (1UL << iPageId); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); } } } } break; case WM_SETCURSOR: if (LOWORD(lParam) != HTCLIENT) break; if (GetForegroundWindow() == GetParent(hwndDlg)) { POINT pt; GetCursorPos(&pt); ScreenToClient(hwndDlg, &pt); SetFocus(ChildWindowFromPoint(hwndDlg, pt)); //ugly hack because listviews ignore their first click } break; case WM_DESTROY: ppro->WindowUnsubscribe(hwndDlg); break; } return FALSE; }