Ejemplo n.º 1
0
static int IsOverEmail(HWND hwndDlg,TCHAR* szEmail,int cchEmail)
{
	RECT rc;
	HWND hwndEmails;
	TCHAR szText[256];
	HDC hdc;
	SIZE textSize;
	LVHITTESTINFO hti;

	hwndEmails=GetDlgItem(hwndDlg,IDC_EMAILS);
	GetCursorPos(&hti.pt);
	ScreenToClient(hwndEmails,&hti.pt);
	GetClientRect(hwndEmails,&rc);
	if(!PtInRect(&rc,hti.pt)) return 0;
	if(ListView_SubItemHitTest(hwndEmails,&hti)==-1) return 0;
	if(hti.iSubItem!=1) return 0;
	if(!(hti.flags&LVHT_ONITEMLABEL)) return 0;
	ListView_GetSubItemRect(hwndEmails,hti.iItem,1,LVIR_LABEL,&rc);
	szText[0] = 0;
	ListView_GetItemText(hwndEmails,hti.iItem,1,szText,SIZEOF(szText));
	hdc=GetDC(hwndEmails);
	SelectObject(hdc,hEmailFont);
	GetTextExtentPoint32(hdc,szText,lstrlen(szText),&textSize);
	ReleaseDC(hwndEmails,hdc);
	if(hti.pt.x<rc.left+textSize.cx) {
		if(szEmail && cchEmail) lstrcpyn(szEmail,szText,cchEmail);
		return 1;
	}
	return 0;
}
Ejemplo n.º 2
0
BOOL CReportCtrlEx2::StartEdit(int nItem, int nSubItem)
{
	// Get the grid width and height
	if (!m_bAllowEdit || /*!_IsValidIndex(nItem) ||*/ nSubItem < 0 || nSubItem >= GetColumnCount())
		return FALSE;

	if (m_ptEditting.x == nItem && m_ptEditting.y == nSubItem)
		return TRUE;

	EndItem(TRUE);
		
	m_ptEditting.x = nItem;
	m_ptEditting.y = nSubItem;
	SetAllItemStates(RC_ITEM_SELECTED, RC_ITEM_UNSELECTED); // unselect all
	//SetItemStates(m_ptEditting.x, RC_ITEM_SELECTED | RC_ITEM_FOCUSED);

	// determine editbox font and alignment
	const DWORD FMT = _GetHeaderTextFormat(nSubItem);
	if (FMT != m_dwPrevEditFmt)
	{
		m_dwPrevEditFmt = FMT;

		// Funny thing:
		// Changing CEdit style among ES_LEFT, ES_CENTER, ES_RIGHT at runtime works
		// sometimes and fails other times. It just cannot guarantee to be succeed.
		// So I decided to destroy and recreate the CEdit every time when the text
		// format changes.
		if (m_pWndEdit->GetSafeHwnd() != NULL)
			m_pWndEdit->DestroyWindow();

		if (!m_pWndEdit->Create(ES_AUTOHSCROLL | ES_NOHIDESEL | WS_CHILD | WS_BORDER | FMT, CRect(0, 0, 1, 1), this, 0))
			return FALSE;
	}
	else
	{
		if (m_pWndEdit->GetSafeHwnd() == NULL
			&& !m_pWndEdit->Create(ES_AUTOHSCROLL | ES_NOHIDESEL | WS_CHILD | WS_BORDER | FMT, CRect(0, 0, 1, 1), this, 0))
		{
			return FALSE;
		}
	}

	m_pWndEdit->SetFont(GetFont());

	CRect rcEdit;
	ListView_GetSubItemRect(GetSafeHwnd(), m_ptEditting.x, m_ptEditting.y, LVIR_LABEL, &rcEdit);
	if (m_ptEditting.y > 0 && GetImageList() != NULL && GetItemImage(m_ptEditting.x, m_ptEditting.y) >= 0)
		rcEdit.DeflateRect(16, 0, 0, 0);

	// Move the editbox to that grid, obtain text from the grid, display the
	// editbox, and, finally, highlights all text in the editbox and set the
	// windows focus to the editbox.
	m_pWndEdit->MoveWindow(&rcEdit);
	m_pWndEdit->SetWindowText(GetItemText(m_ptEditting.x, m_ptEditting.y));
	m_pWndEdit->ShowWindow(SW_SHOW);
	m_pWndEdit->SetSel(0, -1);
	m_pWndEdit->SetFocus();

	return TRUE;
}
Ejemplo n.º 3
0
void TableMonthIn::OnNMClickList(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	LPNMITEMACTIVATE temp = (LPNMITEMACTIVATE) pNMHDR;
	//MessageBox("dbclick");
	CString str;
	HWND hWnd1 =  ::GetDlgItem (m_hWnd,TABLE_LIST);
    RECT rect;
    //get the row number

    nItem = temp->iItem;
    //get the column number

    nSubItem = temp->iSubItem;
	if (-1 != nItem && 3 == nSubItem)
	{
		ListView_GetSubItemRect(hWnd1,temp->iItem,temp->iSubItem,LVIR_BOUNDS,&rect);
		RECT rect1,rect2;
		str = GetItemText(hWnd1,nItem ,3);
		::GetWindowRect(temp->hdr.hwndFrom,&rect1);
    //Get the Rectange of the Dialog

	//::GetClientRect(m_hWnd,&rect2);
		::GetWindowRect(m_hWnd,&rect2);
		ScreenToClient(&rect1);
		int x = rect1.left;
		int y = rect1.top;
		combox.ResetContent();
		combox.AddString("全部");
		combox.AddString("现金");
		combox.AddString("银行卡(总)");
		for (int i = 0;i < MAXCARD;i++)
		{
			if ("" != cards[i])
			{
				combox.AddString(cards[i]);
			}
		}
		combox.SelectString(0,str);
		::SetWindowPos(::GetDlgItem(m_hWnd,COMBOX),
        HWND_TOP,rect.left+x+1,rect.top+y+1, 
        rect.right-rect.left+1,
        rect.bottom-rect.top+1,NULL);
		::ShowWindow(::GetDlgItem(m_hWnd,COMBOX),SW_SHOW);
		::SetFocus(::GetDlgItem(m_hWnd,COMBOX));

	}
	*pResult = 0;
}
Ejemplo n.º 4
0
BOOL Dlg_MemBookmark::EditLabel ( int nItem, int nSubItem )
{
	HWND hList = GetDlgItem( g_MemBookmarkDialog.GetHWND(), IDC_RA_LBX_ADDRESSES );
	RECT rcSubItem;
	ListView_GetSubItemRect( hList, nItem, nSubItem, LVIR_BOUNDS, &rcSubItem );

	RECT rcOffset;
	GetWindowRect ( hList, &rcOffset );
	rcSubItem.left += rcOffset.left;
	rcSubItem.right += rcOffset.left;
	rcSubItem.top += rcOffset.top;
	rcSubItem.bottom += rcOffset.top;

	int nHeight = rcSubItem.bottom - rcSubItem.top;
	int nWidth = rcSubItem.right - rcSubItem.left;

	ASSERT ( g_hIPEEditBM == nullptr );
	if ( g_hIPEEditBM ) return FALSE;

	g_hIPEEditBM = CreateWindowEx(
		WS_EX_CLIENTEDGE,
		_T("EDIT"),
		_T(""),
		WS_CHILD | WS_VISIBLE | WS_POPUPWINDOW | WS_BORDER | ES_WANTRETURN,
		rcSubItem.left, rcSubItem.top, nWidth, (int)( 1.5f*nHeight ),
		g_MemBookmarkDialog.GetHWND(),
		0,
		GetModuleHandle( NULL ),
		NULL );

	if ( g_hIPEEditBM == NULL )
	{
		ASSERT( !"Could not create edit box!" );
		MessageBox( nullptr, _T("Could not create edit box."), _T("Error"), MB_OK | MB_ICONERROR );
		return FALSE;
	};

	SendMessage( g_hIPEEditBM, WM_SETFONT, (WPARAM)GetStockObject( DEFAULT_GUI_FONT ), TRUE );
	SetWindowText( g_hIPEEditBM, NativeStr( m_vBookmarks[ nItem ]->Description() ).c_str() );

	SendMessage( g_hIPEEditBM, EM_SETSEL, 0, -1 );
	SetFocus( g_hIPEEditBM );
	EOldProcBM = (WNDPROC)SetWindowLong( g_hIPEEditBM, GWL_WNDPROC, (LONG)EditProcBM );

	return TRUE;
}
Ejemplo n.º 5
0
BOOL CReportCtrlEx2::StartDateTimeCtrl(int nItem, int nSubItem)
{
	// Get the grid width and height
	if (!m_bAllowEdit || /*!_IsValidIndex(nItem) ||*/ nSubItem < 0 || nSubItem >= GetColumnCount())
		return FALSE;

	if (m_ptEditting.x == nItem && m_ptEditting.y == nSubItem)
		return TRUE;

	EndItem(TRUE);

	m_ptEditting.x = nItem;
	m_ptEditting.y = nSubItem;
	SetAllItemStates(RC_ITEM_SELECTED, RC_ITEM_UNSELECTED); // unselect all
	//SetItemStates(m_ptEditting.x, RC_ITEM_SELECTED | RC_ITEM_FOCUSED);

	if (m_pDateTimeCtrlReport->GetSafeHwnd() != NULL)
		m_pDateTimeCtrlReport->DestroyWindow();

	CRect rcDateTimeCtrl;
	ListView_GetSubItemRect(GetSafeHwnd(), m_ptEditting.x, m_ptEditting.y, LVIR_BOUNDS, &rcDateTimeCtrl);

	m_pDateTimeCtrlReport->Create(WS_VISIBLE | WS_CHILD | WS_TABSTOP | /*DTS_SHOWNONE |*/ DTS_SHORTDATEFORMAT,
      rcDateTimeCtrl, this, 1006);

	CString strDate = CListCtrl::GetItemText(nItem, nSubItem);
	if (!strDate.IsEmpty())
	{
		int iDay = atoi(strDate.Left(2));
		int iMes = atoi(strDate.Mid(3, 2));
		int iAgno = atoi(strDate.Right(4));
		CTime date(iAgno, iMes, iDay, 0, 0, 0);
		m_pDateTimeCtrlReport->SetTime(&date);
	}
	
	m_pDateTimeCtrlReport->MoveWindow(&rcDateTimeCtrl);
	m_pDateTimeCtrlReport->ShowWindow(SW_SHOW);
	m_pDateTimeCtrlReport->SetFocus();

	return TRUE;
}
Ejemplo n.º 6
0
optional<LRESULT> TableViewImpl::processNotification(UINT message, UINT notification, WPARAM wParam, LPARAM lParam)
{
    if( message == WM_NOTIFY ) {
        switch(notification) {
            case NM_CUSTOMDRAW: {
                auto it = cbDrawItem.find(this);
                if( it != cbDrawItem.end() ) {
                    auto lplvcd = reinterpret_cast<LPNMLVCUSTOMDRAW>(lParam);
                    NMCUSTOMDRAW & nmcd = lplvcd->nmcd;
                    switch(nmcd.dwDrawStage) {
                        case CDDS_PREPAINT:
                            return CDRF_NOTIFYITEMDRAW;
                        case CDDS_ITEMPREPAINT:
                            return CDRF_NOTIFYSUBITEMDRAW;
                        case CDDS_SUBITEM | CDDS_ITEMPREPAINT: {
                            CanvasImpl canvas(nmcd.hdc);

                            RECT winRect;
                            auto pRect = &winRect;
                            if( ListView_GetSubItemRect(hWnd,nmcd.dwItemSpec,lplvcd->iSubItem,LVIR_BOUNDS,pRect) == 0 ) {
                                log::error("ListView_GetSubItemRect error");
                            }
                            auto rect = convertRect(winRect);

                            bool itemWasDrawn = it->second(TableView::ItemPos{lplvcd->iSubItem,nmcd.dwItemSpec},canvas,rect);
                            if( itemWasDrawn ) return CDRF_SKIPDEFAULT;
                        } break;
                    }
                }
            } break;
            case NM_CLICK: {
                auto lpnmitem = reinterpret_cast<LPNMITEMACTIVATE>(lParam);
                if( executeCallback(this,cbClickItem,TableView::ItemPos{lpnmitem->iSubItem,lpnmitem->iItem}) ) return 0;
            } break;
        }
    }
    
    return NativeControlImpl::processNotification(message,notification,wParam,lParam);
}
void ApplicationListDlg::BeginEdit(int item)
{
   char buf[6];
   DWORD param = GetProgramParam(item);

   m_editedItemIndex = item;

   //Set the param value
   if (m_values)
      ComboBox_SetCurSel(m_hParamEditCtrl, param);
   else
      SetWindowText(m_hParamEditCtrl, itoa(param, buf, 10));

   //Display the window at the correct location
   RECT rect;
   ListView_GetSubItemRect(m_hAppListWnd, item, 1, LVIR_BOUNDS, &rect);
   MoveWindow(m_hParamEditCtrl, rect.left, rect.top-1, rect.right-rect.left+1, rect.bottom-rect.top+1, TRUE);
   ShowWindow(m_hParamEditCtrl, SW_SHOW);

   //Give the focus to the edit control
   SetFocus(m_hParamEditCtrl);
}
Ejemplo n.º 8
0
LRESULT CInfoPanel::OnCustomDraw(NMCUSTOMDRAW *pDraw)
{
	NMLVCUSTOMDRAW *pLVDraw = (NMLVCUSTOMDRAW*)pDraw;

	if(pDraw->hdr.hwndFrom!=m_hListWnd)
		return 0;

	news_t *iItem = (news_t*)pDraw->lItemlParam;

	switch(pDraw->dwDrawStage)
	{
	case CDDS_PREPAINT:
		return CDRF_NOTIFYITEMDRAW;
	case CDDS_ITEMPREPAINT:
		return CDRF_NOTIFYSUBITEMDRAW;
	case CDDS_ITEMPREPAINT|CDDS_SUBITEM:
		switch(pLVDraw->iSubItem)
		{
		case 0:
			{
			// Docs are wrong, rc member is complete BS.  This fixes it
			ListView_GetSubItemRect(pDraw->hdr.hwndFrom, pDraw->dwItemSpec, pLVDraw->iSubItem, LVIR_BOUNDS, &pDraw->rc); 

			HFONT hOldFont = SelectFont(pDraw->hdc,m_hItemFont);
			COLORREF oldColour = SetTextColor(pDraw->hdc,/*GetSysColor(COLOR_HOTLIGHT)*/RGB(0,0,255));
			pDraw->rc.left+=4; // Small margin, looks better
			DrawText(pDraw->hdc,cvs::wide(iItem->subject.c_str()),-1,&pDraw->rc,DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX);
			SetTextColor(pDraw->hdc, oldColour);
			SelectFont(pDraw->hdc,hOldFont);
			return CDRF_SKIPDEFAULT;
			}
		case 1:
			return 0;
		}
	}

	return 0;
}
Ejemplo n.º 9
0
BOOL CReportCtrlEx::StartCombo(int nItem, int nSubItem)
{
	// Get the grid width and height
	if (!m_bAllowEdit || /*!_IsValidIndex(nItem) ||*/ nSubItem < 0 || nSubItem >= GetColumnCount())
		return FALSE;

	if (m_ptEditting.x == nItem && m_ptEditting.y == nSubItem)
		return TRUE;

/*	CRect rectEditBox;
	m_pWndEdit->GetWindowRect(&rectEditBox);*/

	EndItem(TRUE);

	m_ptEditting.x = nItem;
	m_ptEditting.y = nSubItem;
	SetAllItemStates(RC_ITEM_SELECTED, RC_ITEM_UNSELECTED); // unselect all
	//SetItemStates(m_ptEditting.x, RC_ITEM_SELECTED | RC_ITEM_FOCUSED);

	if (m_pWndCombo->GetSafeHwnd() != NULL)
		m_pWndCombo->DestroyWindow();

	if (!m_pWndCombo->Create(WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWN|CBS_SIMPLE/*CBS_DROPDOWNLIST*/, CRect(0, 0, 1, 1), this, 0))
		return FALSE;

	m_pWndCombo->SetFont(GetFont());

	CRect rcCombo;
	ListView_GetSubItemRect(GetSafeHwnd(), m_ptEditting.x, m_ptEditting.y, LVIR_BOUNDS, &rcCombo);
	rcCombo.bottom = rcCombo.bottom + 70;  // Se añade espacio para la lista desplegable

	// Según la columna que sea se cargan unos datos u otro
	if (nSubItem == 3)
	{
		m_pWndCombo->AddString(ALQUILER);
		m_pWndCombo->AddString(VENTA);
		m_pWndCombo->AddString(OTROS);
		m_pWndCombo->AddString(ENTREGA);
		m_pWndCombo->AddString(RECOGIDA);
	}
	else if (nSubItem == 4)
	{
		// Si es el combo del tipo de Alquiler, sólo se activa si el tipo es Alquiler
		CString strTipo = GetItemText(nItem, 3);

		if (strTipo == ALQUILER)
		{
			m_pWndCombo->AddString(MENSUAL);
			m_pWndCombo->AddString(DIA_LABORABLE);
			m_pWndCombo->AddString(DIA_NATURAL);
			//m_pWndCombo->AddString("Sábado");
		}
	}

	// Move the comboBox to that grid, obtain text from the grid, display the
	// comboBox, and, finally, highlights all text in the editbox and set the
	// windows focus to the editbox.
	m_pWndCombo->MoveWindow(&rcCombo);
	int iIndex = m_pWndCombo->FindString(0, GetItemText(m_ptEditting.x, m_ptEditting.y));
	m_pWndCombo->SetCurSel(iIndex);
	m_pWndCombo->ShowWindow(SW_SHOW);
	m_pWndCombo->SetFocus();
	return TRUE;
}
Ejemplo n.º 10
0
BOOL CALLBACK TabHandler2(HWND Window, UINT Message, WPARAM wParam, LPARAM lParam)
{
	static int Index = -1;
	static int lastEntry = 0;
	static int flag = 0;
	
	switch(Message)
	{
		case WM_LBUTTONDOWN:
			// Ако потребителя кликне извън списъка с файлове,
			// прекъсва се редактирането на файловото име и връща се стария текст
			if (hEdit != NULL)
				DestroyWindow(hEdit);
			break;
		case WM_INITDIALOG:
		{
			LVCOLUMN lvCol = {0};
			LOGFONT logFont;
			HFONT hFont;
			// Инициализация на списъка с файлове,
			// добавяне на текстов фонт и заглавие на колоната
			hList = GetDlgItem(Window, IDC_LISTVIEW);
			memset(&logFont, 0, sizeof(LOGFONT));
			logFont.lfHeight = 15;
			strcpy(logFont.lfFaceName, "Courier New");
			hFont = CreateFontIndirect(&logFont);
			SendDlgItemMessage(Window, IDC_LISTVIEW, WM_SETFONT, (WPARAM)hFont, TRUE);
			SendMessage(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);
			
			lvCol.mask = LVCF_TEXT | LVCF_WIDTH;
			lvCol.pszText = "";
			lvCol.cx = 280;
			SendMessage(hList, LVM_INSERTCOLUMN, 0, (LPARAM)&lvCol);
		}
		break;

		case WM_NOTIFY:			// Обработка на съобщенията от списъкъ
			switch(LOWORD(wParam)) {
				case IDC_LISTVIEW:
				{
					if (((LPNMHDR)lParam)->code == NM_CLICK) {		// Лев клик веднъш в списъкът
						Index = SendMessage(hList, LVM_GETNEXTITEM, -1, LVIS_FOCUSED);
						if (Index == -1) {
							flag = 0;
							break;
						}
						flag = 1;
						break;
					} else if (((LPNMHDR)lParam)->code == NM_DBLCLK) {		// Лев клик два пъти в списъкът
						if (hEdit != NULL)
							DestroyWindow(hEdit);
						// Ако потребителя кликне два пъти върху прозиволно файлово име
						// се "подкласва" списъкът:
						{
							RECT r;
							WNDPROC wpOld;
							LVITEM lvItem = {0};
							char text[50] = "";
							
							lvItem.mask = LVIF_TEXT;
							lvItem.cchTextMax = 50;
							lvItem.pszText = text;
							SendMessage(hList, LVM_GETITEMTEXT, ((NMLISTVIEW*)lParam)->iItem, (LPARAM)&lvItem);
							// Първо се намират координатите на къошетета на редактиращото поле
							ListView_GetSubItemRect(hList, ((NMLISTVIEW*)lParam)->iItem, 0, LVIR_LABEL, &r);
							// След това се създава редактиращо поле върху линията, която е селектирана
							hEdit = CreateWindowEx(0, "EDIT", text, WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT|ES_MULTILINE,
													r.left, r.top, r.right-r.left, r.bottom-r.top,
													((NMLISTVIEW*)lParam)->hdr.hwndFrom, NULL, hInst, 0);
							SendMessage(hEdit, EM_LIMITTEXT, 50, 0);	// Не повече от 50 букви
							SendMessage(hEdit, EM_SETSEL, 0, 50);		// Текста се селектира
							SetFocus(hEdit);							// Редактиращото поле получява фокус 
							// Заменя се обработващата процедура на редактиращото поле с SubClass_ListView_WndProc
							wpOld = (WNDPROC)SetWindowLong(hEdit, GWL_WNDPROC, (LONG)SubClass_ListView_WndProc);
							// Запазват се някои важни свойства ...
							SetProp(hEdit, "WP_OLD", (HANDLE)wpOld);
							SetProp(hEdit, "ITEM", (HANDLE)((NMLISTVIEW*)lParam)->iItem);
						}
						break;
					} else if (((LPNMHDR)lParam)->code == NM_RCLICK) {		// Десен клик в списъкът
						// Създава се менито с трите бутона "Добави", "Изтрий" и "Изтрий всичко"
						HMENU hMenu = LoadMenu(NULL, MAKEINTRESOURCE(IDR_MENU));
						HMENU hPopupMenu = GetSubMenu(hMenu, 0);
						POINT pt;
						SetMenuDefaultItem(hPopupMenu, (UINT)-1, TRUE);
						GetCursorPos(&pt);
						SetForegroundWindow(Window);
						TrackPopupMenu(hPopupMenu, TPM_LEFTALIGN, pt.x, pt.y, 0, Window, NULL);
						SetForegroundWindow(Window);
						// Изчистване на дръжките
						DestroyMenu(hPopupMenu);
						DestroyMenu(hMenu);
						break;
					}
				}
				break;
			}
			break;
			
		case WM_COMMAND:
			switch(LOWORD(wParam)) {
				case ID_ADD:				// Добавка на ново име в списъкът
				{
					char text[50] = "";
					LVITEM lvItem = {0};	// ListView Item struct

					lvItem.mask = LVIF_TEXT;     // Text Style
					lvItem.cchTextMax = 50;
					lvItem.iItem = SendMessage(hList, LVM_GETITEMCOUNT, 0, 0);
					SendMessage(hList,LVM_INSERTITEM,0,(LPARAM)&lvItem);
					sprintf(text,"FILENAMETOHIDE%d.EXE", lastEntry);
					lvItem.pszText = text;
					SendMessage(hList,LVM_SETITEM,0,(LPARAM)&lvItem);
					lastEntry++;
					break;
				}
				break;
				
				case ID_REMOVE:				// Изтриване на име от списъкът
					if (flag)
					   SendMessage(hList, LVM_DELETEITEM, Index, 0);
					flag = 0;
					Index = -1;
					break;
					
				case ID_REMOVEALL:			// Изтриване на всички имена от списъкът
					SendMessage(hList, LVM_DELETEALLITEMS, 0, 0);
					lastEntry = 0;
					flag = 0;
					Index = -1;
					break;

				case IDC_BUT_HIDE:			// Бутона за скриване на всички имена от списъкът
				{
					HANDLE hFile;
					int i;
					char drvName[50];
					char fileName[50] = "";
					char driverText[50] = "";
					DWORD dwReturn;
					LVITEM LvItem = {0};
					// Проверка дали списъкът е празен
					int count = SendMessage(hList, LVM_GETITEMCOUNT, 0, 0);
					if (!count) {
						MessageBox(Window, "Първо добави няколку файла (с десен клик).", "FileHide", 0);
						break;
					}
					// Добавяне на претставка върху името на драйвера
					// Това всъшност е символичното име на драйвера
					sprintf(drvName, "\\\\.\\%s", DriverName);
					// Създаване на дръжка към драйвера за четене и запис
					hFile = CreateFile(drvName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
					if (hFile == INVALID_HANDLE_VALUE) {
						MessageBox(Window, GetErrorText(GetLastError()), "FileHide", MB_ICONERROR);
					} else {
						// Ако е всичко на ред, изпращаме контролен код IOCTL_CLEAN_POOL
						// с буфер "clear pool", за да се изчистат предишните скрити файлове
						DeviceIoControl(hFile, IOCTL_CLEAN_POOL, "clear pool", sizeof("clear pool"),
										driverText, sizeof(driverText), &dwReturn, NULL);
						LvItem.mask = LVIF_TEXT;     // Text Style
						LvItem.cchTextMax = 50;
						LvItem.pszText = fileName;
						// Обхожда се списъкъ и за всеки отделно
						// се изпраща IOCTL_HIDE_FILE контролен код към драйвера
						for (i=0; i<count; i++) {
							LvItem.iItem = i;
							SendMessage(hList, LVM_GETITEMTEXT, i, (LPARAM)&LvItem);
							ZeroMemory(driverText, sizeof(driverText));
							DeviceIoControl(hFile, IOCTL_HIDE_FILE, fileName, sizeof(fileName),
											driverText, sizeof(driverText), &dwReturn, NULL);
							MessageBox(Window, driverText, DriverName, 0);
							//ZeroMemory(fileName, sizeof(fileName));
						}
						CloseHandle(hFile);
					}
				}
				break;
			}
			break;
			
		default:
			return FALSE;
	}
	return TRUE;
}
Ejemplo n.º 11
0
/**
 * name:	ListSubclassProc
 * desc:	procedure to catch messages for a listview control, to handle tooltips
 * param:	hwnd	- handle to the listview control's window
 *			msg		- message sent to the control
 *			wParam	- message specific parameter
 *			lParam	- message specific parameter
 * return:	message specific
 **/
static INT_PTR CALLBACK ProfileList_SubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{
	LPLISTCTRL pList;

	switch (msg) {
		case WM_KEYDOWN:
		{
			INT nCurSel, newSel;
			LVITEM lvi;

			switch (wParam) {
				case VK_F2:
					nCurSel = ListView_GetSelectionMark(hwnd);
					if (nCurSel == -1) break;
					ProfileList_BeginLabelEdit(hwnd, nCurSel, 0);
					return 0;
				case VK_F3:
					nCurSel = ListView_GetSelectionMark(hwnd);
					if (nCurSel == -1) break;
					ProfileList_BeginLabelEdit(hwnd, nCurSel, 1);
					return 0;
				case VK_UP:
				case VK_DOWN:
					lvi.iItem = nCurSel = ListView_GetSelectionMark(hwnd);
					lvi.iSubItem = 0;

					// find next valid item to select
					lvi.mask = LVIF_PARAM;
					do {
						if (wParam == VK_UP) lvi.iItem--;
						else lvi.iItem++;
						if (lvi.iItem == -1 || !ListView_GetItem(hwnd, &lvi)) {
							return 0;
						}
					} while (!lvi.lParam);

					ListView_EnsureVisible(hwnd, lvi.iItem, FALSE);
					newSel = lvi.iItem;
					lvi.iItem = nCurSel;
					lvi.mask = LVIF_STATE;
					lvi.stateMask = LVIS_FOCUSED|LVIS_SELECTED;
					lvi.state = 0;
					ListView_SetItem(hwnd, &lvi);
					lvi.iItem = newSel;
					lvi.state = LVIS_FOCUSED|LVIS_SELECTED;
					ListView_SetItem(hwnd, &lvi);
					ListView_SetSelectionMark(hwnd, lvi.iItem);
					return 0;
			}
			break;
		}
		case WM_MOUSEMOVE:
			if (PtrIsValid(pList = (LPLISTCTRL)GetUserData(hwnd))) {
				HDC hDC;
				RECT rchWnd, rcItem;
				SIZE textSize;
				LVHITTESTINFO hi;
				TOOLINFO ti;
				BOOLEAN bReposition;
				LPLCITEM pItem;
							
				hi.pt.x = GET_X_LPARAM(lParam);
				hi.pt.y = GET_Y_LPARAM(lParam);
				ListView_SubItemHitTest(hwnd, &hi);

				// show tip only if pointer is over an item
				if (pList->iHotItem != hi.iItem || pList->iHotSubItem != hi.iSubItem) {
					bReposition = pList->iHotItem != -1 || pList->iHotSubItem != -1;
					pList->iHotItem = hi.iItem;
					pList->iHotSubItem = hi.iSubItem;
					
					if ((hi.flags & LVHT_ONITEMLABEL) && PtrIsValid(pItem = ProfileList_GetItemData(hwnd, hi.iItem))) {
						GetWindowRect(hwnd, &rchWnd);
						ListView_GetSubItemRect(hwnd, hi.iItem, hi.iSubItem, LVIR_BOUNDS, &rcItem);
						// calculate size of text on the screen
						if ((hDC = GetDC(GetParent(hwnd)))) {
							SelectObject(hDC, (HFONT)SendMessage(GetParent(hwnd), WM_GETFONT, NULL, NULL));
							GetTextExtentPoint32(hDC, pItem->pszText[hi.iSubItem], lstrlen(pItem->pszText[hi.iSubItem]), &textSize);
							ReleaseDC(GetParent(hwnd), hDC);
						}
						// show tip only for text that is larger than te listview can display
						if (textSize.cx > rchWnd.right - rchWnd.left || textSize.cx > rcItem.right - rcItem.left) {
							ZeroMemory(&ti, sizeof(TOOLINFO));
							ti.cbSize = sizeof(TOOLINFO);
							ti.uFlags = TTF_IDISHWND|TTF_SUBCLASS|TTF_TRANSPARENT;
							ti.hinst = ghInst;
							ti.hwnd = hwnd;
							ti.uId = (UINT_PTR)hwnd;
							ti.lpszText = pItem->pszText[hi.iSubItem];
							ti.rect = rcItem;
							SendMessage(pList->hTip, TTM_SETMAXTIPWIDTH, 0, 300);
							SendMessage(pList->hTip, TTM_SETTOOLINFO, NULL, (LPARAM)&ti);
							if (pList->iHotSubItem > 0) {
								SendMessage(pList->hTip, TTM_SETTITLE, 1, (LPARAM)
									((pItem->idstrList && pItem->iListItem > 0 && pItem->iListItem < pItem->idstrListCount)
									? pItem->idstrList[pItem->iListItem].ptszTranslated
										: (pItem->pszText[0] && *pItem->pszText[0])
											? pItem->pszText[0]
											: TranslateT("<empty>"))
							);
								InvalidateRect(pList->hTip, NULL, TRUE);
							}
							else
								SendMessage(pList->hTip, TTM_SETTITLE, 0, (LPARAM)"");
							SendMessage(pList->hTip, TTM_ACTIVATE, TRUE, (LPARAM)&ti);
							pList->ptTip.x = rchWnd.left + GET_X_LPARAM(lParam) - 16;
							pList->ptTip.y = rchWnd.top + rcItem.top;
							// no TTN_SHOW is called if bReposition is TRUE, so repose here!
							if (bReposition) {
								RECT rcTip;
								GetClientRect(pList->hTip, &rcTip);
								SetWindowPos(pList->hTip, hwnd, pList->ptTip.x, pList->ptTip.y - rcTip.bottom, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
							}
							pList->wFlags |= LIF_TIPVISIBLE;
							return 0;
						}
					}
					if (pList->wFlags & LIF_TIPVISIBLE) {
						SendMessage(pList->hTip, TTM_ACTIVATE, FALSE, (LPARAM)&ti);
						pList->wFlags &= ~LIF_TIPVISIBLE;
					}
				}
			}
			return 0;

			// begin label edit
			case WM_LBUTTONDBLCLK:
			{
				LVHITTESTINFO hi;

				hi.pt.x = GET_X_LPARAM(lParam);
				hi.pt.y = GET_Y_LPARAM(lParam);
				if (ListView_SubItemHitTest(hwnd, &hi)) {
					ProfileList_BeginLabelEdit(hwnd, hi.iItem, hi.iSubItem);
				}
				return TRUE;
			}
			
		case WM_NOTIFY:
			if (!PtrIsValid(pList = (LPLISTCTRL)GetUserData(hwnd)))
				break;
		
			// ensure position of tooltip is on the topline of the item
			if (((LPNMHDR)lParam)->hwndFrom == pList->hTip) {
				RECT rcTip;
				GetClientRect(pList->hTip, &rcTip);
				
				switch (((LPNMHDR)lParam)->code) {
					case TTN_SHOW:
						SetWindowPos(pList->hTip, hwnd, pList->ptTip.x, pList->ptTip.y - rcTip.bottom, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
						return TRUE;
				}
			}
			break;
		case WM_COMMAND:
		{
			switch (LOWORD(wParam)) {

				// show dropdown menu for category list
				case BTN_EDIT:
				{
					INT i;
					TCHAR szEdit[MAX_PATH];

					if (!PtrIsValid(pList = (LPLISTCTRL)GetUserData(hwnd))) break;
					GetWindowText(pList->labelEdit.hEdit, szEdit, MAX_PATH);

					// need to create the dropdown list?
					if (pList->labelEdit.dropDown.hDrop == NULL) {
						const INT listHeight = 120;
						RECT rc, rcList;
						INT add;

						// dropdown rect
						GetClientRect(pList->hList, &rcList);
						rc.left = pList->labelEdit.rcCombo.left;
						rc.right = pList->labelEdit.rcCombo.right + pList->labelEdit.rcCombo.bottom - pList->labelEdit.rcCombo.top; 
						
						if (rcList.bottom < pList->labelEdit.rcCombo.bottom + listHeight) {
							rc.bottom = pList->labelEdit.rcCombo.bottom - 7; // don't ask me why!
							rc.top = rc.bottom - listHeight;
						}
						else {
							rc.top = pList->labelEdit.rcCombo.bottom;
							rc.bottom = rc.top + listHeight;
						}

						pList->labelEdit.dropDown.hDrop = CreateWindowEx(0,
									_T("LISTBOX"), NULL, WS_CHILD|WS_BORDER|WS_VSCROLL|LBS_COMBOBOX|LBS_HASSTRINGS,
									rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
									hwnd, NULL, ghInst, NULL);
						if (!pList->labelEdit.dropDown.hDrop) return FALSE;
						SetUserData(pList->labelEdit.dropDown.hDrop, pList);
						OldDropdownProc = (WNDPROC)SetWindowLongPtr(pList->labelEdit.dropDown.hDrop, GWLP_WNDPROC, (LONG_PTR)ProfileList_DropdownProc);
						SetWindowLongPtr(pList->labelEdit.dropDown.hDrop, GWLP_ID, LIST_DROPDOWN);
						SendMessage(pList->labelEdit.dropDown.hDrop, WM_SETFONT, (WPARAM)SendMessage(GetParent(pList->hList), WM_GETFONT, 0, 0), 0);
						
						// add items
						for (i = 0; i < pList->labelEdit.pItem->idstrListCount; i++) {
							add = ListBox_AddString(pList->labelEdit.dropDown.hDrop, pList->labelEdit.pItem->idstrList[i].ptszTranslated);
							ListBox_SetItemData(pList->labelEdit.dropDown.hDrop, add, pList->labelEdit.pItem->idstrList + i);
							if (!_tcscmp(szEdit, pList->labelEdit.pItem->idstrList[i].ptszTranslated))
								ListBox_SetCurSel(pList->labelEdit.dropDown.hDrop, add);
						}
					}
					else {
						LPIDSTRLIST lpidList;

						i = 0;
						while (PtrIsValid(lpidList = (LPIDSTRLIST)ListBox_GetItemData(pList->labelEdit.dropDown.hDrop, i))) {
							if (!_tcscmp(szEdit, lpidList->ptszTranslated)) {
								ListBox_SetCurSel(pList->labelEdit.dropDown.hDrop, i);
								break;
							}
							i++;
						}
						if (i == pList->labelEdit.pItem->idstrListCount) 
							ListBox_SetCurSel(pList->labelEdit.dropDown.hDrop, -1);
					}
					if (IsWindowVisible(pList->labelEdit.dropDown.hDrop)) {
						SetFocus(pList->labelEdit.hEdit);
					}
					else {
						ShowWindow(pList->labelEdit.dropDown.hDrop, SW_SHOW);
						//SetFocus(pList->labelEdit.dropDown.hDrop);
					}
					break;
				}
			}
			break;
		}
		case WM_MOUSEWHEEL:
		case WM_VSCROLL:
		case WM_HSCROLL:
		{
			if (PtrIsValid(pList = (LPLISTCTRL)GetUserData(hwnd)))
				ProfileList_EndLabelEdit(pList, FALSE);
			break;
		}

		case WM_KILLFOCUS:
		{
			HWND hwndFocus = GetFocus();

			if (PtrIsValid(pList = (LPLISTCTRL)GetUserData(hwnd)) &&
				pList->labelEdit.hEdit != hwndFocus && 
				pList->labelEdit.dropDown.hDrop != hwndFocus && 
				pList->labelEdit.hBtn != hwndFocus)
				ProfileList_EndLabelEdit(pList, FALSE);
			break;
		}

		case WM_DESTROY:
			if (PtrIsValid(pList = (LPLISTCTRL)GetUserData(hwnd))) {
				HFONT hFont;

				ProfileList_EndLabelEdit(pList, FALSE);
				ProfileList_Clear(hwnd);
				if (PtrIsValid(hFont = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0)) && hFont != pList->hFont)
					DeleteObject(hFont);
				DestroyWindow(pList->hTip);
				mir_free(pList);
			}
			break;
	}
	return CallWindowProc(OldListViewProc, hwnd, msg, wParam, lParam);
}
Ejemplo n.º 12
0
int KWndFrameList::Draw(LPDRAWITEMSTRUCT lpDrawItem)
{
    RECT rc;
    RECT rcTga;
    HDC hDc = NULL;
    TCHAR szId[128] = "";
    szId[0] = _T('\0');
    TCHAR szUitex[128] = "";
    szUitex[0] = _T('\0');
    TCHAR szFrame[128] = "";
    szFrame[0] = _T('\0');
    TCHAR szName[128] = "";
    szName[0] = _T('\0');
    TCHAR szWeith[128] = "";
    szWeith[0] = _T('\0');
    TCHAR szHeight[128] = "";
    szHeight[0] = _T('\0');
    TCHAR szInfo[128] = "";
    szInfo[0] = _T('\0');

    RECT rcDrawWindow;
    Gdiplus::Graphics *pGraphics = NULL;
    Gdiplus::Bitmap *pBitmap = NULL;
    KTgaBlock *pBlock = NULL;
    LPCTSTR pcszFrameName = NULL;
    BITMAPINFO bmpInfo; 

    KG_PROCESS_ERROR(lpDrawItem);
    KG_PROCESS_ERROR(lpDrawItem->CtlType == ODT_LISTVIEW);
    KG_PROCESS_ERROR(lpDrawItem->hwndItem == m_hListWnd);
    hDc = lpDrawItem->hDC;

    ListView_GetItemText(m_hListWnd, lpDrawItem->itemID, 0, szId, sizeof(szId) / sizeof(szId[0]));
    ListView_GetItemText(m_hListWnd, lpDrawItem->itemID, 2, szUitex, sizeof(szUitex) / sizeof(szUitex[0]));
    ListView_GetItemText(m_hListWnd, lpDrawItem->itemID, 3, szFrame, sizeof(szFrame) / sizeof(szFrame[0]));
    ListView_GetItemText(m_hListWnd, lpDrawItem->itemID, 4, szName, sizeof(szName) / sizeof(szName[0]));
    ListView_GetItemText(m_hListWnd, lpDrawItem->itemID, 5, szWeith, sizeof(szWeith) / sizeof(szWeith[0]));
    ListView_GetItemText(m_hListWnd, lpDrawItem->itemID, 6, szHeight, sizeof(szHeight) / sizeof(szHeight[0]));
    ListView_GetItemText(m_hListWnd, lpDrawItem->itemID, 7, szInfo, sizeof(szInfo) / sizeof(szInfo[0]));

    ListView_GetSubItemRect(m_hListWnd, lpDrawItem->itemID, 0, LVIR_BOUNDS, &rc);
    rc.top += TGA_HEIGHT / 3 - 3;
    DrawText(hDc, szId, sizeof(szId) / sizeof(szId[0]) , &rc, NULL);
    ListView_GetSubItemRect(m_hListWnd, lpDrawItem->itemID, 1, LVIR_BOUNDS, &rcTga);
    ListView_GetSubItemRect(m_hListWnd, lpDrawItem->itemID, 2, LVIR_BOUNDS, &rc);
    rc.top += TGA_HEIGHT / 3 - 3;
    DrawText(hDc, szUitex, sizeof(szUitex) / sizeof(szUitex[0]), &rc, NULL);
    ListView_GetSubItemRect(m_hListWnd, lpDrawItem->itemID, 3, LVIR_BOUNDS, &rc);
    rc.top += TGA_HEIGHT / 3 - 3;
    DrawText(hDc, szFrame, sizeof(szFrame) / sizeof(szFrame[0]), &rc, NULL);
    ListView_GetSubItemRect(m_hListWnd, lpDrawItem->itemID, 4, LVIR_BOUNDS, &rc);
    rc.top += TGA_HEIGHT / 3 - 3;
    DrawText(hDc, szName, sizeof(szName) / sizeof(szName[0]), &rc, NULL);
    ListView_GetSubItemRect(m_hListWnd, lpDrawItem->itemID, 5, LVIR_BOUNDS, &rc);
    rc.top += TGA_HEIGHT / 3 - 3;
    DrawText(hDc, szWeith, sizeof(szWeith) / sizeof(szWeith[0]), &rc, NULL);
    ListView_GetSubItemRect(m_hListWnd, lpDrawItem->itemID, 6, LVIR_BOUNDS, &rc);
    rc.top += TGA_HEIGHT / 3 - 3;
    DrawText(hDc, szHeight, sizeof(szHeight) / sizeof(szHeight[0]), &rc, NULL);
    ListView_GetSubItemRect(m_hListWnd, lpDrawItem->itemID, 7, LVIR_BOUNDS, &rc);
    rc.top += TGA_HEIGHT / 3 - 3;
    DrawText(hDc, szInfo, sizeof(szInfo) / sizeof(szInfo[0]), &rc, NULL);

    pBlock = KIconManager::GetSelf().Get(lpDrawItem->itemID)->GetTgaBlock();
    bmpInfo.bmiHeader.biBitCount = 32;
    bmpInfo.bmiHeader.biClrImportant = 0;
    bmpInfo.bmiHeader.biClrUsed = 0;
    bmpInfo.bmiHeader.biCompression = 0;
    bmpInfo.bmiHeader.biHeight = 0 - pBlock->GetHeight();   
    bmpInfo.bmiHeader.biPlanes = 1;
    bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpInfo.bmiHeader.biSizeImage = pBlock->GetHeight() * pBlock->GetWidth()* sizeof(DWORD);
    bmpInfo.bmiHeader.biWidth = pBlock->GetWidth();
    bmpInfo.bmiHeader.biXPelsPerMeter = 2834;
    bmpInfo.bmiHeader.biYPelsPerMeter = 2834;
    bmpInfo.bmiColors[0].rgbBlue = 255;
    bmpInfo.bmiColors[0].rgbGreen = 255;
    bmpInfo.bmiColors[0].rgbRed = 255;
    bmpInfo.bmiColors[0].rgbReserved = 0;
    pBitmap = Gdiplus::Bitmap::FromBITMAPINFO(&bmpInfo, pBlock->GetBufferPtr());
    KG_PROCESS_ERROR(pBitmap);
    KG_PROCESS_ERROR(m_hListWnd);
    ::GetClientRect(m_hListWnd, &rcDrawWindow); 
    hDc = GetDC(m_hListWnd);
    KG_PROCESS_ERROR(hDc);
    ::ValidateRect(m_hListWnd, NULL);
    pGraphics = new Gdiplus::Graphics(hDc);
    KG_PROCESS_ERROR(pGraphics);
    pGraphics->DrawImage(pBitmap, rcTga.left, rcTga.top);

Exit0:
    KG_DELETE(pBitmap);
    KG_DELETE(pGraphics);
    return true;
}
Ejemplo n.º 13
0
/**
 * name:	DlgProcPspAbout()
 * desc:	dialog procedure
 *
 * return:	0 or 1
 **/
INT_PTR CALLBACK PSPProcContactProfile(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	HWND hList = GetDlgItem(hDlg, LIST_PROFILE);
	LPLISTCTRL pList;

	switch (uMsg) {
		case WM_INITDIALOG:
		{
			LVCOLUMN lvc;
			RECT rc;
			LOGFONT lf;
			HFONT hFont;
			TOOLINFO ti;

			if (!hList || !(pList = (LPLISTCTRL)mir_alloc(sizeof(LISTCTRL)))) 
				return FALSE;
			ZeroMemory(pList, sizeof(LISTCTRL));

			TranslateDialogDefault(hDlg);
			Ctrl_InitTextColours();

			// init info structure
			pList->hList = hList;
			pList->nType = CTRL_LIST_PROFILE;
			ZeroMemory(&pList->labelEdit, sizeof(pList->labelEdit));
			SetUserData(hList, pList);

			// set new window procedure
			OldListViewProc = (WNDPROC)SetWindowLongPtr(hList, GWLP_WNDPROC, (LONG_PTR)&ProfileList_SubclassProc);
			
			// remove static edge in aero mode
			if (IsAeroMode())
				SetWindowLongPtr(hList, GWL_EXSTYLE, GetWindowLongPtr(hList, GWL_EXSTYLE)&~WS_EX_STATICEDGE);

			// insert columns into the listboxes					
			ListView_SetExtendedListViewStyle(hList, LVS_EX_FULLROWSELECT);


			PSGetBoldFont(hDlg, hFont);
			SendDlgItemMessage(hDlg, IDC_PAGETITLE, WM_SETFONT, (WPARAM)hFont, 0);

			// set listfont
			pList->hFont = (HFONT)SendMessage(hList, WM_GETFONT, 0, 0);
			pList->wFlags |= LVF_EDITLABEL;
			GetObject(pList->hFont, sizeof(lf), &lf);
			lf.lfHeight -= 6;
			hFont = CreateFontIndirect(&lf);
			SendMessage(hList, WM_SETFONT, (WPARAM)hFont, 0);

			GetClientRect(hList, &rc);
			rc.right -= GetSystemMetrics(SM_CXVSCROLL);

			// initiate the tooltips
			pList->hTip = CreateWindowEx(WS_EX_TOPMOST,	TOOLTIPS_CLASS, NULL,
				WS_POPUP|TTS_BALLOON|TTS_NOPREFIX|TTS_ALWAYSTIP,
				CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
				hList, NULL, ghInst, NULL);
			if (pList->hTip) {
				SetWindowPos(pList->hTip, HWND_TOPMOST,
					CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
					SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);

				ZeroMemory(&ti, sizeof(TOOLINFO));
				ti.cbSize = sizeof(TOOLINFO);
				ti.uFlags = TTF_IDISHWND|TTF_SUBCLASS|TTF_TRANSPARENT;
				ti.hinst = ghInst;
				ti.hwnd = hList;
				ti.uId = (UINT_PTR)hList;
				SendMessage(pList->hTip, TTM_ADDTOOL, NULL, (LPARAM)&ti);
				SendMessage(pList->hTip, TTM_ACTIVATE, FALSE, (LPARAM)&ti);
			}		

			// insert columns into the listboxes					
			lvc.mask = LVCF_WIDTH;
			lvc.cx = rc.right / 8 * 3;
			ListView_InsertColumn(hList, 0, &lvc);
			lvc.cx = rc.right / 8 * 5;
			ListView_InsertColumn(hList, 1, &lvc);
			return TRUE;
		}

		case WM_CTLCOLORSTATIC:
		case WM_CTLCOLORDLG:
			if (IsAeroMode())
				return (INT_PTR)GetStockBrush(WHITE_BRUSH);
			break;

		case WM_NOTIFY:
			switch (((LPNMHDR)lParam)->idFrom) {
				case 0:
				{
					HANDLE hContact = (HANDLE)((LPPSHNOTIFY)lParam)->lParam;
					LPCSTR pszProto;
					
					if (!PtrIsValid(pList = (LPLISTCTRL)GetUserData(hList))) break;

					switch (((LPNMHDR)lParam)->code) {
						// some account data may have changed so reread database
						case PSN_INFOCHANGED:
						{
							BYTE msgResult = 0;
							LPIDSTRLIST idList;
							UINT nList;
							BYTE i;
							INT iItem = 0,
								iGrp = 0,
								numProtoItems,
								numUserItems;

							if (!(pList->wFlags & CTRLF_CHANGED) && PSGetBaseProto(hDlg, pszProto) && *pszProto != 0) {
								ProfileList_Clear(hList);

								// insert the past information
								for (i = 0; i < 3; i++) {
									pFmt[i].GetList((WPARAM)&nList, (LPARAM)&idList);
									if ((numProtoItems = ProfileList_AddItemlistFromDB(pList, iItem, idList, nList, hContact, pszProto, pFmt[i].szCatFmt, pFmt[i].szValFmt, CTRLF_HASPROTO)) < 0)
										return FALSE;

									// scan all basic protocols for the subcontacts
									if (DB::Module::IsMetaAndScan(pszProto)) {
										INT iDefault = CallService(MS_MC_GETDEFAULTCONTACTNUM, (WPARAM)hContact, NULL);
										HANDLE hSubContact, hDefContact;
										LPCSTR pszSubBaseProto;
										INT j, numSubs;
										
										if ((hDefContact = (HANDLE)CallService(MS_MC_GETSUBCONTACT, (WPARAM)hContact, iDefault)) &&
											 (pszSubBaseProto = DB::Contact::Proto(hDefContact)))
										{
											if ((numProtoItems += ProfileList_AddItemlistFromDB(pList, iItem, idList, nList, hDefContact, pszSubBaseProto, pFmt[i].szCatFmt, pFmt[i].szValFmt, CTRLF_HASMETA|CTRLF_HASPROTO)) < 0)
												return FALSE;

											// copy the missing settings from the other subcontacts
											numSubs = CallService(MS_MC_GETNUMCONTACTS, (WPARAM)hContact, NULL);
											for (j = 0; j < numSubs; j++) {
												if (j == iDefault) continue;
												if (!(hSubContact = (HANDLE)CallService(MS_MC_GETSUBCONTACT, (WPARAM)hContact, j))) continue;
												if (!(pszSubBaseProto = DB::Contact::Proto(hSubContact))) continue;
												if ((numProtoItems += ProfileList_AddItemlistFromDB(pList, iItem, idList, nList, hSubContact, pszSubBaseProto, pFmt[i].szCatFmt, pFmt[i].szValFmt, CTRLF_HASMETA|CTRLF_HASPROTO)) < 0)
													return FALSE;
												//if ((numUserItems += ProfileList_AddItemlistFromDB(pList, iItem, idList, nList, hSubContact, USERINFO, pFmt[i].szCatFmt, pFmt[i].szValFmt, CTRLF_HASMETA|CTRLF_HASPROTO)) < 0)
												//	return FALSE;
											}
										}
									}
									if ((numUserItems = ProfileList_AddItemlistFromDB(pList, iItem, idList, nList, hContact, USERINFO, pFmt[i].szCatFmt, pFmt[i].szValFmt, CTRLF_HASCUSTOM)) < 0)
										return FALSE;
									if (numUserItems || numProtoItems) {
										msgResult = PSP_CHANGED;
										ProfileList_AddGroup(hList, pFmt[i].szGroup, iGrp);
										iGrp = ++iItem;
									}
								}
							}
							SetWindowLongPtr(hDlg, DWLP_MSGRESULT, msgResult);
							break;
						}
						// user swiches to another propertysheetpage
						case PSN_KILLACTIVE:
							ProfileList_EndLabelEdit(hList, TRUE);
							break;
						// user selected to apply settings to the database
						case PSN_APPLY:
							if (pList->wFlags & CTRLF_CHANGED) {
								BYTE iFmt = -1;
								INT iItem;
								LVITEM lvi;
								TCHAR szGroup[MAX_PATH];
								CHAR pszSetting[MAXSETTING];
								LPLCITEM pItem;
								LPSTR pszModule = USERINFO;

								if (!hContact) PSGetBaseProto(hDlg, pszModule);

								*szGroup = 0;
								lvi.mask = LVIF_TEXT|LVIF_PARAM;
								lvi.pszText = szGroup;
								lvi.cchTextMax = MAX_PATH;

								for (iItem = lvi.iItem = lvi.iSubItem = 0; ListView_GetItem(hList, &lvi); lvi.iItem++) {
									if (!PtrIsValid(pItem = (LPLCITEM)lvi.lParam)) {
										// delete reluctant items
										if (iFmt >= 0 && iFmt < SIZEOF(pFmt)) {
											DB::Setting::DeleteArray(hContact, pszModule, pFmt[iFmt].szCatFmt, iItem);
											DB::Setting::DeleteArray(hContact, pszModule, pFmt[iFmt].szValFmt, iItem);
										}
										// find information about the group
										for (iFmt = 0; iFmt < SIZEOF(pFmt); iFmt++) {
											if (!_tcscmp(szGroup, pFmt[iFmt].szGroup)) {
												break;
											}
										}
										// indicate, no group was found. should not happen!!
										if (iFmt == SIZEOF(pFmt)) {
											*szGroup = 0;
											iFmt = -1;
										}
										iItem = 0;
									}
									else
									if (iFmt >= 0 && iFmt < SIZEOF(pFmt)) {
										// save value
										if (!pItem->pszText[1] || !*pItem->pszText[1])
											continue;
										if (!(pItem->wFlags & (CTRLF_HASPROTO|CTRLF_HASMETA))) {
											mir_snprintf(pszSetting, MAXSETTING, pFmt[iFmt].szValFmt, iItem);
											DB::Setting::WriteTString(hContact, pszModule, pszSetting, pItem->pszText[1]);
											// save category
											mir_snprintf(pszSetting, MAXSETTING, pFmt[iFmt].szCatFmt, iItem);
											if (pItem->idstrList && pItem->iListItem > 0 && pItem->iListItem < pItem->idstrListCount)
												DB::Setting::WriteAString(hContact, pszModule, pszSetting, (LPSTR)pItem->idstrList[pItem->iListItem].pszText);
											else 
											if (pItem->pszText[0] && *pItem->pszText[0])
												DB::Setting::WriteTString(hContact, pszModule, pszSetting, (LPTSTR)pItem->pszText[0]);
											else									
												DB::Setting::Delete(hContact, pszModule, pszSetting);
											// redraw the item if required
											if (pItem->wFlags & CTRLF_CHANGED) {
												pItem->wFlags &= ~CTRLF_CHANGED;
												ListView_RedrawItems(hList, lvi.iItem, lvi.iItem);
											}
											iItem++;
										}
									}
								}
								// delete reluctant items
								if (iFmt >= 0 && iFmt < SIZEOF(pFmt)) {
									DB::Setting::DeleteArray(hContact, pszModule, pFmt[iFmt].szCatFmt, iItem);
									DB::Setting::DeleteArray(hContact, pszModule, pFmt[iFmt].szValFmt, iItem);
								}

								pList->wFlags &= ~CTRLF_CHANGED;
							}
							break;
					}
					break;
				}

				//
				// handle notification messages from the list control
				//
				case LIST_PROFILE:
				{
					LPLISTCTRL pList = (LPLISTCTRL)GetUserData(((LPNMHDR)lParam)->hwndFrom);

					switch (((LPNMHDR)lParam)->code) {
						case NM_RCLICK:
						{
							HMENU hMenu = CreatePopupMenu();
							MENUITEMINFO mii;
							HANDLE hContact;
							LVHITTESTINFO hi;
							LPLCITEM pItem;
							POINT pt;
							
							if (!hMenu) return 1;
							PSGetContact(hDlg, hContact);
							GetCursorPos(&pt);
							hi.pt = pt;
							ScreenToClient(((LPNMHDR)lParam)->hwndFrom, &hi.pt);
							ListView_SubItemHitTest(((LPNMHDR)lParam)->hwndFrom, &hi);
							pItem = ProfileList_GetItemData(((LPNMHDR)lParam)->hwndFrom, hi.iItem);

							// insert menuitems
							ZeroMemory(&mii, sizeof(MENUITEMINFO));
							mii.cbSize = sizeof(MENUITEMINFO);
							mii.fMask = MIIM_ID|MIIM_STRING;
							// insert "Add" Menuitem
							mii.wID = BTN_ADD_intEREST;
							mii.dwTypeData = TranslateT("Add Interest");
							InsertMenuItem(hMenu, 0, TRUE, &mii);
							mii.wID = BTN_ADD_AFFLIATION;
							mii.dwTypeData = TranslateT("Add Affliation");
							InsertMenuItem(hMenu, 1, TRUE, &mii);
							mii.wID = BTN_ADD_PAST;
							mii.dwTypeData = TranslateT("Add Past");
							InsertMenuItem(hMenu, 2, TRUE, &mii);

							if (hi.iItem != -1 && PtrIsValid(pItem) && !(hContact && (pItem->wFlags & CTRLF_HASPROTO))) {
								// insert separator
								mii.fMask = MIIM_FTYPE;
								mii.fType = MFT_SEPARATOR;
								InsertMenuItem(hMenu, 3, TRUE, &mii);
								// insert "Delete" Menuitem
								mii.fMask = MIIM_ID|MIIM_STRING;
								mii.wID = BTN_EDIT_CAT;
								mii.dwTypeData = TranslateT("Edit Category");
								InsertMenuItem(hMenu, 4, TRUE, &mii);
								mii.wID = BTN_EDIT_VAL;
								mii.dwTypeData = TranslateT("Edit Value");
								InsertMenuItem(hMenu, 5, TRUE, &mii);
								mii.fMask = MIIM_FTYPE;
								mii.fType = MFT_SEPARATOR;
								InsertMenuItem(hMenu, 6, TRUE, &mii);
								// insert "Delete" Menuitem
								mii.fMask = MIIM_ID|MIIM_STRING;
								mii.wID = BTN_DEL;
								mii.dwTypeData = TranslateT("Delete");
								InsertMenuItem(hMenu, 7, TRUE, &mii);
							}
							TrackPopupMenu(hMenu, 0, pt.x, pt.y, 0, hDlg, 0);
							DestroyMenu(hMenu);
							return 0;
						}
						/*case LVN_BEGINSCROLL:
							SetFocus(((LPNMHDR)lParam)->hwndFrom);
							break;
							*/
						case LVN_GETDISPINFO:
							if (pList->labelEdit.iTopIndex != ListView_GetTopIndex(hList))
								ProfileList_EndLabelEdit(((LPNMHDR)lParam)->hwndFrom, FALSE);
							break;
						case NM_CUSTOMDRAW:
						{
							LPNMLVCUSTOMDRAW cd = (LPNMLVCUSTOMDRAW)lParam;
							LPLCITEM pItem = (LPLCITEM)cd->nmcd.lItemlParam;
							RECT rc;

							switch (cd->nmcd.dwDrawStage) {
								case CDDS_PREPAINT:
									SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_NOTIFYITEMDRAW);
									return TRUE;
								
								case CDDS_ITEMPREPAINT:
									ListView_GetItemRect(cd->nmcd.hdr.hwndFrom, cd->nmcd.dwItemSpec, &rc, LVIR_BOUNDS);
									if (!PtrIsValid(pItem)) {
										HFONT hBold, hFont;
										TCHAR szText[MAX_PATH];
										
										PSGetBoldFont(hDlg, hBold);
										hFont = (HFONT)SelectObject(cd->nmcd.hdc, hBold);
										SetTextColor(cd->nmcd.hdc, GetSysColor(COLOR_3DSHADOW));
										ProfileList_GetItemText(cd->nmcd.hdr.hwndFrom, cd->nmcd.dwItemSpec, 0, szText, MAX_PATH);
										rc.left += 6;
										DrawText(cd->nmcd.hdc, TranslateTS(szText), -1, &rc, DT_NOCLIP|DT_NOPREFIX|DT_SINGLELINE|DT_VCENTER);

										rc.bottom -= 2;
										rc.top = rc.bottom - 1;
										rc.left -= 6;
										DrawEdge(cd->nmcd.hdc, &rc, BDR_SUNKENOUTER, BF_RECT);

										SelectObject(cd->nmcd.hdc, hFont);
										SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_SKIPDEFAULT);
										return TRUE;
									}
									// draw selected item
									if ((cd->nmcd.uItemState & CDIS_SELECTED) || (pList->labelEdit.iItem == cd->nmcd.dwItemSpec)) {
										SetTextColor(cd->nmcd.hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
										FillRect(cd->nmcd.hdc, &rc, GetSysColorBrush(COLOR_HIGHLIGHT));
									}
									// draw background of unselected item
									else {
										SetTextColor(cd->nmcd.hdc, 
											(pItem->wFlags & CTRLF_CHANGED) 
												? clrChanged : (pItem->wFlags & CTRLF_HASMETA)
													? clrMeta : ((pItem->wFlags & (CTRLF_HASCUSTOM)) && (pItem->wFlags & CTRLF_HASPROTO))
														? clrBoth : (pItem->wFlags & CTRLF_HASCUSTOM)
															? clrCustom	: clrNormal);
										FillRect(cd->nmcd.hdc, &rc, GetSysColorBrush(COLOR_WINDOW));
									}
									SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_NEWFONT|CDRF_NOTIFYSUBITEMDRAW);
									return TRUE;
								
								case CDDS_SUBITEM|CDDS_ITEMPREPAINT:
								{
									HFONT hoFont = (HFONT)SelectObject(cd->nmcd.hdc, pList->hFont);

									ListView_GetSubItemRect(cd->nmcd.hdr.hwndFrom, cd->nmcd.dwItemSpec, cd->iSubItem, LVIR_BOUNDS, &rc);
									if (cd->iSubItem == 0) {
										RECT rc2;
										ListView_GetSubItemRect(cd->nmcd.hdr.hwndFrom, cd->nmcd.dwItemSpec, 1, LVIR_BOUNDS, &rc2);
										rc.right = rc2.left;
									}
									rc.left += 3;
									DrawText(cd->nmcd.hdc,
										pItem->pszText[cd->iSubItem] 
											? pItem->pszText[cd->iSubItem] 
											: (cd->iSubItem == 0 && pItem->idstrList && pItem->iListItem > 0 && pItem->iListItem < pItem->idstrListCount)
												? pItem->idstrList[pItem->iListItem].ptszTranslated
												: TranslateT("<empty>"),
										-1, &rc, DT_END_ELLIPSIS|DT_NOCLIP|DT_NOPREFIX|DT_SINGLELINE|DT_VCENTER);
									SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_SKIPDEFAULT);
									return TRUE;
								}
							} /* switch (cd->nmcd.dwDrawStage) */
							break;
						} /* case NM_CUSTOMDRAW: */
					} /* (((LPNMHDR)lParam)->code) */
					break;
				}
			}
			break; /* case WM_NOTIFY: */

		case WM_COMMAND:
		{
			switch (LOWORD(wParam)) {
				case BTN_ADD_intEREST:
					return ProfileList_AddNewItem(hDlg, (LPLISTCTRL)GetUserData(hList), &pFmt[2]);
				case BTN_ADD_AFFLIATION:
					return ProfileList_AddNewItem(hDlg, (LPLISTCTRL)GetUserData(hList), &pFmt[1]);
				case BTN_ADD_PAST:
					return ProfileList_AddNewItem(hDlg, (LPLISTCTRL)GetUserData(hList), &pFmt[0]);
				case BTN_EDIT_CAT:
					ProfileList_BeginLabelEdit(hList, ListView_GetSelectionMark(hList), 0);
					break;
				case BTN_EDIT_VAL:
					ProfileList_BeginLabelEdit(hList, ListView_GetSelectionMark(hList), 1);
					break;
				case BTN_DEL:
					if (IDYES == MsgBox(hDlg, MB_YESNO|MB_ICON_QUESTION, LPGENT("Question"), LPGENT("Delete an entry"), LPGENT("Do you really want to delete this entry?"))) {
						INT iItem = ListView_GetSelectionMark(hList);
						LPLISTCTRL pList = (LPLISTCTRL)GetUserData(hList);

						ProfileList_DeleteItem(hList, iItem);
						if (PtrIsValid(pList)) pList->wFlags |= CTRLF_CHANGED;
						SendMessage(GetParent(hDlg), PSM_CHANGED, NULL, NULL);
						// check if to delete any devider
						if (!ProfileList_GetItemData(hList, iItem--) && !ProfileList_GetItemData(hList, iItem))
							ListView_DeleteItem(hList, iItem);
					}
					break;
			}
			break;
		}
	}
	return FALSE;
}
Ejemplo n.º 14
0
    void KUiFontManage::Draw(LPDRAWITEMSTRUCT lpDrawItem)
    {
        KG_PROCESS_ERROR(lpDrawItem->CtlType == ODT_LISTVIEW && lpDrawItem->hwndItem == m_hListWnd);
        KG_PROCESS_ERROR(m_pFontIni);

        HDC hDc = lpDrawItem->hDC;
        COLORREF bkColor, FontColor, FontBColor, FontPColor;
        char szName[8];
		szName[0] = '\0';
        char szValue[128];
		szValue[0] = '\0';
        char szColorValue[128];
		szColorValue[0] = '\0';
        char szBoderColorValue[128];
		szBoderColorValue[0] = '\0';
		char szProjectionValue[128];
		szProjectionValue[0] = '\0';

        sprintf(szName, "%d", lpDrawItem->itemID);
        m_pFontIni->GetString(szName, "Name", "", szValue, 32);
        m_pFontIni->GetString(szName, "Color", "", szColorValue, 32);
        m_pFontIni->GetString(szName, "BorderColor", "", szBoderColorValue, 32);
		m_pFontIni->GetString(szName, "ProjectionColor", "", szProjectionValue, 32);
        FontColor = UICOLORMANAGE::GetColorValueByName(szColorValue);
        FontBColor = UICOLORMANAGE::GetColorValueByName(szBoderColorValue);
		FontPColor = UICOLORMANAGE::GetColorValueByName(szProjectionValue);

        char *pClip = NULL;
        pClip = strchr(szValue, 0);
        int i = 0;
        for (i = pClip - szValue; i < sizeof(szValue); i++) 
        {
            szValue[i] = ' ';
        }
        szValue[127] = 0;

        pClip = strchr(szColorValue, 0);
        for (i = pClip - szColorValue; i < sizeof(szColorValue); i++) 
        {
            szColorValue[i] = ' ';
        }
        szColorValue[127] = 0;

        pClip = strchr(szBoderColorValue, 0);
        for (i = pClip - szBoderColorValue; i < sizeof(szBoderColorValue); i++) 
        {
            szBoderColorValue[i] = ' ';
        }
        szBoderColorValue[127] = 0;

		pClip = strchr(szProjectionValue, 0);
		for (i = pClip - szProjectionValue; i < sizeof(szProjectionValue); i++) 
		{
			szProjectionValue[i] = ' ';
		}
		szProjectionValue[127] = 0;


        SetBkMode(hDc, OPAQUE);
        if (lpDrawItem->itemState == ODS_SELECTED) 
        {
            bkColor = SetBkColor(hDc, RGB( 0, 0, 0));
            SetTextColor(hDc, RGB(255,0, 0));
        }
        else
        {
            SetTextColor(hDc, RGB(0,0, 0));
        }
        
        RECT rc;
        ListView_GetSubItemRect(m_hListWnd, lpDrawItem->itemID, 0, LVIR_BOUNDS, &rc);
        DrawText(hDc, szValue, sizeof(szValue), &rc, NULL);

        COLORREF bkBkcolor =SetBkColor(hDc, FontColor); 
        ListView_GetSubItemRect(m_hListWnd, lpDrawItem->itemID, 1, LVIR_BOUNDS, &rc);
        DrawText(hDc, szColorValue, sizeof(szColorValue), &rc, NULL);

        SetBkColor(hDc, FontBColor); 
        ListView_GetSubItemRect(m_hListWnd, lpDrawItem->itemID, 2, LVIR_BOUNDS, &rc);
        DrawText(hDc, szBoderColorValue, sizeof(szBoderColorValue), &rc, NULL);

		SetBkColor(hDc, FontPColor); 
		ListView_GetSubItemRect(m_hListWnd, lpDrawItem->itemID, 3, LVIR_BOUNDS, &rc);
		DrawText(hDc, szProjectionValue, sizeof(szProjectionValue), &rc, NULL);

        SetBkColor(hDc, bkBkcolor);
        
        if (lpDrawItem->itemState == ODS_SELECTED) 
        {
            SetBkColor(hDc, bkColor);
        }
        SetBkMode(hDc, TRANSPARENT);

    Exit0:
        return;
    }
