OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [ecos-2.0/] [tools/] [src/] [tools/] [configtool/] [common/] [win32/] [AddRemoveDialog.cpp] - Rev 1765

Compare with Previous | Blame | View Log

//####COPYRIGHTBEGIN####
//                                                                          
// ----------------------------------------------------------------------------
// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
//
// This program is part of the eCos host tools.
//
// This program is free software; you can redistribute it and/or modify it 
// under the terms of the GNU General Public License as published by the Free 
// Software Foundation; either version 2 of the License, or (at your option) 
// any later version.
// 
// This program is distributed in the hope that it will be useful, but WITHOUT 
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for 
// more details.
// 
// You should have received a copy of the GNU General Public License along with
// this program; if not, write to the Free Software Foundation, Inc., 
// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
//
// ----------------------------------------------------------------------------
//                                                                          
//####COPYRIGHTEND####
// AddRemoveDialog.cpp : implementation file
//
 
#include "stdafx.h"
 
#include "AddRemoveDialog.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
 
/////////////////////////////////////////////////////////////////////////////
// CAddRemoveDialog dialog
 
void CAddRemoveDialog::AfxDataInit()
{
	//{{AFX_DATA_INIT(CAddRemoveDialog)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}
 
CAddRemoveDialog::CAddRemoveDialog(CWnd* pParent /*=NULL*/)
	: CeCosDialog(IDD, pParent),
    m_bSort(false),
    m_arbSel(NULL),
    m_bHaveDescs(false),
    m_nHorizontalResizingLimit(0)
{
	AfxDataInit ();
}
 
CAddRemoveDialog::CAddRemoveDialog(UINT nIDTemplate, CWnd* pParent /*=NULL*/)
	: CeCosDialog(nIDTemplate, pParent),
    m_bSort(false),
    m_arbSel(NULL),
    m_nHorizontalResizingLimit(0)
{
	AfxDataInit ();
}
 
void CAddRemoveDialog::DoDataExchange(CDataExchange* pDX)
{
	CeCosDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAddRemoveDialog)
	DDX_Control(pDX, IDC_PACKAGE_DESC, m_wndDesc);
	DDX_Control(pDX, IDC_ADDREMOVE_LIST2, m_List2);
	DDX_Control(pDX, IDC_ADDREMOVE_LIST1, m_List1);
	DDX_Control(pDX, IDC_ADDREMOVE_ADD,   m_Add);
	DDX_Control(pDX, IDC_ADDREMOVE_REMOVE,m_Remove);
	//}}AFX_DATA_MAP
}
 
 
BEGIN_MESSAGE_MAP(CAddRemoveDialog, CeCosDialog)
	//{{AFX_MSG_MAP(CAddRemoveDialog)
	ON_BN_CLICKED(IDC_ADDREMOVE_ADD, OnAdd)
	ON_BN_CLICKED(IDC_ADDREMOVE_REMOVE, OnRemove)
	ON_LBN_DBLCLK(IDC_ADDREMOVE_LIST1, OnDblclkList1)
	ON_LBN_DBLCLK(IDC_ADDREMOVE_LIST2, OnDblclkList2)
	ON_LBN_SELCHANGE(IDC_ADDREMOVE_LIST1, OnSelchangeList1)
	ON_LBN_SELCHANGE(IDC_ADDREMOVE_LIST2, OnSelchangeList2)
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
 
/////////////////////////////////////////////////////////////////////////////
// CAddRemoveDialog message handlers
 
void CAddRemoveDialog::OnAdd() 
{
    Add(m_List1,m_List2);
    m_Add.EnableWindow(FALSE);
    m_Remove.EnableWindow(TRUE);
}
 
void CAddRemoveDialog::OnRemove() 
{
    Add(m_List2,m_List1);
    m_Add.EnableWindow(TRUE);
    m_Remove.EnableWindow(FALSE);
}
 
void CAddRemoveDialog::Insert(LPCTSTR pszItem, bool bAdded, LPCTSTR pszDesc/*=NULL*/)
{
    m_bHaveDescs|=(NULL!=pszDesc);
    m_arnItems.  Add(bAdded);
    m_arstrItems.Add(pszItem);
    m_arstrDescs.Add(pszDesc?pszDesc:_T(""));
}
 
