diff options
Diffstat (limited to 'src/windows/leash/CLeashDragListBox.cpp')
| -rw-r--r-- | src/windows/leash/CLeashDragListBox.cpp | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/src/windows/leash/CLeashDragListBox.cpp b/src/windows/leash/CLeashDragListBox.cpp new file mode 100644 index 000000000000..27538843016c --- /dev/null +++ b/src/windows/leash/CLeashDragListBox.cpp @@ -0,0 +1,215 @@ +#include "stdafx.h" +#include "CLeashDragListBox.h" +#include "leash.h" +#include "lglobals.h" + +///////////////////////////////////////////////////////////////////////////// +// CLeashDragListBox + +//IMPLEMENT_DYNAMIC(CLeashDragListBox, CDragListBox) + +CLeashDragListBox::CLeashDragListBox() + :CDragListBox() +{ + +} + +CLeashDragListBox::~CLeashDragListBox() +{ + DestroyWindow(); +} + +void CLeashDragListBox::initOtherListbox(CPropertyPage* pPage, CListBox* pOtherListBox) +{ + m_pPage = pPage; + m_pOtherListBox = pOtherListBox; +} + + +void CLeashDragListBox::PreSubclassWindow() +{ + ASSERT(::IsWindow(m_hWnd)); + ASSERT((GetStyle() & (LBS_MULTIPLESEL|LBS_SORT)) == 0); + MakeDragList(m_hWnd); +} + +BOOL CLeashDragListBox::BeginDrag(CPoint pt) +{ + m_nLast = -1; + DrawInsert(ItemFromPt(pt)); + return TRUE; +} + +void CLeashDragListBox::CancelDrag(CPoint) +{ + DrawInsert(-1); +} + +UINT CLeashDragListBox::Dragging(CPoint pt) +{ + int nIndex = ItemFromPt(pt, FALSE); // don't allow scrolling just yet + DrawInsert(nIndex); + ItemFromPt(pt); + return (nIndex == LB_ERR) ? DL_STOPCURSOR : DL_MOVECURSOR; +} + +void CLeashDragListBox::Dropped(int nSrcIndex, CPoint pt) +{ + ASSERT(!(GetStyle() & (LBS_OWNERDRAWFIXED|LBS_OWNERDRAWVARIABLE)) || + (GetStyle() & LBS_HASSTRINGS)); + + DrawInsert(-1); + int nDestIndex = ItemFromPt(pt); + + if (nSrcIndex == -1 || nDestIndex == -1) + return; + if (nDestIndex == nSrcIndex || nDestIndex == nSrcIndex+1) + return; //didn't move + CString str1, str2; + DWORD_PTR dwData; + GetText(nSrcIndex, str1); + GetText(nDestIndex, str2); + dwData = GetItemData(nSrcIndex); + DeleteString(nSrcIndex); + if (nSrcIndex < nDestIndex) + nDestIndex--; + nDestIndex = InsertString(nDestIndex, str1); + SetItemData(nDestIndex, dwData); + SetCurSel(nDestIndex); + + // Save new order of items to profile linklist + char theSection[REALM_SZ + 1]; + const char* adminServer[] = {"realms", theSection, ADMIN_SERVER, NULL}; + const char* Section[] = {"realms", theSection, NULL}; + const char** adminServ = adminServer; + const char** section = Section; + const char* valueSection[] = {"realms", theSection, "kdc", NULL}; + const char** valueSec = valueSection; + CString theValue; + CHAR hostServer[MAX_HSTNM]; + + if (LB_ERR == m_pOtherListBox->GetText(m_pOtherListBox->GetCurSel(), theSection)) + ASSERT(0); + + long retval = pprofile_rename_section(CLeashApp::m_krbv5_profile, + section, NULL); + if (retval) + { + MessageBox("Dropped::There is on error, profile will not be saved!!!\ + \nIf this error persist, contact your administrator.", + "Leash", MB_OK); + return; + } + + retval = pprofile_add_relation(CLeashApp::m_krbv5_profile, + section, NULL); + if (retval) + { + MessageBox("Dropped::There is on error, profile will not be saved!!!\ + \nIf this error persist, contact your administrator.", + "Leash", MB_OK); + return; + } + + for (INT maxItems = GetCount(), item = 0; item < maxItems; item++) + { + GetText(item, hostServer); + //strcpy(hostServer, theValue); + + if (strstr(hostServer, ADMIN_SERVER)) + { + char* pAdmin = strchr(hostServer, ' '); + if (pAdmin) + *pAdmin = 0; + else + ASSERT(0); + + retval = pprofile_add_relation(CLeashApp::m_krbv5_profile, + adminServ, hostServer); + if (retval) + { + MessageBox("Dropped::There is on error, profile will not be saved!!!\ + \nIf this error persist, contact your administrator.", + "Leash", MB_OK); + return; + } + } + + retval = pprofile_add_relation(CLeashApp::m_krbv5_profile, + valueSec, hostServer); + if (retval) + { + MessageBox("Dropped::There is on error, profile will not be saved!!!\ + \nIf this error persist, contact your administrator.", + "Leash", MB_OK); + return; + } + } + + m_pPage->SetModified(TRUE); +} + +void CLeashDragListBox::DrawInsert(int nIndex) +{ + if (m_nLast != nIndex) + { + DrawSingle(m_nLast); + DrawSingle(nIndex); + m_nLast = nIndex; + } +} + +void CLeashDragListBox::DrawSingle(int nIndex) +{ + if (nIndex == -1) + return; + CBrush* pBrush = CDC::GetHalftoneBrush(); + CRect rect; + GetClientRect(&rect); + CRgn rgn; + rgn.CreateRectRgnIndirect(&rect); + + CDC* pDC = GetDC(); + // prevent drawing outside of listbox + // this can happen at the top of the listbox since the listbox's DC is the + // parent's DC + pDC->SelectClipRgn(&rgn); + + GetItemRect(nIndex, &rect); + rect.bottom = rect.top+2; + rect.top -= 2; + CBrush* pBrushOld = pDC->SelectObject(pBrush); + //draw main line + pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATINVERT); + + pDC->SelectObject(pBrushOld); + ReleaseDC(pDC); +} + +/* +BOOL CLeashDragListBox::OnChildNotify(UINT nMessage, WPARAM wParam, LPARAM lParam, LRESULT* pResult) +{ + if (nMessage != m_nMsgDragList) + return CListBox::OnChildNotify(nMessage, wParam, lParam, pResult); + + ASSERT(pResult != NULL); + LPDRAGLISTINFO pInfo = (LPDRAGLISTINFO)lParam; + ASSERT(pInfo != NULL); + switch (pInfo->uNotification) + { + case DL_BEGINDRAG: + *pResult = BeginDrag(pInfo->ptCursor); + break; + case DL_CANCELDRAG: + CancelDrag(pInfo->ptCursor); + break; + case DL_DRAGGING: + *pResult = Dragging(pInfo->ptCursor); + break; + case DL_DROPPED: + Dropped(GetCurSel(), pInfo->ptCursor); + break; + } + return TRUE; +} +*/ |