Ejemplo n.º 15
0
void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{	
	if (songlist.quit)
		return;

	UINT n = lpDrawItemStruct->itemID;
	HDC* mdc = &lpDrawItemStruct->hDC;
	HWND* hWnd = &songlist.hWnd;	
	HDC* bdc = &songlist.bdc;
	IMGINFO* imgplay = &songlist.imgplay;
	IMGINFO* imgpause = &songlist.imgpause;
	PLAYERINFO* playerinfo = GetPlayerInfo(n);
	if (playerinfo == NULL)	
		return;
	
	HFONT font = (HFONT)GetCurrentObject(*mdc, OBJ_FONT);
	SelectObject(*bdc, font);		

	RECT r = {0};
	LONG x = lpDrawItemStruct->rcItem.left;
	LONG y = lpDrawItemStruct->rcItem.top;
	LONG w = lpDrawItemStruct->rcItem.right - lpDrawItemStruct->rcItem.left;
	LONG h = lpDrawItemStruct->rcItem.bottom - lpDrawItemStruct->rcItem.top;
	r.left = lpDrawItemStruct->rcItem.left;
	r.right = lpDrawItemStruct->rcItem.right - lpDrawItemStruct->rcItem.left;
	r.top = 0;
	r.bottom = lpDrawItemStruct->rcItem.bottom - lpDrawItemStruct->rcItem.top;

	COLORREF color = RGB(0, 0, 0);

	if ((lpDrawItemStruct->itemAction | ODA_SELECT) && (lpDrawItemStruct->itemState & ODS_SELECTED))  
	{
		SetTextColor(*bdc, RGB(0, 0, 0));
		color = RGB(192, 192, 192);		
	}
	else
		SetTextColor(*bdc, RGB(255, 255, 255));	

	SetBkColor(*bdc, color);
	HBRUSH brush = CreateSolidBrush(color);	
	ExtTextOut(*bdc, 0, 0, ETO_OPAQUE, &r, NULL, 0, NULL);
	DeleteObject(brush);

	RECT rect = {0};
	if (playerinfo != NULL)
	{
		Gdiplus::Graphics graphics(*bdc);
		ListView_GetSubItemRect(*hWnd, n, 0, LVIR_LABEL, &rect);	
		Gdiplus::PointF point;

		if (playerinfo->playing)
		{
			point.X = (Gdiplus::REAL)(rect.right - rect.left - imgplay->image->GetWidth()) / 2.0F;
			point.Y = (Gdiplus::REAL)(rect.bottom - rect.top - imgplay->image->GetHeight()) / 2.0F;
			Gdiplus::Status s = graphics.DrawImage(imgplay->image, point);
		}

		if (playerinfo->pause)
		{
			point.X = (Gdiplus::REAL)(rect.right - rect.left - imgpause->image->GetWidth()) / 2.0F;
			point.Y = (Gdiplus::REAL)(rect.bottom - rect.top - imgpause->image->GetHeight()) / 2.0F;
			Gdiplus::Status s = graphics.DrawImage(imgpause->image, point);
		}
	}
	
	for (int i = 1;i < 4;i++)
	{
		wchar_t text[256] = {0};		
		ListView_GetItemText(*hWnd, n, i, text, sizeof(text) / sizeof(wchar_t));
		ListView_GetSubItemRect(*hWnd, n, i, LVIR_LABEL, &rect);
		r.left = rect.left;
		r.right = rect.right;
		r.top = 0;
		r.bottom = rect.bottom - rect.top;
		DrawText(*bdc, text, wcslen(text), &r, DT_LEFT | DT_SINGLELINE | DT_VCENTER);		
	}

	BitBlt(*mdc, x, y, w, h, *bdc, 0, 0, SRCCOPY);	
}
Ejemplo n.º 16
0
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)&param);
						else
							res = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_VCARD_ADDEMAIL), hwndDlg, EditEmailDlgProc, (LPARAM)&param);
						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)&param);
						else
							res = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_VCARD_ADDEMAIL), hwndDlg, EditEmailDlgProc, (LPARAM)&param);
						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;
}
Ejemplo n.º 17
0
INT_PTR CALLBACK ContactDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch(msg) {
		case WM_INITDIALOG:
			SetWindowLongPtr(hwndDlg,GWLP_USERDATA,(LONG_PTR)lParam);
			if(hEmailFont) DeleteObject(hEmailFont);
			{	LOGFONT lf;
				hEmailFont=(HFONT)SendDlgItemMessage(hwndDlg,IDC_EMAILS,WM_GETFONT,0,0);
				GetObject(hEmailFont,sizeof(lf),&lf);
				lf.lfUnderline=1;
				hEmailFont=CreateFontIndirect(&lf);
			}
			if(hHandCursor==NULL) {
				if(IsWinVer2000Plus()) hHandCursor=LoadCursor(NULL,IDC_HAND);
				else hHandCursor=LoadCursor(hMirandaInst,MAKEINTRESOURCE(IDC_HYPERLINKHAND));
			}
			TranslateDialogDefault(hwndDlg);
			{	LVCOLUMN lvc;
				RECT rc;
				GetClientRect(GetDlgItem(hwndDlg,IDC_EMAILS),&rc);
				rc.right-=GetSystemMetrics(SM_CXVSCROLL);
				lvc.mask=LVCF_WIDTH;
				ListView_SetExtendedListViewStyleEx(GetDlgItem(hwndDlg,IDC_EMAILS), LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP, LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);
				ListView_SetExtendedListViewStyleEx(GetDlgItem(hwndDlg,IDC_PHONES), LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP, LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);
				lvc.cx=rc.right/4;
				ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_EMAILS),0,&lvc);
				ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_PHONES),0,&lvc);
				lvc.cx=rc.right-rc.right/4-40;
				ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_EMAILS),1,&lvc);
				lvc.cx=rc.right-rc.right/4-90;
				ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_PHONES),1,&lvc);
				lvc.cx=50;
				ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_PHONES),2,&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),3,&lvc);
				ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_PHONES),4,&lvc);
			}
			break;
		case M_REMAKELISTS:
			{	char *szProto;
			LVITEM lvi;
			int i;
			char idstr[33];
			TCHAR idstr2[33];
			DBVARIANT dbv;
			HANDLE hContact=(HANDLE)GetWindowLongPtr(hwndDlg,GWLP_USERDATA);

			if (hContact != NULL) {
				szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0);
				if (szProto==NULL) break;
				//e-mails
				ListView_DeleteAllItems(GetDlgItem(hwndDlg,IDC_EMAILS));
				lvi.mask=LVIF_TEXT|LVIF_PARAM;
				lvi.lParam=(LPARAM)(-1);
				lvi.iSubItem=0;
				lvi.iItem=0;
				for(i=-1;;i++) {
					if(i==-1) {
						if(DBGetContactSettingTString(hContact,szProto,"e-mail",&dbv))
							continue;
						lvi.pszText=TranslateT("Primary");
					}
					else {
						mir_snprintf(idstr, SIZEOF(idstr), "e-mail%d", i );
						if(DBGetContactSettingTString(hContact,szProto,idstr,&dbv))
							break;
						lvi.pszText=idstr2;
						mir_sntprintf(idstr2, SIZEOF(idstr2), _T("%d"),i+2);
					}
					ListView_InsertItem(GetDlgItem(hwndDlg,IDC_EMAILS),&lvi);
					ListView_SetItemText(GetDlgItem(hwndDlg,IDC_EMAILS),lvi.iItem,1,dbv.ptszVal);
					DBFreeVariant(&dbv);
					lvi.iItem++;
				}
				lvi.iSubItem=0;
				for(i=0;;i++) {
					lvi.lParam=i;
					mir_snprintf(idstr, SIZEOF(idstr), "Mye-mail%d",i);
					if(DBGetContactSettingTString(hContact,"UserInfo",idstr,&dbv))
						break;
					lvi.pszText=idstr2;
					mir_sntprintf(idstr2, SIZEOF(idstr2), TranslateT("Custom %d"),i+1);
					ListView_InsertItem(GetDlgItem(hwndDlg,IDC_EMAILS),&lvi);
					ListView_SetItemText(GetDlgItem(hwndDlg,IDC_EMAILS),lvi.iItem,1,dbv.ptszVal);
					DBFreeVariant(&dbv);
					lvi.iItem++;
				}
				lvi.mask=LVIF_PARAM;
				lvi.lParam=(LPARAM)(-2);
				ListView_InsertItem(GetDlgItem(hwndDlg,IDC_EMAILS),&lvi);
				//phones
				ListView_DeleteAllItems(GetDlgItem(hwndDlg,IDC_PHONES));
				lvi.mask=LVIF_TEXT|LVIF_PARAM;
				lvi.lParam=(LPARAM)(-1);
				lvi.iSubItem=0;
				lvi.iItem=0;
				if(!DBGetContactSettingTString(hContact,szProto,"Phone",&dbv)) {
					lvi.pszText=TranslateT("Primary");
					ListView_InsertItem(GetDlgItem(hwndDlg,IDC_PHONES),&lvi);
					ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PHONES),lvi.iItem,1,dbv.ptszVal);
					DBFreeVariant(&dbv);
					lvi.iItem++;
				}
				if(!DBGetContactSettingTString(hContact,szProto,"Fax",&dbv)) {
					lvi.pszText=TranslateT("Fax");
					ListView_InsertItem(GetDlgItem(hwndDlg,IDC_PHONES),&lvi);
					ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PHONES),lvi.iItem,1,dbv.ptszVal);
					DBFreeVariant(&dbv);
					lvi.iItem++;
				}
				if(!DBGetContactSettingTString(hContact,szProto,"Cellular",&dbv)) {
					lvi.pszText=TranslateT("Mobile");
					ListView_InsertItem(GetDlgItem(hwndDlg,IDC_PHONES),&lvi);
					if(lstrlenA(dbv.pszVal)>4 && !lstrcmpA(dbv.pszVal+lstrlenA(dbv.pszVal)-4," SMS")) {
						ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PHONES),lvi.iItem,2,_T("y"));
						dbv.ptszVal[lstrlen(dbv.ptszVal)-4]='\0';
					}
					ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PHONES),lvi.iItem,1,dbv.ptszVal);
					DBFreeVariant(&dbv);
					lvi.iItem++;
				}
				if(!DBGetContactSettingTString(hContact,szProto,"CompanyPhone",&dbv)) {
					lvi.pszText=TranslateT("Work Phone");
					ListView_InsertItem(GetDlgItem(hwndDlg,IDC_PHONES),&lvi);
					ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PHONES),lvi.iItem,1,dbv.ptszVal);
					DBFreeVariant(&dbv);
					lvi.iItem++;
				}
				if(!DBGetContactSettingTString(hContact,szProto,"CompanyFax",&dbv)) {
					lvi.pszText=TranslateT("Work Fax");
					ListView_InsertItem(GetDlgItem(hwndDlg,IDC_PHONES),&lvi);
					ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PHONES),lvi.iItem,1,dbv.ptszVal);
					DBFreeVariant(&dbv);
					lvi.iItem++;
				}
				lvi.iSubItem=0;
				for(i=0;;i++) {
					lvi.lParam=i;
					mir_snprintf(idstr, SIZEOF(idstr), "MyPhone%d",i);
					if(DBGetContactSettingTString(hContact,"UserInfo",idstr,&dbv))
						break;
					lvi.pszText=idstr2;
					mir_sntprintf(idstr2, SIZEOF(idstr2), TranslateT("Custom %d"),i+1);
					ListView_InsertItem(GetDlgItem(hwndDlg,IDC_PHONES),&lvi);
					if(lstrlen(dbv.ptszVal)>4 && !lstrcmp(dbv.ptszVal+lstrlen(dbv.ptszVal)-4,_T(" SMS"))) {
						ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PHONES),lvi.iItem,2,_T("y"));
						dbv.ptszVal[lstrlen(dbv.ptszVal)-4]='\0';
					}
					ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PHONES),lvi.iItem,1,dbv.ptszVal);
					DBFreeVariant(&dbv);
					lvi.iItem++;
				}
				lvi.mask=LVIF_PARAM;
				lvi.lParam=(LPARAM)(-2);
				ListView_InsertItem(GetDlgItem(hwndDlg,IDC_PHONES),&lvi);
			}
			break;
		}
		case WM_NOTIFY:
			switch (((LPNMHDR)lParam)->idFrom) {
				case 0:
					switch (((LPNMHDR)lParam)->code) {
						case PSN_INFOCHANGED:
							SendMessage(hwndDlg,M_REMAKELISTS,0,0);
							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;
									ListView_GetSubItemRect(nm->nmcd.hdr.hwndFrom,nm->nmcd.dwItemSpec,nm->iSubItem,LVIR_LABEL,&rc);
									if(nm->iSubItem==1 && nm->nmcd.hdr.idFrom==IDC_EMAILS) {
										HFONT hoFont;
										TCHAR szText[256] = {0};
										ListView_GetItemText(nm->nmcd.hdr.hwndFrom,nm->nmcd.dwItemSpec,nm->iSubItem,szText,SIZEOF(szText));
										hoFont=(HFONT)SelectObject(nm->nmcd.hdc,hEmailFont);
										SetTextColor(nm->nmcd.hdc,RGB(0,0,255));
										DrawText(nm->nmcd.hdc,szText,-1,&rc,DT_END_ELLIPSIS|DT_LEFT|DT_NOPREFIX|DT_SINGLELINE|DT_TOP);
										SelectObject(nm->nmcd.hdc,hoFont);
										SetWindowLongPtr(hwndDlg,DWLP_MSGRESULT,CDRF_SKIPDEFAULT);
										return TRUE;
									}

									HICON hIcon = NULL;
									if(nm->nmcd.lItemlParam==(LPARAM)(-2) && nm->iSubItem-3==(nm->nmcd.hdr.idFrom==IDC_PHONES))
										hIcon = LoadSkinIcon( SKINICON_OTHER_ADDCONTACT );
									else if(nm->iSubItem>1 && nm->nmcd.lItemlParam!=(LPARAM)(-1) && nm->nmcd.lItemlParam!=(LPARAM)(-2)) {
										static int iconResources[3]={SKINICON_OTHER_RENAME,SKINICON_OTHER_DELETE};
										if(nm->iSubItem==2 && nm->nmcd.hdr.idFrom==IDC_PHONES) {
											TCHAR szText[2];
											ListView_GetItemText(nm->nmcd.hdr.hwndFrom,nm->nmcd.dwItemSpec,nm->iSubItem,szText,SIZEOF(szText));
											if(szText[0]) hIcon = LoadSkinIcon( SKINICON_OTHER_SMS );
										}
										else hIcon = LoadSkinIcon( iconResources[nm->iSubItem-3+(nm->nmcd.hdr.idFrom==IDC_EMAILS)] );
									}
									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);
									IconLib_ReleaseIcon(hIcon, 0);
									SetWindowLongPtr(hwndDlg,DWLP_MSGRESULT,CDRF_SKIPDEFAULT);
									return TRUE;
								}
							}
							break;
						}
						case NM_CLICK:
						{	NMLISTVIEW *nm=(NMLISTVIEW*)lParam;
							LVITEM lvi;
							TCHAR szEmail[256];
							HANDLE hContact=(HANDLE)GetWindowLongPtr(hwndDlg,GWLP_USERDATA);
							char *szIdTemplate=nm->hdr.idFrom==IDC_PHONES?"MyPhone%d":"Mye-mail%d";
							LVHITTESTINFO hti;

							if(IsOverEmail(hwndDlg,szEmail,SIZEOF(szEmail))) {
								TCHAR szExec[264];
								mir_sntprintf(szExec, SIZEOF(szExec), _T("mailto:%s"), szEmail);
								ShellExecute(hwndDlg,_T("open"),szExec,NULL,NULL,SW_SHOW);
								break;
							}
							if(nm->iSubItem<2) break;
							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;
							lvi.mask=LVIF_PARAM;
							lvi.iItem=hti.iItem;
							lvi.iSubItem=0;
							ListView_GetItem(nm->hdr.hwndFrom,&lvi);
							if(lvi.lParam==(LPARAM)(-1)) break;
							if(lvi.lParam==(LPARAM)(-2)) {
								if(hti.iSubItem-3==(nm->hdr.idFrom==IDC_PHONES)) {
									//add
									char szNewData[256]="",idstr[33];
									int i;
									DBVARIANT dbv;
									if(IDOK!=DialogBoxParam(hMirandaInst,MAKEINTRESOURCE(nm->hdr.idFrom==IDC_PHONES?IDD_ADDPHONE:IDD_ADDEMAIL),hwndDlg,nm->hdr.idFrom==IDC_PHONES?EditUserPhoneDlgProc:EditUserEmailDlgProc,(LPARAM)szNewData))
										break;
									for(i=0;;i++) {
										mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate,i);
										if(DBGetContactSettingString(hContact,"UserInfo",idstr,&dbv)) break;
										DBFreeVariant(&dbv);
									}
									DBWriteContactSettingString(hContact,"UserInfo",idstr,szNewData);
									SendMessage(hwndDlg,M_REMAKELISTS,0,0);
								}
							}
							else {
								if(hti.iSubItem-3==(nm->hdr.idFrom==IDC_PHONES)) {
									//delete
									int i;
									char idstr[33];
									DBVARIANT dbv;
									for(i=lvi.lParam;;i++) {
										mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate,i+1);
										if(DBGetContactSettingString(hContact,"UserInfo",idstr,&dbv)) break;
										mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate,i);
										DBWriteContactSettingString(hContact,"UserInfo",idstr,dbv.pszVal);
										DBFreeVariant(&dbv);
									}
									mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate,i);
									DBDeleteContactSetting(hContact,"UserInfo",idstr);
									SendMessage(hwndDlg,M_REMAKELISTS,0,0);
								}
								else if(hti.iSubItem-2==(nm->hdr.idFrom==IDC_PHONES)) {
									//edit
									char szText[256],idstr[33];
									DBVARIANT dbv;
									mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate,lvi.lParam);
									if(DBGetContactSettingString(hContact,"UserInfo",idstr,&dbv)) break;
									lstrcpynA(szText,dbv.pszVal,SIZEOF(szText));
									DBFreeVariant(&dbv);
									if(IDOK!=DialogBoxParam(hMirandaInst,MAKEINTRESOURCE(nm->hdr.idFrom==IDC_PHONES?IDD_ADDPHONE:IDD_ADDEMAIL),hwndDlg,nm->hdr.idFrom==IDC_PHONES?EditUserPhoneDlgProc:EditUserEmailDlgProc,(LPARAM)szText))
										break;
									DBWriteContactSettingString(hContact,"UserInfo",idstr,szText);
									SendMessage(hwndDlg,M_REMAKELISTS,0,0);
								}
							}
							break;
						}
					}
					break;
			}
			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
			}
			if(IsOverEmail(hwndDlg,NULL,0)) {
				SetCursor(hHandCursor);
				SetWindowLongPtr(hwndDlg,DWLP_MSGRESULT,TRUE);
				return TRUE;
			}
			break;
		case WM_COMMAND:
			switch(LOWORD(wParam)) {
				case IDCANCEL:
					SendMessage(GetParent(hwndDlg),msg,wParam,lParam);
					break;
			}
			break;
	}
	return FALSE;
}
Ejemplo n.º 18
0
INT_PTR CALLBACK ChangeInfoDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
	ChangeInfoData* dat = (ChangeInfoData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);

	switch (msg) {
	case WM_INITDIALOG:
		TranslateDialogDefault(hwndDlg);

		dat = new ChangeInfoData();
		SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat);

		dat->hwndDlg = hwndDlg;
		dat->ppro = (CIcqProto*)lParam;
		dat->hwndList = GetDlgItem(hwndDlg, IDC_LIST);

		ListView_SetExtendedListViewStyle(dat->hwndList, LVS_EX_FULLROWSELECT);
		dat->iEditItem = -1;
		{
			dat->hListFont = (HFONT)SendMessage(dat->hwndList, WM_GETFONT, 0, 0);

			LOGFONT lf;
			GetObject(dat->hListFont, sizeof(lf), &lf);
			lf.lfHeight -= 5;
			HFONT hFont = CreateFontIndirect(&lf);
			SendMessage(dat->hwndList, WM_SETFONT, (WPARAM)hFont, 0);

			// Prepare ListView Columns
			RECT rc;
			GetClientRect(dat->hwndList, &rc);
			rc.right -= GetSystemMetrics(SM_CXVSCROLL);

			LV_COLUMN lvc = { 0 };
			lvc.mask = LVCF_WIDTH;
			lvc.cx = rc.right / 3;
			ListView_InsertColumn(dat->hwndList, 0, &lvc);
			lvc.cx = rc.right - lvc.cx;
			ListView_InsertColumn(dat->hwndList, 1, &lvc);

			// Prepare Setting Items
			LV_ITEM lvi = { 0 };
			lvi.mask = LVIF_PARAM | LVIF_TEXT;
			for (lvi.iItem = 0; lvi.iItem < settingCount; lvi.iItem++) {
				TCHAR text[MAX_PATH];
				lvi.lParam = lvi.iItem;
				lvi.pszText = text;
				utf8_to_tchar_static(setting[lvi.iItem].szDescription, text, _countof(text));
				ListView_InsertItem(dat->hwndList, &lvi);
			}
		}

		SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
		return TRUE;

	case WM_NOTIFY:
		switch (((LPNMHDR)lParam)->idFrom) {
		case 0:
			switch (((LPNMHDR)lParam)->code) {
			case PSN_PARAMCHANGED:
				dat->ppro = (CIcqProto*)((PSHNOTIFY*)lParam)->lParam;
				dat->LoadSettingsFromDb(0);
				{
					char *pwd = dat->ppro->GetUserPassword(TRUE);
					mir_strcpy(dat->Password, (pwd) ? pwd : ""); /// FIXME
				}
				break;

			case PSN_INFOCHANGED:
				dat->LoadSettingsFromDb(1);
				break;

			case PSN_KILLACTIVE:
				dat->EndStringEdit(1);
				dat->EndListEdit(1);
				break;

			case PSN_APPLY:
				if (dat->ChangesMade()) {
					if (MessageBox(hwndDlg, TranslateT("You've made some changes to your ICQ details but it has not been saved to the server. Are you sure you want to close this dialog?"), TranslateT("Change ICQ Details"), MB_YESNOCANCEL) != IDYES) {
						SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
						return TRUE;
					}
				}
			}
			break;

		case IDC_LIST:
			switch (((LPNMHDR)lParam)->code) {
			case LVN_GETDISPINFO:
				if (dat->iEditItem != -1) {
					if (dat->editTopIndex != ListView_GetTopIndex(dat->hwndList)) {
						dat->EndStringEdit(1);
						dat->EndListEdit(1);
					}
				}
				break;

			case NM_CUSTOMDRAW:
				{
					LPNMLVCUSTOMDRAW cd = (LPNMLVCUSTOMDRAW)lParam;

					switch (cd->nmcd.dwDrawStage) {
					case CDDS_PREPAINT:
						SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, CDRF_NOTIFYITEMDRAW);
						return TRUE;

					case CDDS_ITEMPREPAINT:
						if (dat->iEditItem != -1) {
							if (dat->editTopIndex != ListView_GetTopIndex(dat->hwndList)) {
								dat->EndStringEdit(1);
								dat->EndListEdit(1);
							}
						}
						{
							RECT rcItem;
							ListView_GetItemRect(dat->hwndList, cd->nmcd.dwItemSpec, &rcItem, LVIR_BOUNDS);

							if (GetWindowLongPtr(dat->hwndList, GWL_STYLE) & WS_DISABLED) {  // Disabled List
								SetTextColor(cd->nmcd.hdc, cd->clrText);
								FillRect(cd->nmcd.hdc, &rcItem, GetSysColorBrush(COLOR_3DFACE));
							}
							else if ((cd->nmcd.uItemState & CDIS_SELECTED || dat->iEditItem == (int)cd->nmcd.dwItemSpec)
										&& setting[cd->nmcd.lItemlParam].displayType != LI_DIVIDER) {  // Selected item
								SetTextColor(cd->nmcd.hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
								FillRect(cd->nmcd.hdc, &rcItem, GetSysColorBrush(COLOR_HIGHLIGHT));
							}
							else { // Unselected item
								SetTextColor(cd->nmcd.hdc, GetSysColor(COLOR_WINDOWTEXT));
								FillRect(cd->nmcd.hdc, &rcItem, GetSysColorBrush(COLOR_WINDOW));
							}

							HFONT hoFont = (HFONT)SelectObject(cd->nmcd.hdc, dat->hListFont);

							if (setting[cd->nmcd.lItemlParam].displayType == LI_DIVIDER) {
								RECT rcLine;
								SIZE textSize;
								char str[MAX_PATH];
								char *szText = ICQTranslateUtfStatic(setting[cd->nmcd.lItemlParam].szDescription, str, MAX_PATH);

								SetTextColor(cd->nmcd.hdc, GetSysColor(COLOR_3DSHADOW));
								DrawTextUtf(cd->nmcd.hdc, szText, &rcItem, DT_CENTER | DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER, &textSize);
								rcLine.top = (rcItem.top + rcItem.bottom) / 2 - 1;
								rcLine.bottom = rcLine.top + 2;
								rcLine.left = rcItem.left + 3;
								rcLine.right = (rcItem.left + rcItem.right - textSize.cx) / 2 - 3;
								DrawEdge(cd->nmcd.hdc, &rcLine, BDR_SUNKENOUTER, BF_RECT);
								rcLine.left = (rcItem.left + rcItem.right + textSize.cx) / 2 + 3;
								rcLine.right = rcItem.right - 3;
								DrawEdge(cd->nmcd.hdc, &rcLine, BDR_SUNKENOUTER, BF_RECT);
							}
							else {
								RECT rcItemDescr, rcItemValue;
								char str[MAX_PATH];

								ListView_GetSubItemRect(dat->hwndList, cd->nmcd.dwItemSpec, 0, LVIR_BOUNDS, &rcItemDescr);
								ListView_GetSubItemRect(dat->hwndList, cd->nmcd.dwItemSpec, 1, LVIR_BOUNDS, &rcItemValue);

								rcItemDescr.right = rcItemValue.left;
								rcItemDescr.left += 2;
								DrawTextUtf(cd->nmcd.hdc, ICQTranslateUtfStatic(setting[cd->nmcd.lItemlParam].szDescription, str, MAX_PATH), &rcItemDescr, DT_END_ELLIPSIS | DT_LEFT | DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER, NULL);

								dat->PaintItemSetting(cd->nmcd.hdc, &rcItemValue, cd->nmcd.lItemlParam, cd->nmcd.uItemState);
							}
							SelectObject(cd->nmcd.hdc, hoFont);

							SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, CDRF_SKIPDEFAULT);

							return TRUE;
						}
					}
				}
				break;

			case NM_CLICK:
				{
					LPNMLISTVIEW nm = (LPNMLISTVIEW)lParam;
					LV_ITEM lvi;
					RECT rc;

					dat->EndStringEdit(1);
					dat->EndListEdit(1);
					if (nm->iSubItem != 1) break;
					lvi.mask = LVIF_PARAM | LVIF_STATE;
					lvi.stateMask = 0xFFFFFFFF;
					lvi.iItem = nm->iItem; lvi.iSubItem = nm->iSubItem;
					ListView_GetItem(dat->hwndList, &lvi);
					if (!(lvi.state & LVIS_SELECTED)) break;
					ListView_EnsureVisible(dat->hwndList, lvi.iItem, FALSE);
					ListView_GetSubItemRect(dat->hwndList, lvi.iItem, lvi.iSubItem, LVIR_BOUNDS, &rc);
					dat->editTopIndex = ListView_GetTopIndex(dat->hwndList);
					switch (setting[lvi.lParam].displayType & LIM_TYPE) {
					case LI_STRING:
					case LI_LONGSTRING:
					case LI_NUMBER:
						dat->BeginStringEdit(nm->iItem, &rc, lvi.lParam, 0);
						break;
					case LI_LIST:
						dat->BeginListEdit(nm->iItem, &rc, lvi.lParam, 0);
						break;
					}
				}
				break;

			case LVN_KEYDOWN:
				{
					LPNMLVKEYDOWN nm = (LPNMLVKEYDOWN)lParam;
					LV_ITEM lvi;
					RECT rc;

					dat->EndStringEdit(1);
					dat->EndListEdit(1);
					if (nm->wVKey == VK_SPACE || nm->wVKey == VK_RETURN || nm->wVKey == VK_F2) nm->wVKey = 0;
					if (nm->wVKey && (nm->wVKey<'0' || (nm->wVKey>'9' && nm->wVKey<'A') || (nm->wVKey>'Z' && nm->wVKey < VK_NUMPAD0) || nm->wVKey >= VK_F1))
						break;
					lvi.mask = LVIF_PARAM | LVIF_STATE;
					lvi.stateMask = 0xFFFFFFFF;
					lvi.iItem = ListView_GetNextItem(dat->hwndList, -1, LVNI_ALL | LVNI_SELECTED);
					if (lvi.iItem == -1) break;
					lvi.iSubItem = 1;
					ListView_GetItem(dat->hwndList, &lvi);
					ListView_EnsureVisible(dat->hwndList, lvi.iItem, FALSE);
					ListView_GetSubItemRect(dat->hwndList, lvi.iItem, lvi.iSubItem, LVIR_BOUNDS, &rc);
					dat->editTopIndex = ListView_GetTopIndex(dat->hwndList);
					switch (setting[lvi.lParam].displayType & LIM_TYPE) {
					case LI_STRING:
					case LI_LONGSTRING:
					case LI_NUMBER:
						dat->BeginStringEdit(lvi.iItem, &rc, lvi.lParam, nm->wVKey);
						break;
					case LI_LIST:
						dat->BeginListEdit(lvi.iItem, &rc, lvi.lParam, nm->wVKey);
						break;
					}
					SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, TRUE);
				}
				return TRUE;

			case NM_KILLFOCUS:
				if (!IsStringEditWindow(GetFocus()))
					dat->EndStringEdit(1);
				if (!IsListEditWindow(GetFocus()))
					dat->EndListEdit(1);
			}
		}
		break;

	case WM_KILLFOCUS:
		dat->EndStringEdit(1);
		dat->EndListEdit(1);
		break;

	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case IDCANCEL:
			SendMessage(GetParent(hwndDlg), msg, wParam, lParam);
			break;

		case IDC_SAVE:
			if (!dat->SaveSettingsToDb(hwndDlg))
				break;

			EnableDlgItem(hwndDlg, IDC_SAVE, FALSE);
			EnableDlgItem(hwndDlg, IDC_LIST, FALSE);
			SetDlgItemText(hwndDlg, IDC_UPLOADING, TranslateT("Upload in progress..."));
			EnableDlgItem(hwndDlg, IDC_UPLOADING, TRUE);
			ShowDlgItem(hwndDlg, IDC_UPLOADING, SW_SHOW);
			dat->hAckHook = HookEventMessage(ME_PROTO_ACK, hwndDlg, DM_PROTOACK);

			if (!dat->UploadSettings()) {
				EnableDlgItem(hwndDlg, IDC_SAVE, TRUE);
				EnableDlgItem(hwndDlg, IDC_LIST, TRUE);
				ShowDlgItem(hwndDlg, IDC_UPLOADING, SW_HIDE);
				UnhookEvent(dat->hAckHook);
				dat->hAckHook = NULL;
			}
		}
		break;

	case WM_SIZE:
		if (IsIconic(hwndDlg))
			break;
		
		Utils_ResizeDialog(hwndDlg, hInst, MAKEINTRESOURCEA(IDD_INFO_CHANGEINFO), ChangeInfoDlg_Resize);
		{
			RECT rc; // update listview column widths
			GetClientRect(dat->hwndList, &rc);
			rc.right -= GetSystemMetrics(SM_CXVSCROLL);
			ListView_SetColumnWidth(dat->hwndList, 0, rc.right / 3);
			ListView_SetColumnWidth(dat->hwndList, 1, rc.right - rc.right / 3);
		}
		break;

	case DM_PROTOACK:
		{
			ACKDATA *ack = (ACKDATA*)lParam;
			int i, done;

			if (ack->type != ACKTYPE_SETINFO) break;
			if (ack->result == ACKRESULT_SUCCESS) {
				for (i = 0; i < _countof(dat->hUpload); i++)
					if (dat->hUpload[i] && ack->hProcess == dat->hUpload[i]) break;

				if (i == _countof(dat->hUpload)) break;
				dat->hUpload[i] = NULL;
				for (done = 0, i = 0; i < _countof(dat->hUpload); i++)
					done += dat->hUpload[i] == NULL;
				TCHAR buf[MAX_PATH];
				mir_sntprintf(buf, TranslateT("Upload in progress...%d%%"), 100 * done / (_countof(dat->hUpload)));
				SetDlgItemText(hwndDlg, IDC_UPLOADING, buf);
				if (done < _countof(dat->hUpload)) break;

				dat->ClearChangeFlags();
				UnhookEvent(dat->hAckHook);
				dat->hAckHook = NULL;
				EnableDlgItem(hwndDlg, IDC_LIST, TRUE);
				EnableDlgItem(hwndDlg, IDC_UPLOADING, FALSE);
				SetDlgItemText(hwndDlg, IDC_UPLOADING, TranslateT("Upload complete"));
				SendMessage(GetParent(hwndDlg), PSM_FORCECHANGED, 0, 0);
			}
			else if (ack->result == ACKRESULT_FAILED) {
				UnhookEvent(dat->hAckHook);
				dat->hAckHook = NULL;
				EnableDlgItem(hwndDlg, IDC_LIST, TRUE);
				EnableDlgItem(hwndDlg, IDC_UPLOADING, FALSE);
				SetDlgItemText(hwndDlg, IDC_UPLOADING, TranslateT("Upload FAILED"));
				SendMessage(GetParent(hwndDlg), PSM_FORCECHANGED, 0, 0);
				EnableDlgItem(hwndDlg, IDC_SAVE, TRUE);
			}
		}
		break;

	case WM_DESTROY:
		if (dat->hAckHook) {
			UnhookEvent(dat->hAckHook);
			dat->hAckHook = NULL;
		}

		DeleteObject((HFONT)SendMessage(dat->hwndList, WM_GETFONT, 0, 0));

		dat->FreeStoredDbSettings();
		SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0);
		delete dat;
		break;
	}
	return FALSE;
}
Ejemplo n.º 19
0
LRESULT CALLBACK PropsProc(HWND hwnd, UINT iMessage, WPARAM wParam,
    LPARAM lParam)
{
    NM_TREEVIEW *nm;
    RECT rs;
    LVHITTESTINFO_x hittest;
    switch (iMessage)
    {
        case WM_NOTIFY:
            nm = (NM_TREEVIEW*)lParam;
            switch (nm->hdr.code)
            {
                case LVN_GETDISPINFO:
                {
                    LV_DISPINFO *plvdi = (LV_DISPINFO*)lParam;
                    plvdi->item.mask |= LVIF_TEXT | LVIF_DI_SETITEM;
                    plvdi->item.mask &= ~LVIF_IMAGE;
                    switch (plvdi->item.iSubItem)
                    {
                    case 1:
                        if (currentPropertyFuncs)
                        {
                            char buf[256];
                            LV_ITEM item;
                            memset(&item, 0, sizeof(item));
                            item.iItem = plvdi->item.iItem;
                            item.mask = LVIF_PARAM;
                            ListView_GetItem(lvwindow, &item);
                            currentPropertyFuncs->getText(buf, lvwindow, currentPropertyData, item.lParam);
                            plvdi->item.pszText = buf;
                        }
                        else
                        {
                            plvdi->item.pszText = "";
                        }
                        break;
                    default:
                        break;
                    }
                }
                case NM_CUSTOMDRAW:
                    return CustomDraw(hwnd, (LPNMLVCUSTOMDRAW)lParam);
                case NM_CLICK:
                    GetCursorPos(&hittest.pt);
                    ScreenToClient(lvwindow, &hittest.pt);
                    if (currentPropertyWindow)
                    {
//                        PostMessage(hwnd, WM_KILLPROPSEDITOR, 0, 0);
                    }
                    else
                    {
                        ListView_SubItemHitTest(lvwindow, &hittest);
                        if (hittest.flags & LVHT_ONITEM)
                        {
                            if (hittest.iSubItem == 1)
                            {
                                RECT r;
                                LV_ITEM item;
                                memset(&item, 0, sizeof(item));
                                item.iItem = hittest.iItem;
                                item.mask = LVIF_PARAM;
                                ListView_GetItem(lvwindow, &item);
                                currentPropertyRow = item.lParam;
                                currentPropertyWindow = currentPropertyFuncs->startEdit(lvwindow, 
                                                                                        currentPropertyRow,
                                                                                        currentPropertyData);
                                if (currentPropertyWindow)
                                {
                                    SendMessage(currentPropertyWindow, WM_SETFONT, SendMessage(lvwindow, WM_GETFONT, 0, 0), 0);
                                    ListView_GetSubItemRect(lvwindow,hittest.iItem, 1, LVIR_BOUNDS, &r);
                                    SetWindowPos(currentPropertyWindow, NULL,
                                                 r.left, r.top, r.right- r.left, r.bottom - r.top,
                                                 SWP_NOZORDER | SWP_SHOWWINDOW);
                                    SetFocus(currentPropertyWindow);
                                    // well it might not be an edit window in which case this should be ignored
                                    SendMessage(currentPropertyWindow, EM_SETSEL, 0, -1);
                                    // well it might not be a combo box in which case this should be ignored
                                    SendMessage(currentPropertyWindow, CB_SHOWDROPDOWN, 1, 0);
                                }
                            }
                        }
                    }
                    break;
                case NM_DBLCLK:
                    GetCursorPos(&hittest.pt);
                    ScreenToClient(lvwindow, &hittest.pt);
                    return 0;
                case NM_RCLICK:
                    GetCursorPos(&hittest.pt);
                    ScreenToClient(lvwindow, &hittest.pt);
                    break;
            }
            break;
        case WM_KILLPROPSEDITOR:
            if (currentPropertyFuncs)
            {
                currentPropertyFuncs->finishEdit(lvwindow, currentPropertyRow, currentPropertyWindow, currentPropertyData);
                currentPropertyWindow = NULL;
            }
            break;
        case WM_CREATE:
            GetClientRect(hwnd, &rs);
            lvwindow = CreateWindowEx(0, WC_LISTVIEW, "", WS_VISIBLE |
                WS_CHILD | LVS_REPORT | LVS_SINGLESEL,
                0, 0, rs.right, rs.bottom, hwnd, (HMENU)ID_TREEVIEW,
                hInstance, NULL);
            font = CreateFontIndirect(&fontdata);
            SetListViewColumns();
            break;
        case WM_SIZE:
            MoveWindow(lvwindow, 0, 0, LOWORD(lParam), HIWORD(lParam), 0);
            ResizeListViewColumns();
            break;
        case WM_DESTROY:
//            ReleasePropInfo();
            DestroyWindow(lvwindow);
            break;
    }
    return DefWindowProc(hwnd, iMessage, wParam, lParam);
}
Ejemplo n.º 20
0
	RECT CTableEditHelperV2_ListView::TableEdit_GetItemRect(t_size item, t_size subItem) const {
		RECT rc;
		WIN32_OP_D( ListView_GetSubItemRect(TableEdit_GetParentWnd(),item,subItem,LVIR_LABEL,&rc) );
		return rc;
	}
