summaryrefslogtreecommitdiff
path: root/src/windows/leash/CLeashDragListBox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/windows/leash/CLeashDragListBox.cpp')
-rw-r--r--src/windows/leash/CLeashDragListBox.cpp215
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;
+}
+*/