BOOL CAddRemoveDialog::OnInitDialog() 
{
	CeCosDialog::OnInitDialog();
 
    m_arbSel=new int[GetCount()];
 
    SetWindowText(m_strCaption);
    SetSortMode(m_List1);
    SetSortMode(m_List2);
 
	int cxExtent=0;
    CDC *pDC=m_List1.GetDC();
	CFont *pOldFont=pDC->SelectObject(m_List1.GetFont());
    for(int i=GetCount()-1;i>=0;--i) {
        const CString &str=m_arstrItems[i];
		cxExtent=max(cxExtent,pDC->GetTextExtent(str).cx);
        CListBox &lb=m_arnItems[i]?m_List2:m_List1;
        lb.SetItemData(lb.AddString(str),(DWORD)i);
    }
    pDC->SelectObject(pOldFont);
 
    SetDlgItemText(IDC_ADDREMOVE_TEXT1,m_strMessage1);
    SetDlgItemText(IDC_ADDREMOVE_TEXT2,m_strMessage2);
 
	CRect rcLb1;
	m_List1.GetWindowRect(rcLb1);
    CRect rcDialog;
    GetWindowRect(rcDialog);
 
	int nExpand=cxExtent-(rcLb1.Width()-GetSystemMetrics(SM_CXVSCROLL)-2*GetSystemMetrics(SM_CXBORDER)-5);
    nExpand=min(nExpand,m_nHorizontalResizingLimit);
	if(nExpand>0){
		MoveChild(IDOK,2*nExpand,Move);
		MoveChild(IDCANCEL,2*nExpand,Move);
		MoveChild(IDC_ADDREMOVE_ADD,nExpand,Move);
		MoveChild(IDC_ADDREMOVE_REMOVE,nExpand,Move);
		MoveChild(IDC_ADDREMOVE_LIST1,nExpand,Stretch);
		MoveChild(IDC_ADDREMOVE_TEXT2,nExpand,Move);
		MoveChild(IDC_ADDREMOVE_LIST2,nExpand,Move);
		MoveChild(IDC_ADDREMOVE_LIST2,nExpand,Stretch);
		MoveChild(IDC_PACKAGE_DESC,2*nExpand,Stretch);
	    rcDialog.right+=2*nExpand; // MoveWindow call is below
	}
 
    // enable horizontal scrolling if necessary, assuming the
	// listboxes have identical widths and accommodating a
	// 2 pixel border at each side of each listbox
	m_List1.SetHorizontalExtent (cxExtent + 4);
	m_List2.SetHorizontalExtent (cxExtent + 4);
 
    m_Add.EnableWindow(m_List1.GetCount()>0);
    m_Remove.EnableWindow(m_List2.GetCount()>0);
 
    if(!m_bHaveDescs){
        // Remove the description pane if not used:
        CRect rcDesc;
        m_wndDesc.GetWindowRect(rcDesc);
        m_wndDesc.ShowWindow(SW_HIDE);
	    int delta=(rcDesc.Height()+(rcDesc.top-rcLb1.bottom));
        MoveChild(IDOK,delta,Up);
        MoveChild(IDCANCEL,delta,Up);
        rcDialog.bottom-=delta;
    }
 
    // Finally, adjust dialog size according to calculations:
    MoveWindow(rcDialog);
 
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}
 
void CAddRemoveDialog::OnDblclkList1() 
{
    OnDblclk(m_List1,m_List2);
    m_Add.EnableWindow(FALSE);
    m_Remove.EnableWindow(TRUE);
}
 
void CAddRemoveDialog::OnDblclkList2() 
{
    OnDblclk(m_List2,m_List1);
    m_Add.EnableWindow(TRUE);
    m_Remove.EnableWindow(FALSE);
}
 
int CAddRemoveDialog::Add(CListBox &lb1,CListBox &lb2)
{
    int nSelCount=lb1.GetSelItems(lb1.GetCount(),m_arbSel);
    for(int i=nSelCount-1;i>=0;--i){
        Xfer(lb1,lb2,m_arbSel[i]);
    }
    ClearSel(lb1);
    lb2.SetFocus();
    return nSelCount;
}
 
void CAddRemoveDialog::OnDblclk(CListBox &lb1,CListBox &lb2)
{
    BOOL bOutside;
    DWORD dwPos=GetMessagePos();
    POINTS pts=MAKEPOINTS(dwPos);
    CRect rc(pts.x,pts.y,0,0);
    lb1.ScreenToClient(rc);
    CPoint pt(rc.left,rc.top);
    int nItem=lb1.ItemFromPoint(pt,bOutside);
    if(!bOutside){
        Xfer(lb1,lb2,nItem);
    }
    ClearSel(lb1);
    lb2.SetFocus();
}
 
void CAddRemoveDialog::ClearSel(CListBox &lb)
{
    for(int i=lb.GetCount()-1;i>=0;--i){
        lb.SetSel(i,FALSE);
    }
}
 
void CAddRemoveDialog::OnSelchangeList1()
{
    ClearSel(m_List2);
    m_Add.EnableWindow(m_List1.GetSelCount()>0);
    UpdateDescription(m_List1);
    m_Remove.EnableWindow(FALSE);
}
 