Ejemplo n.º 21
0
LRESULT CALLBACK stream_WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    RECT		rect ;
    int cxClient, cyClient;
    static HMENU	hMenu ;
    POINT point ;
    int ret, idx;
    TCHAR  buf[64];
    char file_name[MAX_FILE_PATH_LEN];

    static int edit_iItem=-1 ;
    static int edit_iSubItem;

     LVITEM lv_item;
    switch (message)
    {
        case WM_CREATE:
            hwnd_stream= hwnd;
            hMenu = LoadMenu (g_hInstance, TEXT("my_popup_menu")) ;
            hMenu = GetSubMenu (hMenu, 0) ;

            hwnd_dynamic_edit=CreateWindow (TEXT("edit"), TEXT(""),
                WS_CHILD|ES_AUTOHSCROLL,
                CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                hwnd, (HMENU)ID_DYNAMIC_EDIT, g_hInstance, NULL) ;

            SendMessage(hwnd_dynamic_edit, WM_SETFONT, (WPARAM)char_font_2, 0); 

            hwnd_lv = CreateListView(hwnd);
            //InitListViewImageLists(hwnd_lv);
            InitListViewColumns(hwnd_lv);
            lv_row_color_init();
            old_lv_proc = (WNDPROC) SetWindowLong (hwnd_lv, 
                                 	GWL_WNDPROC, (LONG)my_lv_proc) ;

            ShowWindow(hwnd_lv, 1) ;
            refresh_window(hwnd_lv) ;

           add_tip(hwndTip, hwnd_lv, TEXT("点击鼠标右键进行操作"));

            return 0 ;

        case WM_SIZE:
      		cxClient = LOWORD (lParam) ;
      		cyClient = HIWORD (lParam) ;

            MoveWindow(hwnd_lv, 	0, 0,
                cxClient, cyClient, TRUE) ;

            return 0 ;

case WM_NOTIFY:
{

   NMHDR *pt_nmhdr=(void *)lParam;
   switch(LOWORD(wParam))
   { 
     case ID_LV:

     // if code == NM_CLICK - Single click on an item
     if(pt_nmhdr->code == NM_CLICK || pt_nmhdr->code == NM_DBLCLK) 
     {
        int iItem = ((LPNMITEMACTIVATE)lParam)->iItem;
        int iSubItem=((LPNMITEMACTIVATE)lParam)->iSubItem;

        if (iItem>=0 && ((iSubItem>=3 && iSubItem<=5) || iSubItem==7)) 
        {

            ListView_GetSubItemRect(hwnd_lv,iItem,iSubItem,LVIR_LABEL,&rect);
            ListView_GetItemText(hwnd_lv, iItem, iSubItem, buf, sizeof(buf));
            MoveWindow	(hwnd_dynamic_edit
                ,rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, TRUE);
            SetWindowText(hwnd_dynamic_edit, buf);
            ShowWindow (hwnd_dynamic_edit, 1) ;
            SetFocus(hwnd_dynamic_edit);
            SendMessage(hwnd_dynamic_edit, EM_SETSEL, (WPARAM)0, (LPARAM)-1);

            edit_iItem = iItem;
            edit_iSubItem = iSubItem;

        }

            return 0;
     }
    else if (pt_nmhdr->code == NM_RCLICK)
    {
        point = ((LPNMITEMACTIVATE)lParam)->ptAction;
        ListView_GetItem(hwnd_lv, &lv_item);

        ClientToScreen (hwnd_lv, &point) ;
  		TrackPopupMenu (hMenu, TPM_LEFTBUTTON, point.x, point.y, 0, hwnd_stream, NULL) ;
        return 0;

    }
    else if (pt_nmhdr->code == LVN_ITEMCHANGED)
    {
        if (!init_over) break;
        if (lv_in_op)   break;
        //if((((LPNMLISTVIEW)lParam)->uOldState&LVIS_STATEIMAGEMASK) != 
        //    (((LPNMLISTVIEW)lParam)->uNewState&LVIS_STATEIMAGEMASK)) 
        {
            int iItem = ((LPNMITEMACTIVATE)lParam)->iItem;
            int selected = ListView_GetCheckState(hwnd_lv, iItem);

            if (g_apt_streams[iItem]->selected!=selected)
            {
                doc_modified=1;
                g_apt_streams[iItem]->selected=selected;
                update_statusbar();
            }
        }
        return 0;

    }
    
    break;

   }

   break;
}

        case 	WM_COMMAND:
            switch (LOWORD(wParam))
            {
                  
                case    IDM_STREAM_NEW:
                    init_stream(&gt_edit_stream);
                    gt_edit_stream.len=gat_sample_pkts[0].len;
                    memcpy(gt_edit_stream.data, gat_sample_pkts[0].pkt_data, gt_edit_stream.len);

                    ret=DialogBox(g_hInstance, TEXT("STREAM_EDIT_DLG"), hwnd, StreamEditDlgProc);
                    if (IDOK==ret)
                    {
                        add_stream(&gt_edit_stream);
                        re_populate_items();
                    }
               	return 0 ;

                case    IDM_STREAM_NEW_HEX:
                {
                    int len;
                    char buf[MAX_PACKET_LEN];
                    if (get_open_file_name(file_name, hwnd, ALL_FILE_FILTER))
                        return 0;

                    len = read_file_to_buf(buf, sizeof(buf)-1, file_name);
                    if (len>0)
                        add_stream_from_hex_text(buf, len);
                    else
                        err_msg_box("读取文件内容失败");
                   	return 0 ;
                }

                case    IDM_STREAM_NEW_BIN:
                {
                    int len;
                    char buf[MAX_PACKET_LEN];
                    if (get_open_file_name(file_name, hwnd, ALL_FILE_FILTER))
                        return 0;

                    len = read_file_to_buf(buf, sizeof(buf)-1, file_name);
                    if (len>0)
                        add_stream_from_raw_data(buf, len);
                    else
                        err_msg_box("读取文件内容失败");
                   	return 0 ;
                }

                case    IDM_STREAM_NEW_PCAP:
                {
                    if (get_open_file_name(file_name, hwnd, PCAP_FILE_FILTER))
                        return 0;
                    add_stream_from_pcap(file_name);
                   	return 0 ;
                }
                                
                case    IDM_STREAM_DEL:
                    idx=GetIndex(hwnd_lv);
       				//ListView_DeleteItem(hwnd_lv, idx);
                    delete_stream(idx);
                    re_populate_items();
                    update_statusbar();
       				return 0 ;
                case    IDM_STREAM_EDIT:
                    cur_strm_idx=GetIndex(hwnd_lv);
                    if (cur_strm_idx<0) return 0;
                    cpy_stream(&gt_edit_stream, g_apt_streams[cur_strm_idx]);
                    ret=DialogBox(g_hInstance, TEXT("STREAM_EDIT_DLG"), hwnd, StreamEditDlgProc);
                    if (IDOK==ret)
                    {
                        doc_modified=1;
                        cpy_stream(g_apt_streams[cur_strm_idx], &gt_edit_stream);
                        re_populate_items();
                    }
       				//ListView_DeleteAllItems(hwnd_lv);
       				return 0 ;
                case    IDM_STREAM_DEL_SEL:
       				//DelSel(hwnd_lv);
                    delete_sel_stream();
                    re_populate_items();
                    update_statusbar();
       				return 0 ;

                case    IDM_STREAM_SEL_ALL:
       				SelAll(hwnd_lv);
       				return 0 ;

                case    IDM_STREAM_SEL_RVS:
       				SelRvs(hwnd_lv);
       				return 0 ;
                    
                case    IDM_STREAM_COPY:
       				copy_idx = GetIndex(hwnd_lv);
       				return 0 ;

                case    IDM_STREAM_PASTE:
       				cpy_stream(&gt_edit_stream, g_apt_streams[copy_idx]);
                    add_stream(&gt_edit_stream);
                    re_populate_items();
       				return 0 ;

                case    IDM_STREAM_MAKE_FRAGS:
                {
       				ret=DialogBox(g_hInstance, TEXT("FRAG_DLG"), hwnd, FragDlgProc);
       				return 0 ;
                }

                case    IDM_STREAM_SEL2PCAP:
                {
                    ret=get_save_file_name(file_name, hwnd, PCAP_FILE_FILTER, PCAP_FILE_SUFFIX);
                    if (ret) return 0 ;

       				stream2dump(file_name);
                    update_pcap_file_history(file_name);
       				return 0 ;
                }

                case    IDM_STREAM_2_BIN:
                {
                    ret=get_save_file_name(file_name, hwnd, BIN_FILE_FILTER, BIN_FILE_SUFFIX);
                    if (ret) return 0 ;

       				stream_2_bin(file_name);
       				return 0 ;
                }

                case    IDM_STREAM_2_TEXT:
                {
                    ret=get_save_file_name(file_name, hwnd, TEXT_FILE_FILTER, TEXT_FILE_SUFFIX);
                    if (ret) return 0 ;

       				stream_2_text(file_name);
       				return 0 ;
                }
                
                case    ID_DYNAMIC_EDIT:
       				if (HIWORD(wParam)==EN_KILLFOCUS)
                    {

            update_grid_from_edit(edit_iItem, edit_iSubItem);
            edit_iItem=-1;

           				return 0 ;
                    }

            }
            break;

case   WM_KEYDOWN:
    if (VK_RETURN==wParam)
    {

        SetFocus(hwnd);

         return 0;

    }
    break;

        case 	WM_INITMENUPOPUP:
        {
            int idx=GetIndex(hwnd_lv);
            t_stream *pt_stream = g_apt_streams[idx];
            int sel_cnt=GetSelCnt(hwnd_lv);
            int item_cnt=ListView_GetItemCount(hwnd_lv);
            if (lParam == 0)
            {
                UINT add_stream_menu_state = nr_cur_stream<MAX_STREAM_NUM ? MF_ENABLED : MF_GRAYED;
                EnableMenuItem ((HMENU) wParam, IDM_STREAM_NEW, add_stream_menu_state);
                EnableMenuItem ((HMENU) wParam, IDM_STREAM_NEW_HEX, add_stream_menu_state);
                EnableMenuItem ((HMENU) wParam, IDM_STREAM_NEW_BIN, add_stream_menu_state);
                EnableMenuItem ((HMENU) wParam, IDM_STREAM_NEW_PCAP, add_stream_menu_state);
                EnableMenuItem ((HMENU) wParam, IDM_STREAM_EDIT, idx>=0 ? MF_ENABLED : MF_GRAYED);
                EnableMenuItem ((HMENU) wParam, IDM_STREAM_DEL, idx>=0 ? MF_ENABLED : MF_GRAYED);
                EnableMenuItem ((HMENU) wParam, IDM_STREAM_COPY, idx>=0 ? MF_ENABLED : MF_GRAYED);
                EnableMenuItem ((HMENU) wParam, IDM_STREAM_PASTE, copy_idx>=0 && item_cnt>copy_idx ? MF_ENABLED : MF_GRAYED);
                EnableMenuItem ((HMENU) wParam, IDM_STREAM_DEL_SEL, sel_cnt ? MF_ENABLED : MF_GRAYED);
                EnableMenuItem ((HMENU) wParam, IDM_STREAM_SEL_ALL, item_cnt ? MF_ENABLED : MF_GRAYED);
                EnableMenuItem ((HMENU) wParam, IDM_STREAM_SEL_RVS, item_cnt ? MF_ENABLED : MF_GRAYED);
                EnableMenuItem ((HMENU) wParam, IDM_STREAM_MAKE_FRAGS, idx>=0&&stream_fragable(pt_stream) ? MF_ENABLED : MF_GRAYED);
                EnableMenuItem ((HMENU) wParam, IDM_STREAM_SEL2PCAP, sel_cnt ? MF_ENABLED : MF_GRAYED);
                EnableMenuItem ((HMENU) wParam, IDM_STREAM_2_BIN, idx>=0 ? MF_ENABLED : MF_GRAYED);
                EnableMenuItem ((HMENU) wParam, IDM_STREAM_2_TEXT, idx>=0 ? MF_ENABLED : MF_GRAYED);

                return 0;

            }

            break;
        }

    }
    
    return DefWindowProc (hwnd, message, wParam, lParam) ;
}
Ejemplo n.º 22
0
/**
 * name:	ProfileList_BeginLabelEdit
 * desc:	create an edit control to edit the label of the selected item
 * param:	pList	 - handle to listview control's info structure
 *			iItem	 - item index
 *			iSubItem - subitem (column) index
 * return:	handle to the edit control
 **/
