diff host/tools/testtool/win32/ExecutionPage.cpp @ 76:435cced73e2f ecos-v1_3_1-release

eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
author jlarmour
date Tue, 28 Mar 2000 14:10:45 +0000
parents
children 6736c52df507
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/host/tools/testtool/win32/ExecutionPage.cpp
@@ -0,0 +1,428 @@
+//####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####
+    // ExecutionPage.cpp : implementation file
+//
+#include "stdafx.h"
+#include "ExecutionPage.h"
+#include "shlobj.h"
+#include "RunTestsSheet.h"
+#include <afxpriv.h> // for WM_KICKIDLE
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// CExecutionPage property page
+
+const UINT arIds []={IDC_TT_SELECT_ALL,IDC_TT_UNSELECT_ALL,IDC_TT_ADD, IDC_TT_FOLDER, IDC_TT_REMOVE};
+
+IMPLEMENT_DYNCREATE(CExecutionPage, CeCosPropertyPage)
+
+CExecutionPage::CExecutionPage() : 
+    CeCosPropertyPage(IDD_TT_EXECUTION_PAGE)
+{
+    GetCurrentDirectory(MAX_PATH,m_strFolder.GetBuffer(MAX_PATH));
+    m_strFolder.ReleaseBuffer();
+	//{{AFX_DATA_INIT(CExecutionPage)
+		// NOTE: the ClassWizard will add member initialization here
+	//}}AFX_DATA_INIT
+}
+
+CExecutionPage::~CExecutionPage()
+{
+}
+
+void CExecutionPage::DoDataExchange(CDataExchange* pDX)
+{
+	CeCosPropertyPage::DoDataExchange(pDX);
+	//{{AFX_DATA_MAP(CExecutionPage)
+	DDX_Control(pDX, IDC_TT_RUNTESTS_LIST, m_List);
+	//}}AFX_DATA_MAP
+}
+
+
+BEGIN_MESSAGE_MAP(CExecutionPage, CeCosPropertyPage)
+	//{{AFX_MSG_MAP(CExecutionPage)
+	ON_BN_CLICKED(IDC_TT_FOLDER, OnFolder)
+	ON_BN_CLICKED(IDC_TT_SELECT_ALL, OnSelectAll)
+	ON_BN_CLICKED(IDC_TT_UNSELECT_ALL, OnUnselectAll)
+	ON_BN_CLICKED(IDC_TT_ADD, OnAdd)
+	ON_BN_CLICKED(IDC_TT_REMOVE, OnRemove)
+	ON_WM_SIZE()
+    ON_MESSAGE(WM_KICKIDLE, OnKickIdle)
+	ON_WM_CHAR()
+	//}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CExecutionPage message handlers
+CExecutionPage *CExecutionPage::pDlg=NULL;
+LRESULT CALLBACK CExecutionPage::WindowProcNew(HWND hwnd,UINT message, WPARAM wParam, LPARAM lParam)
+{
+    if (message ==  WM_COMMAND) {
+        switch(wParam){
+            case MAKEWPARAM(IDC_TT_RECURSE,BN_CLICKED):
+                pDlg->m_bRecurse ^= 1;
+                pDlg->m_Button.SetCheck(pDlg->m_bRecurse);
+		return 0;
+            case MAKEWPARAM(IDC_TT_EXTENSION,EN_CHANGE):
+                pDlg->m_Combo.GetWindowText(pDlg->m_strExtension);
+		        return 0;
+            default:
+                break;
+	}
+	}
+	return CallWindowProc(pDlg->m_wndProc, hwnd, message, wParam, lParam);
+}
+ 
+int CALLBACK CExecutionPage::CBBrowseCallbackProc( HWND hwnd, 
+	UINT uMsg, 
+	LPARAM lParam, 
+	LPARAM lpData 
+	)
+{
+    pDlg=(CExecutionPage *)lpData;
+    switch(uMsg){
+        case BFFM_INITIALIZED:
+          {
+            ::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)(LPCTSTR)pDlg->m_strFolder);
+            CWnd *pWnd=CWnd::FromHandle(hwnd);
+            pWnd->SetWindowText(_T("Add Files from Folder"));
+            
+            // Get rect of IDCANCEL button to the right
+            CRect rect,rect1,rect2;
+            pWnd->GetDlgItem(IDCANCEL)->GetWindowRect(&rect1);
+            pWnd->GetWindowRect(&rect2);
+            int nDlgMargin=rect2.right-rect1.right;
+            int nButtonHeight=rect1.Height();
+            rect.left=rect.top=nDlgMargin;
+            rect.right=rect.left+6*nButtonHeight;
+            rect.bottom=rect.top+(10*nButtonHeight)/14;
+            WPARAM wFont=(WPARAM)GetStockObject(DEFAULT_GUI_FONT);
+            pDlg->m_Button.CreateEx(0,_T("BUTTON"),NULL, WS_VISIBLE|WS_CHILD|BS_CHECKBOX, rect, pWnd, IDC_TT_RECURSE);
+            pDlg->m_Button.SetWindowText(_T("&Add from subfolders"));
+            pDlg->m_Button.SendMessage(WM_SETFONT, wFont, 0);
+            pDlg->m_Button.SetCheck(pDlg->m_bRecurse);
+            
+            rect.left=rect.right+(4*nButtonHeight)/14;
+            rect.right=rect.left+3*nButtonHeight;
+            rect.bottom+=2*GetSystemMetrics(SM_CYBORDER)+4;
+            pDlg->m_Static.Create(_T("Files of type:"),WS_VISIBLE|WS_CHILD|SS_LEFT, rect, pWnd);
+            pDlg->m_Static.SendMessage(WM_SETFONT, wFont, 0);
+            rect.bottom-=2*GetSystemMetrics(SM_CYBORDER)+4;
+            
+            rect.left=rect.right+(4*nButtonHeight)/14;
+            rect.right=rect.left+3*nButtonHeight;
+            //rect.bottom=rect.top+2*nButtonHeight;
+            rect.top=rect.bottom-(12*nButtonHeight)/14;
+            pDlg->m_Combo.CreateEx(WS_EX_CLIENTEDGE,_T("Edit"),NULL,WS_VISIBLE|WS_CHILD|WS_BORDER|ES_LEFT/*|CBS_DROPDOWN*/, rect, pWnd, IDC_TT_EXTENSION);
+            //pDlg->m_Combo.AddString(pDlg->m_strExtension);
+            //pDlg->m_Combo.SetCurSel(0);
+            pDlg->m_Combo.SetWindowText(pDlg->m_strExtension);
+            pDlg->m_Combo.SendMessage(WM_SETFONT, wFont, 0);
+            
+            pDlg->m_wndProc = (WNDPROC)SetWindowLong(hwnd, GWL_WNDPROC, (long)WindowProcNew);
+            
+          }
+        case BFFM_SELCHANGED:
+            {
+                // Change the cwd such that if the New button is used, we know where we are to start from
+                ITEMIDLIST *iil=(ITEMIDLIST *)lParam;
+                CString strFolder;
+		        SHGetPathFromIDList(iil,strFolder.GetBuffer(MAX_PATH));
+                strFolder.ReleaseBuffer();
+                SetCurrentDirectory(strFolder);
+            }
+            break;
+        default:
+            ;
+    }
+
+	return 0;
+}
+
+void CExecutionPage::OnFolder() 
+{
+
+	BROWSEINFO bi;
+    bi.hwndOwner = GetSafeHwnd(); 
+    bi.pidlRoot = NULL;   
+    bi.pszDisplayName = m_strFolder.GetBuffer(MAX_PATH);
+    bi.lpszTitle = _T("");
+    bi.ulFlags = BIF_RETURNONLYFSDIRS|BIF_STATUSTEXT/*|0x0010 BIF_EDITBOX*/;             
+    bi.lpfn = (BFFCALLBACK)CBBrowseCallbackProc;
+    bi.lParam = (LPARAM)this;
+
+    bool bSaveRecurse=m_bRecurse;
+    LPITEMIDLIST iil = SHBrowseForFolder(&bi);
+	m_strFolder.ReleaseBuffer();
+    if(iil){
+		SHGetPathFromIDList(iil,m_strFolder.GetBuffer(MAX_PATH));
+        m_strFolder.ReleaseBuffer();
+        SetModified();
+        FillListBox(m_strFolder);
+    } else {
+        m_bRecurse=bSaveRecurse;
+    }
+
+}
+
+/*
+void CExecutionPage::OnRefresh() 
+{
+    FillListBox(m_strFolder);
+}
+*/
+
+void CExecutionPage::FillListBox(LPCTSTR pszFolder)
+{
+  CWaitCursor wait;
+  CString strOldFolder;
+  ::GetCurrentDirectory(MAX_PATH,strOldFolder.GetBuffer(MAX_PATH));
+  strOldFolder.ReleaseBuffer();
+  
+  if(::SetCurrentDirectory(pszFolder)){
+    int nCount=m_List.GetCount();
+    m_List.Dir(DDL_READWRITE,m_strExtension);
+    for(int i=nCount;i<m_List.GetCount();i++){
+      TCHAR strFull[1+MAX_PATH];
+      CString str;
+      m_List.GetText(i,str);
+      TCHAR *pFile;
+      ::GetFullPathName(str,MAX_PATH,strFull,&pFile);
+      m_List.DeleteString(i);
+      if(LB_ERR==m_List.FindStringExact(-1,strFull)){
+        m_List.InsertString(i,strFull);
+        m_List.SetCheck(i,TRUE);
+      } else {
+        --i;
+      }
+    }
+    if(m_bRecurse){
+		    CFileFind finder;
+        BOOL bMore=finder.FindFile();
+        while (bMore)    {
+          bMore = finder.FindNextFile();
+          if(finder.IsDirectory() && !finder.IsDots()){
+            FillListBox(finder.GetFileName());
+          }
+        }
+    }
+    ::SetCurrentDirectory(strOldFolder);
+  }
+  GetDlgItem(IDC_TT_SELECT_ALL)->EnableWindow(m_List.GetCount()>0);
+  GetDlgItem(IDC_TT_UNSELECT_ALL)->EnableWindow(m_List.GetCount()>0);
+}
+
+void CExecutionPage::OnSelectAll() 
+{
+	for(int i=0;i<m_List.GetCount();i++){
+		m_List.SetCheck(i,TRUE);
+	}
+}
+
+void CExecutionPage::OnUnselectAll() 
+{
+	for(int i=0;i<m_List.GetCount();i++){
+		m_List.SetCheck(i,FALSE);
+	}
+}
+
+bool CExecutionPage::IsSelected(int i)
+{
+    return TRUE==m_List.GetCheck(i);
+}
+
+void CExecutionPage::OnAdd() 
+{
+  CFileDialog dlg(TRUE, _T("exe"), _T("*.exe"), OFN_ALLOWMULTISELECT|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,
+    _T("Executables(*.exe)\0*.exe\0"));
+  dlg.m_ofn.lpstrTitle=_T("Add");
+  if(IDOK==dlg.DoModal()){
+    LPCTSTR pszDir=dlg.m_ofn.lpstrFile;
+    DWORD dwAttr=GetFileAttributes(pszDir);
+    if(0xFFFFFFFF!=dwAttr){
+      bool bErr=false;
+      if(dwAttr&FILE_ATTRIBUTE_DIRECTORY){
+        for(LPCTSTR c=pszDir+_tcslen(pszDir)+1;_TCHAR('\0')!=*c;c+=_tcslen(c)+1){
+          CString str(pszDir);
+          str+=_TCHAR('\\');
+          str+=c;
+          if(LB_ERR==m_List.FindStringExact(-1,str)){
+            m_List.SetCheck(m_List.AddString(str),TRUE);
+          } else {
+            bErr=true;
+          }
+        }
+      } else {
+        if(LB_ERR==m_List.FindStringExact(-1,pszDir)){
+          m_List.SetCheck(m_List.AddString(pszDir),TRUE);
+        } else {
+          bErr=true;
+        }
+      }
+      if(bErr){
+        MessageBox(_T("One or more of the files was already present"));
+      }
+    }
+  }
+  GetDlgItem(IDC_TT_SELECT_ALL)->EnableWindow(m_List.GetCount()>0);
+  GetDlgItem(IDC_TT_UNSELECT_ALL)->EnableWindow(m_List.GetCount()>0);
+}
+
+
+int CExecutionPage::SelectedTestCount()
+{
+    int n=0;
+    if(IsWindow(m_List.m_hWnd)){
+        for(int i=0;i<m_List.GetCount();i++){
+            n+=m_List.GetCheck(i);
+        }
+    }
+    return n;
+}
+
+CString CExecutionPage::SelectedTest(int nIndex)
+{
+    CString str;
+    for(int i=0;i<m_List.GetCount();i++){
+        if(m_List.GetCheck(i)){
+            if(0==nIndex--){
+                m_List.GetText(i,str);
+                break;
+            }
+        }
+    }
+    return str;
+
+}
+
+BOOL CExecutionPage::OnInitDialog() 
+{
+	CeCosPropertyPage::OnInitDialog();
+  for(POSITION pos = m_arstrPreLoad.GetStartPosition(); pos != NULL; ){
+    CString strFile;
+    void *p;
+    m_arstrPreLoad.GetNextAssoc( pos, strFile,p);
+    m_List.SetCheck(m_List.AddString(strFile),0!=p);
+  }
+  return TRUE;  // return TRUE unless you set the focus to a control
+  // EXCEPTION: OCX Property Pages should return FALSE
+}
+
+void CExecutionPage::OnSize(UINT nType, int cx, int cy) 
+{
+  CRect rect;
+  GetClientRect(rect);
+  CeCosPropertyPage::OnSize(nType, cx, cy);
+  
+  CWnd *pWnd=GetDlgItem(IDC_TT_RUNTESTS_LIST);
+  if(pWnd){
+    ((CRunTestsSheet*)GetParent())->MoveWindow(pWnd,CRunTestsSheet::Stretch);
+    const int nWnds=sizeof(arIds)/sizeof(arIds[0]);
+    CRect rc[nWnds];
+    
+    CWnd *pWnd0=GetDlgItem(arIds[0]);
+    ((CRunTestsSheet*)GetParent())->MoveWindow(pWnd0,CRunTestsSheet::TopLeft);
+    CWnd *pWndn=GetDlgItem(arIds[nWnds-1]);
+    ((CRunTestsSheet*)GetParent())->MoveWindow(pWndn,CRunTestsSheet::TopRight);
+    
+    CRect rect0;
+    pWnd0->GetWindowRect(rect0);
+    ScreenToClient(rect0);
+    
+    CRect rectn;
+    pWndn->GetWindowRect(rectn);
+    ScreenToClient(rectn);
+    
+    int nSpacing=(rectn.left-rect0.left)/(nWnds-1);
+    for(int i=1;i<nWnds-1;i++){
+      CRect rect;
+      rect.left=rect0.left+i*nSpacing;
+      rect.right=rect.left+rect0.Width();
+      rect.top=rect0.top;
+      rect.bottom=rect0.bottom;
+      pWnd=GetDlgItem(arIds[i]);
+      pWnd->GetWindowRect(rc[i]);
+      ScreenToClient(rc[i]);
+      pWnd->MoveWindow(rect);
+    }
+    
+    for(i=0;i<sizeof(arIds)/sizeof(arIds[0]);i++){
+      InvalidateRect(rc[i]);
+      GetDlgItem(arIds[i])->Invalidate();
+    }
+    
+  }	
+}
+
+LRESULT CExecutionPage::OnKickIdle(WPARAM, LPARAM)
+{
+    if(IsWindow(m_List.m_hWnd)){
+        int n=m_List.GetCount();
+        bool bSelectAll=false;
+        bool bUnSelectAll=false;
+        if(n>0){
+            bool bPrev=false;
+            for(int i=0;i<n;i++){
+                bool bCheck=(TRUE==m_List.GetCheck(i));
+                if(bCheck){
+                    bUnSelectAll=true;
+                } else {
+                    bSelectAll=true;
+                }
+                if(i>0 && bCheck!=bPrev){
+                    break;
+                }
+                bPrev=bCheck;
+            }
+        }
+        GetDlgItem(IDC_TT_SELECT_ALL)->EnableWindow(bSelectAll);
+        GetDlgItem(IDC_TT_UNSELECT_ALL)->EnableWindow(bUnSelectAll);
+    }
+	return 0;
+}
+
+bool CExecutionPage::SomeTestsSelected()
+{
+    bool b=0;
+    if(IsWindow(m_List.m_hWnd)){
+        for(int i=0;i<m_List.GetCount();i++){
+            if(m_List.GetCheck(i)){
+                b=true;
+                break;
+            }
+        }
+    }
+    return b;
+
+}
+
+void CExecutionPage::OnRemove() 
+{
+  m_List.SendMessage(WM_COMMAND,IDC_TT_REMOVE,0);
+}