void CAddRemoveDialog::OnSelchangeList2()
{
    ClearSel(m_List1);
    m_Remove.EnableWindow(m_List2.GetSelCount()>0);
    UpdateDescription(m_List2);
    m_Add.EnableWindow(FALSE);
}
 
void CAddRemoveDialog::Xfer(CListBox &lb1, CListBox &lb2, int nItem)
{
    CString strItem;
    lb1.GetText(nItem,strItem);
    int nNewItem=lb2.AddString(strItem);
    lb2.SetSel(nNewItem,TRUE);
    DWORD nIndex=lb1.GetItemData(nItem);
    lb2.SetItemData(nNewItem,nIndex);
    m_arnItems[(int)nIndex]^=1;
    lb1.DeleteString(nItem);
}
 
bool CAddRemoveDialog::IsAdded(LPCTSTR pszItem) const
{
    for(int i=GetCount()-1;i>=0;--i){
        if(m_arstrItems[i]==pszItem){
            return 0!=m_arnItems[i];
        }
    }
    ASSERT(false);
    return false;
}
 
 
void CAddRemoveDialog::SetCaption(LPCTSTR pszCaption)
{
    m_strCaption=pszCaption;
}
 
void CAddRemoveDialog::SetMessage(LPCTSTR pszText1,LPCTSTR pszText2)
{
    m_strMessage1=pszText1;
    m_strMessage2=pszText2;
}
 
void CAddRemoveDialog::OnDestroy() 
{
	CeCosDialog::OnDestroy();
    deleteZA(m_arbSel);
}
 
// Add the "sort" property to the listboxes.  Unfortunately this entails
// recreating them.
void CAddRemoveDialog::SetSortMode(CListBox &lb)
{
    DWORD dwStyle=lb.GetStyle();
    if(m_bSort!=(0!=(dwStyle&LBS_SORT))){
        if(m_bSort){
            dwStyle|=LBS_SORT;
        } else {
            dwStyle&=~LBS_SORT;
        }
        dwStyle|=WS_HSCROLL; // For some reason this doesn't come through GetStyle()
        CRect rect;
        lb.GetWindowRect(rect);
        ScreenToClient(rect);
        DWORD dwStyleEx=lb.GetExStyle();
        CFont *pFont=lb.GetFont();
        DWORD id=lb.GetDlgCtrlID();
        lb.DestroyWindow();
        lb.Detach();
        // CreateEx not Create to get ourselves a 3D border
        lb.CreateEx(dwStyleEx,_T("LISTBOX"),NULL,dwStyle,rect,this,id);
        lb.SetFont(pFont);
    }
}
 
// Implement ctrl/A on listboxes
BOOL CAddRemoveDialog::PreTranslateMessage(MSG* pMsg) 
{
    if(WM_CHAR==pMsg->message && 1==pMsg->wParam){
        if(pMsg->hwnd==m_List1.m_hWnd){
            m_List1.SelItemRange(TRUE,0,m_List1.GetCount()-1);
            ClearSel(m_List2);
            m_Add.EnableWindow(m_List1.GetCount()>0);
            m_Remove.EnableWindow(FALSE);
            return TRUE;
        } else if(pMsg->hwnd==m_List2.m_hWnd){
            m_List2.SelItemRange(TRUE,0,m_List2.GetCount()-1);
            ClearSel(m_List1);
            m_Remove.EnableWindow(m_List2.GetCount()>0);
            m_Add.EnableWindow(FALSE);
            return TRUE;
        }
    }
 
	return CeCosDialog::PreTranslateMessage(pMsg);
}
 
void CAddRemoveDialog::MoveChild(UINT id,int delta,MoveType how)
{
    CWnd *pWnd=GetDlgItem(id);
    CRect rect;
	pWnd->GetWindowRect(rect);
	ScreenToClient(rect);
    switch(how){
        case Move:
	        rect.left+=delta;
	        rect.right+=delta;
            break;
        case Stretch:
	        rect.right+=delta;
            break;
        case Up:
            rect.top-=delta;
            rect.bottom-=delta;
            break;
    }
    pWnd->MoveWindow(rect);
}
 
void CAddRemoveDialog::UpdateDescription(CListBox &lb)
{
    CString strDesc;
    // Set the description if the listbox has exactly one item selected
    if(1==lb.GetSelCount()){
	    int nIndex;
	    lb.GetSelItems(1,&nIndex);
        strDesc=m_arstrDescs[lb.GetItemData(nIndex)];
    }
    m_wndDesc.SetWindowText(strDesc);
}
 
void CAddRemoveDialog::SetHorizontalResizingLimit(int nPercent)
{
    m_nHorizontalResizingLimit=nPercent;
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.