static HWND ProfileList_BeginLabelEdit(LPLISTCTRL pList, INT iItem, INT iSubItem)
{
	LVITEM lvi;
	LPLCITEM pItem;
	HANDLE hContact;
	RECT rcList;
	
	if (!PtrIsValid(pList)) 
		return NULL;
	if (pList->labelEdit.hEdit)
		ProfileList_EndLabelEdit(pList, FALSE);

	lvi.mask = LVIF_PARAM|LVIF_STATE;
	lvi.stateMask = 0xFFFFFFFF;
	lvi.iItem = iItem;
	lvi.iSubItem = iSubItem;

	if (!ListView_GetItem(pList->hList, &lvi))
		return NULL;

	pItem = (LPLCITEM)lvi.lParam;

	PSGetContact(GetParent(pList->hList), hContact);
			
	// do not edit deviders or protocol based contact information
	if (!(lvi.state & LVIS_SELECTED) || !PtrIsValid(pItem) || (hContact && (pItem->wFlags & CTRLF_HASPROTO))) 
		return NULL;

	ListView_EnsureVisible(pList->hList, iItem, FALSE);
	ListView_GetSubItemRect(pList->hList, iItem, iSubItem, LVIR_BOUNDS, &pList->labelEdit.rcCombo);
		
	if (lvi.iSubItem == 0) {
		RECT rc2;
		
		ListView_GetSubItemRect(pList->hList, iItem, 1, LVIR_BOUNDS, &rc2);
		pList->labelEdit.rcCombo.right = rc2.left;
	}
	GetClientRect(pList->hList, &rcList);
	pList->labelEdit.rcCombo.right = min(pList->labelEdit.rcCombo.right, rcList.right);
	pList->labelEdit.rcCombo.left = max(pList->labelEdit.rcCombo.left, rcList.left);
	InflateRect(&pList->labelEdit.rcCombo, -1, -1);

	// create the button control for the combobox
	if (!iSubItem && pItem->idstrList) {
		pList->labelEdit.hBtn = CreateWindowEx(WS_EX_NOPARENTNOTIFY, UINFOBUTTONCLASS, NULL, 
					WS_VISIBLE|WS_CHILD|MBS_DOWNARROW,
					pList->labelEdit.rcCombo.right - (pList->labelEdit.rcCombo.bottom - pList->labelEdit.rcCombo.top), pList->labelEdit.rcCombo.top,
					pList->labelEdit.rcCombo.bottom - pList->labelEdit.rcCombo.top,
					pList->labelEdit.rcCombo.bottom - pList->labelEdit.rcCombo.top,
					pList->hList, NULL, ghInst, NULL);
		if (pList->labelEdit.hBtn) {
			SetWindowLongPtr(pList->labelEdit.hBtn, GWLP_ID, BTN_EDIT);
			pList->labelEdit.rcCombo.right -= pList->labelEdit.rcCombo.bottom - pList->labelEdit.rcCombo.top;
		}
	}
	else {
		pList->labelEdit.rcCombo.bottom = 3 * pList->labelEdit.rcCombo.bottom - 2 * pList->labelEdit.rcCombo.top;
		if (rcList.bottom < pList->labelEdit.rcCombo.bottom) {
			OffsetRect(&pList->labelEdit.rcCombo, 0, rcList.bottom - pList->labelEdit.rcCombo.bottom - 2);
		}
	}
	// create the edit control
	pList->labelEdit.hEdit = CreateWindowEx(WS_EX_NOPARENTNOTIFY|WS_EX_CLIENTEDGE,
				_T("EDIT"),
				(!iSubItem && pItem->idstrList && pItem->iListItem > 0 && pItem->iListItem < pItem->idstrListCount) 
					? pItem->idstrList[pItem->iListItem].ptszTranslated
					: (iSubItem >= 0 && iSubItem < 2 && pItem->pszText[iSubItem] && *pItem->pszText[iSubItem])
						? pItem->pszText[iSubItem] 
						: _T(""), 
						WS_VISIBLE|WS_CHILD|(iSubItem ? (WS_VSCROLL|ES_MULTILINE|ES_AUTOVSCROLL) : ES_AUTOHSCROLL),
				pList->labelEdit.rcCombo.left, pList->labelEdit.rcCombo.top,
				pList->labelEdit.rcCombo.right - pList->labelEdit.rcCombo.left,
				pList->labelEdit.rcCombo.bottom - pList->labelEdit.rcCombo.top,
				pList->hList, NULL, ghInst, NULL);
	if (!pList->labelEdit.hEdit)
		return NULL;
	SendMessage(pList->labelEdit.hEdit, WM_SETFONT, (WPARAM)(pList->hFont), 0);
	SendMessage(pList->labelEdit.hEdit, EM_SETSEL, 0, (LPARAM)-1);
	SetUserData(pList->labelEdit.hEdit, pList);
	pList->labelEdit.dropDown.iItem = pItem->iListItem;
	pList->labelEdit.iItem = iItem;
	pList->labelEdit.iSubItem = iSubItem;
	pList->labelEdit.iTopIndex = ListView_GetTopIndex(pList->hList);
	pList->labelEdit.pItem = pItem;
	SetFocus(pList->labelEdit.hEdit);
	OldEditProc = (WNDPROC)SetWindowLongPtr(pList->labelEdit.hEdit, GWLP_WNDPROC, (LONG_PTR)ProfileList_LabelEditProc);
	return pList->labelEdit.hEdit;
}
Ejemplo n.º 23
0
static INT_PTR CALLBACK JabberMucJidListDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
	JABBER_MUC_JIDLIST_INFO* dat = (JABBER_MUC_JIDLIST_INFO*)GetWindowLongPtr( hwndDlg, GWLP_USERDATA );

	switch( msg ) {
	case WM_INITDIALOG:
		{
			LVCOLUMN lvc;
			RECT rc;
			HWND hwndList;

			TranslateDialogDefault( hwndDlg );

			hwndList = GetDlgItem( hwndDlg, IDC_LIST );
			ListView_SetExtendedListViewStyle(hwndList, LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
			GetClientRect( hwndList, &rc );
			//rc.right -= GetSystemMetrics( SM_CXVSCROLL );
			lvc.mask = LVCF_WIDTH;
			lvc.cx = rc.right - 20;
			ListView_InsertColumn( hwndList, 0, &lvc );
			lvc.cx = 20;
			ListView_InsertColumn( hwndList, 1, &lvc );
			SendMessage( hwndDlg, WM_JABBER_REFRESH, 0, lParam );
			dat = (JABBER_MUC_JIDLIST_INFO*)lParam;

			static struct
			{
				int idc;
				char *title;
				char *icon;
				bool push;
			} buttons[] =
			{
				{IDC_BTN_FILTERAPPLY,	"Apply filter",		"sd_filter_apply",	false},
				{IDC_BTN_FILTERRESET,	"Reset filter",		"sd_filter_reset",	false},
			};
			for (int i = 0; i < SIZEOF(buttons); ++i)
			{
				SendDlgItemMessage(hwndDlg, buttons[i].idc, BM_SETIMAGE, IMAGE_ICON, (LPARAM)dat->ppro->LoadIconEx(buttons[i].icon));
				SendDlgItemMessage(hwndDlg, buttons[i].idc, BUTTONSETASFLATBTN, 0, 0);
				SendDlgItemMessage(hwndDlg, buttons[i].idc, BUTTONADDTOOLTIP, (WPARAM)buttons[i].title, 0);
				if (buttons[i].push)
					SendDlgItemMessage(hwndDlg, buttons[i].idc, BUTTONSETASPUSHBTN, 0, 0);
			}

			Utils_RestoreWindowPosition(hwndDlg, NULL, dat->ppro->m_szModuleName, "jidListWnd_");
		}
		return TRUE;
	case WM_SIZE:
		{
			UTILRESIZEDIALOG urd = {0};
			urd.cbSize = sizeof(urd);
			urd.hInstance = hInst;
			urd.hwndDlg = hwndDlg;
			urd.lpTemplate = MAKEINTRESOURCEA(IDD_JIDLIST);
			urd.pfnResizer = sttJidListResizer;
			CallService(MS_UTILS_RESIZEDIALOG, 0, (LPARAM)&urd);

			RECT listrc;
			LVCOLUMN lvc;
			HWND hwndList = GetDlgItem( hwndDlg, IDC_LIST );
			GetClientRect( hwndList, &listrc );
			lvc.mask = LVCF_WIDTH;
			//listrc.right -= GetSystemMetrics( SM_CXVSCROLL );
			lvc.cx = listrc.right - 20;
			SendMessage(hwndList, LVM_SETCOLUMN, 0, (LPARAM)&lvc);
			break;
		}
		break;

	case WM_JABBER_REFRESH:
		{
			// lParam is ( JABBER_MUC_JIDLIST_INFO * )
			HXML iqNode, queryNode;
			const TCHAR* from;
			TCHAR title[256];

			// Clear current GWL_USERDATA, if any
			if ( dat != NULL )
				delete dat;

			// Set new GWL_USERDATA
			dat = ( JABBER_MUC_JIDLIST_INFO * ) lParam;
			SetWindowLongPtr( hwndDlg, GWLP_USERDATA, ( LONG_PTR ) dat );

			// Populate displayed list from iqNode
			lstrcpyn( title, TranslateT( "JID List" ), SIZEOF( title ));
			if (( dat=( JABBER_MUC_JIDLIST_INFO * ) lParam ) != NULL ) {
				if (( iqNode = dat->iqNode ) != NULL ) {
					if (( from = xmlGetAttrValue( iqNode, _T("from"))) != NULL ) {
						dat->roomJid = mir_tstrdup( from );

						if (( queryNode = xmlGetChild( iqNode , "query" )) != NULL ) {
							TCHAR* localFrom = mir_tstrdup( from );
							mir_sntprintf( title, SIZEOF( title ), TranslateT("%s, %d items (%s)"),
								( dat->type == MUC_VOICELIST ) ? TranslateT( "Voice List" ) :
								( dat->type == MUC_MEMBERLIST ) ? TranslateT( "Member List" ) :
								( dat->type == MUC_MODERATORLIST ) ? TranslateT( "Moderator List" ) :
								( dat->type == MUC_BANLIST ) ? TranslateT( "Ban List" ) :
								( dat->type == MUC_ADMINLIST ) ? TranslateT( "Admin List" ) :
								( dat->type == MUC_OWNERLIST ) ? TranslateT( "Owner List" ) :
								TranslateT( "JID List" ), xmlGetChildCount(queryNode), localFrom );
							mir_free( localFrom );
			}	}	}	}
			SetWindowText( hwndDlg, title );

			SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_FILTER), GWLP_USERDATA, 0);
			sttFillJidList(hwndDlg);
		}
		break;
	case WM_NOTIFY:
		if (( ( LPNMHDR )lParam )->idFrom == IDC_LIST ) {
			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->iSubItem == 1 ) {
								if( nm->nmcd.lItemlParam == ( LPARAM )( -1 ))
									hIcon = ( HICON )LoadImage( hInst, MAKEINTRESOURCE( IDI_ADDCONTACT ), IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0 );
								else
									hIcon = ( HICON )LoadImage( hInst, MAKEINTRESOURCE( IDI_DELETE ), IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0 );
								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, GetSysColorBrush(COLOR_WINDOW), DI_NORMAL );
								DestroyIcon( hIcon );
								SetWindowLongPtr( hwndDlg, DWLP_MSGRESULT, CDRF_SKIPDEFAULT );
								return TRUE;
				}	}	}	}
				break;
			case NM_CLICK:
				{
					NMLISTVIEW *nm = ( NMLISTVIEW * ) lParam;
					LVITEM lvi;
					LVHITTESTINFO hti;
					TCHAR text[128];

					if ( nm->iSubItem < 1 )
						break;

					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;

					if ( hti.iSubItem != 1 )
						break;

					lvi.mask = LVIF_PARAM | LVIF_TEXT;
					lvi.iItem = hti.iItem;
					lvi.iSubItem = 0;
					lvi.pszText = text;
					lvi.cchTextMax = sizeof( text );
					ListView_GetItem( nm->hdr.hwndFrom, &lvi );
					if ( lvi.lParam == ( LPARAM )( -1 )) {
						TCHAR szBuffer[ 1024 ];
						_tcscpy( szBuffer, dat->type2str());
						if ( !dat->ppro->EnterString(szBuffer, SIZEOF(szBuffer), NULL, JES_COMBO, "gcAddNick_"))
							break;

						// Trim leading and trailing whitespaces
						TCHAR *p = szBuffer, *q;
						for ( p = szBuffer; *p!='\0' && isspace( BYTE( *p )); p++);
						for ( q = p; *q!='\0' && !isspace( BYTE( *q )); q++);
						if (*q != '\0') *q = '\0';
						if (*p == '\0')
							break;
						TCHAR rsn[ 1024 ];
						_tcscpy( rsn, dat->type2str());
						if ( dat->type == MUC_BANLIST ) {
							dat->ppro->EnterString(rsn, SIZEOF(rsn), TranslateT("Reason to ban") , JES_COMBO, "gcAddReason_");
							if ( szBuffer )
								dat->ppro->AddMucListItem( dat, p , rsn);
							else
								dat->ppro->AddMucListItem( dat, p );
						}
						else dat->ppro->AddMucListItem( dat, p );
					}
					else {
						//delete
						TCHAR msgText[128];

						mir_sntprintf( msgText, SIZEOF( msgText ), _T("%s %s?"), TranslateT( "Removing" ), text );
						if ( MessageBox( hwndDlg, msgText, dat->type2str(), MB_YESNO|MB_SETFOREGROUND ) == IDYES ) {
							dat->ppro->DeleteMucListItem( dat, ( TCHAR* )lvi.lParam );
							mir_free(( void * )lvi.lParam );
							ListView_DeleteItem( nm->hdr.hwndFrom, hti.iItem );
				}	}	}
				break;
			}
			break;
		}
		break;
	case WM_COMMAND:
		if ((LOWORD(wParam) == IDC_BTN_FILTERAPPLY) ||
			((LOWORD(wParam) == IDOK) && (GetFocus() == GetDlgItem(hwndDlg, IDC_FILTER))))
		{
			SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_FILTER), GWLP_USERDATA, 1);
			sttFillJidList(hwndDlg);
		} else
		if ((LOWORD(wParam) == IDC_BTN_FILTERRESET) ||
			((LOWORD(wParam) == IDCANCEL) && (GetFocus() == GetDlgItem(hwndDlg, IDC_FILTER))))
		{
			SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_FILTER), GWLP_USERDATA, 0);
			sttFillJidList(hwndDlg);
		}
		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_CLOSE:
		{
			HWND hwndList;
			int count, i;
			LVITEM lvi;

			// Free lParam of the displayed list items
			hwndList = GetDlgItem( hwndDlg, IDC_LIST );
			count = ListView_GetItemCount( hwndList );
			lvi.mask = LVIF_PARAM;
			lvi.iSubItem = 0;
			for ( i=0; i<count; i++ ) {
				lvi.iItem = i;
				if ( ListView_GetItem( hwndList, &lvi ) == TRUE ) {
					if ( lvi.lParam!=( LPARAM )( -1 ) && lvi.lParam!=( LPARAM )( NULL )) {
						mir_free(( void * ) lvi.lParam );
					}
				}
			}
			ListView_DeleteAllItems( hwndList );

			CJabberProto* ppro = dat->ppro;
			switch ( dat->type ) {
			case MUC_VOICELIST:
				ppro->m_hwndMucVoiceList = NULL;
				break;
			case MUC_MEMBERLIST:
				ppro->m_hwndMucMemberList = NULL;
				break;
			case MUC_MODERATORLIST:
				ppro->m_hwndMucModeratorList = NULL;
				break;
			case MUC_BANLIST:
				ppro->m_hwndMucBanList = NULL;
				break;
			case MUC_ADMINLIST:
				ppro->m_hwndMucAdminList = NULL;
				break;
			case MUC_OWNERLIST:
				ppro->m_hwndMucOwnerList = NULL;
				break;
			}

			DestroyWindow( hwndDlg );
		}
		break;

	case WM_DESTROY:
		// Clear GWL_USERDATA
		if ( dat != NULL ) {
			Utils_SaveWindowPosition(hwndDlg, NULL, dat->ppro->m_szModuleName, "jidListWnd_");
			delete dat;
		}
		break;
	}
	return FALSE;
}
Ejemplo n.º 24
0
LRESULT CALLBACK StringTableDrawProc(HWND hwnd, UINT iMessage, WPARAM wParam,
    LPARAM lParam)
{
    static HCURSOR origCurs;
    RECT r;
    LPCREATESTRUCT createStruct;
    struct resRes *stringTableData;
    LVHITTESTINFO hittest;
    int i;
    struct stringTableUndo *undo;
    switch (iMessage)
    {
        case WM_MDIACTIVATE:
            if ((HWND)lParam == hwnd)
            {
                doMaximize();
            }
            break;
        case WM_SETFOCUS:
            stringTableData = (struct resRes *)GetWindowLong(hwnd, 0);
            SetFocus(stringTableData->gd.childWindow);
            break;
        case WM_NOTIFY:
                switch (((LPNMHDR)lParam)->code)
                {
                    case LVN_GETDISPINFO:
                    {
                        LV_DISPINFO *plvdi = (LV_DISPINFO*)lParam;
                        STRINGS *strings;
                        plvdi->item.mask |= LVIF_TEXT | LVIF_DI_SETITEM;
                        plvdi->item.mask &= ~LVIF_IMAGE;
                        strings = (STRINGS *)plvdi->item.lParam;
                        switch (plvdi->item.iSubItem)
                        {
                            char id[256];
                        case 1:
                            FormatVersionString(id, strings->string, strings->length);//FIXME id
                            plvdi->item.pszText = id;
                            break;
                        }
                        break;
                    }
                    case LVN_KEYDOWN:
                    {
                        stringTableData = (struct resRes *)GetWindowLong(hwnd, 0);
                        SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(ID_EDIT, CBN_KILLFOCUS), 0);
                        switch (((LPNMLVKEYDOWN)lParam)->wVKey)
                        {
                            case 'S':
                                if (GetKeyState(VK_CONTROL) &0x80000000)
                                {
                                    PostMessage(hwnd, WM_COMMAND, IDM_SAVE, 0);
                                    return TRUE;
                                }
                                
                                break;
                            case 'Z':
                                if (GetKeyState(VK_CONTROL) &0x80000000)
                                {
                                    PostMessage(hwnd, WM_COMMAND, IDM_UNDO, 0);
                                    return TRUE;
                                }
                                break;
                            case VK_INSERT:
                                stringTableData->gd.selectedRow = ListView_GetNextItem(stringTableData->gd.childWindow, -1, LVNI_SELECTED);
                                PostMessage(hwnd, WM_COMMAND, IDM_INSERT, 0);
                                return TRUE;
                            case VK_DELETE:
                                stringTableData->gd.selectedRow = ListView_GetNextItem(stringTableData->gd.childWindow, -1, LVNI_SELECTED);
                                PostMessage(hwnd, WM_COMMAND, IDM_DELETE, 0);
                                return TRUE;
                        }
                    }
                        break;
                    case NM_CLICK:
                    {
                            SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(ID_EDIT, CBN_KILLFOCUS), 0);
                    }
                        break;
                    case NM_RCLICK:
                    {
                        POINT pt;
                        stringTableData = (struct resRes *)GetWindowLong(hwnd, 0);
                        GetCursorPos(&hittest.pt);
                        pt = hittest.pt;
                        ScreenToClient(stringTableData->gd.childWindow, &hittest.pt);
                        if (ListView_HitTest(stringTableData->gd.childWindow, &hittest) < 0)
                        {
                            hittest.iItem = ListView_GetItemCount(stringTableData->gd.childWindow);
                            hittest.iSubItem = 0;
                        }
                        {
                            HMENU menu, popup;
                            SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(ID_EDIT, CBN_KILLFOCUS), 0);
                            menu = LoadMenuGeneric(hInstance, "RESSTRINGSMENU");
                            stringTableData = (struct resRes *)GetWindowLong(hwnd, 0);
                            stringTableData->gd.selectedRow = hittest.iItem;
                            stringTableData->gd.selectedColumn = hittest.iSubItem;
                            popup = GetSubMenu(menu, 0);
                            InsertBitmapsInMenu(popup);
                            TrackPopupMenuEx(popup, TPM_TOPALIGN | TPM_LEFTALIGN | TPM_LEFTBUTTON, pt.x,
                                pt.y, hwnd, NULL);
                            DestroyMenu(menu);
                        }
                        return 1;
                    }
                        break;
                    case NM_DBLCLK:
                        stringTableData = (struct resRes *)GetWindowLong(hwnd, 0);
                        GetCursorPos(&hittest.pt);
                        ScreenToClient(stringTableData->gd.childWindow, &hittest.pt);
                        if (ListView_SubItemHitTest(stringTableData->gd.childWindow, &hittest) >= 0)
                        {
                            stringTableData = (struct resRes *)GetWindowLong(hwnd, 0);
                            stringTableData->gd.selectedRow = hittest.iItem;
                            stringTableData->gd.selectedColumn = hittest.iSubItem;
                            PostMessage(hwnd, WM_HANDLEDBLCLICK, 0, 0);
                        }
                        break;
                    case NM_SETFOCUS:
                        stringTableData = (struct resRes *)GetWindowLong(hwnd, 0);
                        SetResourceProperties(stringTableData, &accFuncs);
                        break;
                    case NM_KILLFOCUS:
