leocad/win/Propspgs.cpp

320 lines
7.3 KiB
C++

#include "lc_global.h"
#include "resource.h"
#include "PropsPgs.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(CPropertiesGeneral, CPropertyPage)
IMPLEMENT_DYNCREATE(CPropertiesSummary, CPropertyPage)
IMPLEMENT_DYNCREATE(CPropertiesPieces, CPropertyPage)
/////////////////////////////////////////////////////////////////////////////
// CPropertiesGeneral property page
CPropertiesGeneral::CPropertiesGeneral() : CPropertyPage(CPropertiesGeneral::IDD)
{
//{{AFX_DATA_INIT(CPropertiesGeneral)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
CPropertiesGeneral::~CPropertiesGeneral()
{
}
void CPropertiesGeneral::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPropertiesGeneral)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPropertiesGeneral, CPropertyPage)
//{{AFX_MSG_MAP(CPropertiesGeneral)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CPropertiesGeneral::OnInitDialog()
{
CPropertyPage::OnInitDialog();
WIN32_FIND_DATA fd;
if (FindFirstFile(m_strFilename, &fd) != INVALID_HANDLE_VALUE)
{
char tf[] = "%A, %B %d, %Y %I:%M:%S %p";
SetDlgItemText(IDC_PROP_GEN_DOSNAME, m_strFilename.Right(m_strFilename.GetLength() - m_strFilename.ReverseFind('\\') - 1));
SetDlgItemText(IDC_PROP_GEN_LOCATION, m_strFilename.Left(m_strFilename.ReverseFind('\\') + 1));
CString str;
str.Format("%.1fKB (%d bytes)", (float)fd.nFileSizeLow/1024, fd.nFileSizeLow);
SetDlgItemText(IDC_PROP_GEN_SIZE, str);
CTime timeFile(fd.ftCreationTime);
str = timeFile.Format (tf);
SetDlgItemText(IDC_PROP_GEN_CREATED, str);
timeFile = fd.ftLastWriteTime;
str = timeFile.Format (tf);
SetDlgItemText(IDC_PROP_GEN_MODIFIED, str);
timeFile = fd.ftLastAccessTime;
str = timeFile.Format ("%A, %B %d, %Y");
SetDlgItemText(IDC_PROP_GEN_ACCESSED, str);
}
else
{
char* str = "(Unknown)";
SetDlgItemText(IDC_PROP_GEN_CREATED, str);
SetDlgItemText(IDC_PROP_GEN_MODIFIED, str);
SetDlgItemText(IDC_PROP_GEN_ACCESSED, str);
}
UpdateData (FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
/////////////////////////////////////////////////////////////////////////////
// CPropertiesSummary property page
CPropertiesSummary::CPropertiesSummary() : CPropertyPage(CPropertiesSummary::IDD)
{
//{{AFX_DATA_INIT(CPropertiesSummary)
m_strAuthor = _T("");
m_strComments = _T("");
m_strDescription = _T("");
//}}AFX_DATA_INIT
}
CPropertiesSummary::~CPropertiesSummary()
{
}
void CPropertiesSummary::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPropertiesSummary)
DDX_Text(pDX, IDC_PROP_SUM_AUTHOR, m_strAuthor);
DDV_MaxChars(pDX, m_strAuthor, 100);
DDX_Text(pDX, IDC_PROP_SUM_COMMENTS, m_strComments);
DDV_MaxChars(pDX, m_strComments, 255);
DDX_Text(pDX, IDC_PROP_SUM_DESCRIPTION, m_strDescription);
DDV_MaxChars(pDX, m_strDescription, 100);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPropertiesSummary, CPropertyPage)
//{{AFX_MSG_MAP(CPropertiesSummary)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPropertiesPieces property page
CPropertiesPieces::CPropertiesPieces() : CPropertyPage(CPropertiesPieces::IDD)
{
//{{AFX_DATA_INIT(CPropertiesPieces)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
CPropertiesPieces::~CPropertiesPieces()
{
}
void CPropertiesPieces::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPropertiesPieces)
DDX_Control(pDX, IDC_PROP_PIECES_LIST, m_List);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPropertiesPieces, CPropertyPage)
//{{AFX_MSG_MAP(CPropertiesPieces)
ON_NOTIFY(LVN_COLUMNCLICK, IDC_PROP_PIECES_LIST, OnColumnclickPropPiecesList)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CPropertiesPieces::OnInitDialog()
{
CPropertyPage::OnInitDialog();
char tmp[64];
int i, j;
memset (&totalcount, 0, sizeof (totalcount));
for (i = 0; i < lines; i++)
for (j = 0; j < LC_MAXCOLORS; j++)
totalcount[j] += count[i*LC_MAXCOLORS+j];
int ID = 0;
m_List.InsertColumn(0, "Piece", LVCFMT_LEFT, 130, 0);
for (i = 0; i < LC_MAXCOLORS; i++)
if (totalcount[i])
{
col[i] = ID;
ID++;
CString str;
str.LoadString(IDS_COLOR01 + i);
m_List.InsertColumn(ID, (LPCSTR)str, LVCFMT_LEFT, 80, 0);
}
else
col[i] = -1;
ID++;
m_List.InsertColumn(ID, "Total", LVCFMT_LEFT, 60, 0);
for (i = 0; i < lines; i++)
{
int total = 0;
for (j = 0; j < LC_MAXCOLORS; j++)
total += count[i*LC_MAXCOLORS+j];
if (total == 0)
continue;
char name[65];
LV_ITEM lvi;
lvi.mask = LVIF_TEXT|LVIF_PARAM;
lvi.iItem = 0;
lvi.iSubItem = 0;
lvi.pszText = name;
lvi.lParam = i;
strcpy (name, names[i]);
int idx = m_List.InsertItem(&lvi);
for (j = 0; j < LC_MAXCOLORS; j++)
// if (totalcount[j])
if (count[i*LC_MAXCOLORS+j])
{
sprintf (tmp, "%d", count[i*LC_MAXCOLORS+j]);
lvi.iItem = idx;
lvi.pszText = tmp;
m_List.SetItemText(idx, col[j] + 1, tmp);
}
sprintf (tmp, "%d", total);
lvi.iItem = idx;
lvi.pszText = tmp;
m_List.SetItemText(idx, ID, tmp);
}
m_List.ModifyStyle(LVS_SORTASCENDING | LVS_SORTDESCENDING, 0L);
char name[65];
strcpy (name, "Total");
LV_ITEM lvi;
lvi.mask = LVIF_TEXT|LVIF_PARAM;
lvi.iItem = m_List.GetItemCount();
lvi.iSubItem = 0;
lvi.pszText = name;
lvi.lParam = -1;
int idx = m_List.InsertItem(&lvi), total = 0;
for (i = 0; i < LC_MAXCOLORS; i++)
if (totalcount[i])
{
sprintf (tmp, "%d", totalcount[i]);
lvi.iItem = idx;
lvi.pszText = tmp;
m_List.SetItemText(idx, col[i] + 1, tmp);
total += totalcount[i];
}
sprintf (tmp, "%d", total);
lvi.iItem = idx;
lvi.pszText = tmp;
m_List.SetItemText(idx, ID, tmp);
return TRUE;
}
typedef struct
{
CPropertiesPieces* page;
int color;
} COMPARE_DATA;
static int CALLBACK ListViewCompareProc(LPARAM lP1, LPARAM lP2, LPARAM lParamData)
{
int i, a, b;
COMPARE_DATA* data = (COMPARE_DATA*)lParamData;
if (data->color == -1)
{
// check if we're comparing the "total" row
if (lP1 == -1)
return 1;
else if (lP2 == -1)
return -1;
return strcmpi(data->page->names[lP1], data->page->names[lP2]);
}
// last column
if (data->color == LC_MAXCOLORS)
{
a = b = 0;
for (i = 0; i < LC_MAXCOLORS; i++)
{
a += data->page->count[lP1*LC_MAXCOLORS+i];
b += data->page->count[lP2*LC_MAXCOLORS+i];
}
}
else
{
if (lP1 == -1)
a = data->page->totalcount[data->color];
else
a = data->page->count[lP1*LC_MAXCOLORS+data->color];
if (lP2 == -1)
b = data->page->totalcount[data->color];
else
b = data->page->count[lP2*LC_MAXCOLORS+data->color];
}
if (a == b)
return 0;
if (a < b)
return -1;
else
return 1;
}
void CPropertiesPieces::OnColumnclickPropPiecesList(NMHDR* pNMHDR, LRESULT* pResult)
{
int i;
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
COMPARE_DATA data;
data.page = this;
if (pNMListView->iSubItem == 0)
data.color = -1;
else
{
for (i = 0; i < LC_MAXCOLORS; i++)
if (col[i] == pNMListView->iSubItem-1)
break;
data.color = i;
}
m_List.SortItems((PFNLVCOMPARE)ListViewCompareProc, (LPARAM)&data);
*pResult = 0;
}