//                        SetResourceProperties(NULL, NULL);
                        break;
                }
            break;
        case WM_HANDLEDBLCLICK:
        {
            STRINGS *strings;
            RECT r;
            stringTableData = (struct resRes *)GetWindowLong(hwnd, 0);
            if (stringTableData->gd.editWindow)
            {
                DestroyWindow(stringTableData->gd.editWindow);
                stringTableData->gd.editWindow = NULL;
            }
            strings = stringTableData->resource->u.stringtable;
            i = 0;
            while (strings && strings->next && i < stringTableData->gd.selectedRow)
                strings = strings->next, i++;
            if (strings)
            {
                ListView_GetSubItemRect(stringTableData->gd.childWindow, 
                                        stringTableData->gd.selectedRow,
                                        stringTableData->gd.selectedColumn,
                                        LVIR_BOUNDS, &r);
                stringTableData->gd.editWindow = CreateWindow("edit", "", WS_VISIBLE |
                    WS_CHILD | WS_CLIPSIBLINGS | WS_BORDER,
                    r.left,r.top,r.right-r.left,16, hwnd, (HMENU)ID_EDIT,
                    hInstance, NULL);
                SetParent(stringTableData->gd.editWindow, stringTableData->gd.childWindow);
                AccSubclassEditWnd(hwnd, stringTableData->gd.editWindow);
                switch(stringTableData->gd.selectedColumn)
                {
                    char buf[256];
                    case 0:
                        buf[0] = 0;
                        FormatExp(buf, strings->id);
                        SendMessage(stringTableData->gd.editWindow, WM_SETTEXT, 0, (LPARAM)buf);
                        break;
                    case 1:
                        FormatVersionString(buf, strings->string, strings->length);
                        buf[strlen(buf)-1] = 0;
                        SendMessage(stringTableData->gd.editWindow, WM_SETTEXT, 0, (LPARAM)buf+1);
                        break;
                }
                SendMessage(stringTableData->gd.editWindow, EM_SETSEL, 0, -1);
                SetFocus(stringTableData->gd.editWindow);
            }
        }
            break;
        case WM_TIMER:
            stringTableData = (struct resRes *)GetWindowLong(hwnd, 0);
            ListView_Scroll(stringTableData->gd.childWindow, 0,
                           (stringTableData->gd.lvscroll & 1) ? -16 : 16);
            break;
        case WM_COMMAND:
            stringTableData = (struct resRes *)GetWindowLong(hwnd, 0);
            switch (LOWORD(wParam))
            {
                case ID_EDIT:
                    if (HIWORD(wParam) == CBN_KILLFOCUS || HIWORD(wParam) == EN_KILLFOCUS)
                    {
                        static BOOL inKillFocus;
                        if (stringTableData->gd.editWindow && !inKillFocus)
                        {
                            STRINGS *strings = stringTableData->resource->u.stringtable;
                            i = 0;
                            while (strings && strings->next && i < stringTableData->gd.selectedRow)
                                strings = strings->next,i++;
                            if (strings)
                            {
                                char buf[256];
                                buf[GetWindowText(stringTableData->gd.editWindow, buf, sizeof(buf)-1)] = 0;
                                StringTableSetChanged(stringTableData, strings);
                                if (stringTableData->gd.selectedColumn == 0)
                                {
                                    PropSetIdName(stringTableData, buf, &strings->id, NULL);
                                }
                                else
                                {
                                    int len;
                                    char *p = ParseVersionString(buf, &len); //FIXME ?
                                    strings->length = StringAsciiToWChar(&strings->string, p, len);
                                    ResGetStringItemName(strings->id, p);
                                }
                                ListView_DeleteItem(stringTableData->gd.childWindow, stringTableData->gd.selectedRow);
                                PopulateItem(stringTableData->gd.childWindow, strings, stringTableData->gd.selectedRow);
                            }
                            i = 0;
                            inKillFocus = TRUE;
                            DestroyWindow(stringTableData->gd.editWindow);
                            inKillFocus = FALSE;
                            stringTableData->gd.editWindow = NULL;
                        }
                    }
                    break;
                case IDM_INSERT:
                    StringTableInsert(stringTableData, stringTableData->gd.selectedRow);
                    break;
                case IDM_DELETE:
                    StringTableDelete(stringTableData, stringTableData->gd.selectedRow);
                    break;
                case IDM_SAVE:
                    if (stringTableData->resource->changed)
                    {
                         ResSaveCurrent(workArea, stringTableData);
                    }
                    break;
                case IDM_UNDO:
                    StringTableUndo(hwnd, stringTableData);
                    break;
            }
            break;
        case EM_CANUNDO:
            stringTableData = (struct resRes *)GetWindowLong(hwnd, 0);
            return stringTableData->gd.undoData != NULL;
        case WM_CREATE:
            GetClientRect(hwnd, &r);
            createStruct = (LPCREATESTRUCT)lParam;
            stringTableData = (struct resRes *)((LPMDICREATESTRUCT)(createStruct->lpCreateParams))->lParam;
            SetWindowLong(hwnd, 0, (long)stringTableData);
            stringTableData->activeHwnd = hwnd;
            stringTableData->gd.childWindow = CreateWindowEx(0, WC_LISTVIEW, "", WS_VISIBLE |
                WS_CHILD | LVS_REPORT | LVS_SINGLESEL,
                0, 0, r.right, r.bottom, hwnd, (HMENU)ID_TREEVIEW,
                hInstance, NULL);
            SetListViewColumns(hwnd, stringTableData->gd.childWindow);
            PopulateStrings(hwnd, stringTableData );
            break;
        case WM_CLOSE:
            SendMessage(hwndSrcTab, TABM_REMOVE, 0, (LPARAM)hwnd);
            break;
        case WM_DESTROY:
            stringTableData = (struct resRes *)GetWindowLong(hwnd, 0);
            if (stringTableData->gd.editWindow)
                DestroyWindow(stringTableData->gd.editWindow);
            stringTableData->gd.editWindow = NULL;
            undo = stringTableData->gd.undoData;
            if (undo)
                stringTableData->gd.cantClearUndo = TRUE;
            while (undo)
            {
                struct stringTableUndo *next = undo->next;
                free(undo);
                undo = next;
            }
            stringTableData->gd.undoData = NULL;
            stringTableData->activeHwnd = NULL;
            break;
        case WM_SIZE:
            stringTableData = (struct resRes *)GetWindowLong(hwnd, 0);
            MoveWindow(stringTableData->gd.childWindow, 0, 0, LOWORD(lParam), HIWORD(lParam), 1);
            break;
        default:
            break;
    }
    return DefMDIChildProc(hwnd, iMessage, wParam, lParam);
}
Ejemplo n.º 25
-1
void CListCtrlEx::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
	if(IsHighContrast())
	{
		return;
	}

	LPNMLVCUSTOMDRAW lpLVCustomDraw = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);

	switch(lpLVCustomDraw->nmcd.dwDrawStage)
	{
	case CDDS_ITEMPREPAINT:
	case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
		if(lpLVCustomDraw->nmcd.dwItemSpec % 2 == 0)
		{
			lpLVCustomDraw->clrText = m_TextColor1;
			lpLVCustomDraw->clrTextBk = m_BkColor1;
		}
		else
		{
			lpLVCustomDraw->clrText = m_TextColor2;
			lpLVCustomDraw->clrTextBk = m_BkColor2;
		}
		break;
	case CDDS_ITEMPOSTPAINT | CDDS_SUBITEM:
		{
			RECT rc;
			CBrush brush(m_LineColor);

			CHeaderCtrl* header = this->GetHeaderCtrl();
			if(header != NULL)
			{
				int count = header->GetItemCount();
				for(int i = 0; i < count; i++)
				{
					ListView_GetSubItemRect(m_hWnd, lpLVCustomDraw->nmcd.dwItemSpec, i, LVIR_LABEL, &rc);
					rc.left = rc.right - 1;
					FillRect(lpLVCustomDraw->nmcd.hdc, &rc, (HBRUSH) brush.GetSafeHandle());
				}
			}
		}
		break;
    default:
		break;
	}

	*pResult = 0;
	*pResult |= CDRF_NOTIFYPOSTPAINT;
	*pResult |= CDRF_NOTIFYITEMDRAW;
	*pResult |= CDRF_NOTIFYSUBITEMDRAW;
}