www.pudn.com > xtable2.zip > XCell.cpp
#include "StdAfx.h"
#include "Xcell.h"
#include "XTable.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
XCell::XCell(XTable* parent)
{
rowSpan = 0;
colSpan = 0;
backColor = RGB (255,255,255);
borderColor = RGB (0xDC,0xDC,0xDC);
borderStyle = 0;
text = "";
textFontSize = 14;
textFontFace = "Arial";
textFont = NULL;
textColor = RGB (0,0,0);
label = "";
labelFontSize = 14;
labelFontFace = "Arial";
labelFont = NULL;
labelColor = RGB (0,0,0);
backMode = TRANSPARENT;
format = 0;
overlap = false;
leftMargin = 4;
rightMargin = 4;
}
XCell::~XCell()
{
delete textFont;
delete labelFont;
}
XCell& XCell::operator = (XCell& cell)
{
if (&cell == this) return *this;
rowSpan = cell.rowSpan;
colSpan = cell.colSpan;
text = cell.text;
textColor = cell.textColor;
delete textFont;
textFont = NULL;
if (cell.textFont)
{
LOGFONT logFont;
cell.textFont->GetLogFont (&logFont);
textFont = new CFont;
textFont->CreateFontIndirect (&logFont);
}
textFontSize = cell.textFontSize;
textFontFace = cell.textFontFace;
label = cell.label;
labelColor = cell.labelColor;
delete labelFont;
labelFont = NULL;
if (cell.labelFont)
{
LOGFONT logFont;
cell.labelFont->GetLogFont (&logFont);
labelFont = new CFont;
labelFont->CreateFontIndirect (&logFont);
}
labelFontSize = cell.labelFontSize;
labelFontFace = cell.labelFontFace;
format = cell.format;
leftMargin = cell.leftMargin;
rightMargin = cell.rightMargin;
backMode = cell.backMode;
backColor = cell.backColor;
borderColor = cell.borderColor;
borderStyle = cell.borderStyle;
overlap = cell.overlap;
table = cell.table;
return *this;
}
int XCell::ToXML (CMarkup& markup)
{
TCHAR buf[32];
if (colSpan > 1)
markup.AddChildAttr ("colSpan", colSpan);
if (rowSpan > 1)
markup.AddChildAttr ("rowSpan", rowSpan);
if (backColor != table->defaultCell.backColor)
{
sprintf (buf, "#%.2x%.2x%.2x", GetRValue(backColor), GetGValue(backColor), GetBValue(backColor));
markup.AddChildAttr ("backColor", buf);
}
if (textColor != table->defaultCell.textColor)
{
sprintf (buf, "#%.2x%.2x%.2x", GetRValue(textColor), GetGValue(textColor), GetBValue(textColor));
markup.AddChildAttr ("textColor", textColor);
}
if (backMode != table->defaultCell.backMode)
{
if (backMode == TRANSPARENT)
markup.AddChildAttr ("backMode", "transparent");
else
markup.AddChildAttr ("backMode", "opaque");
}
if (textFontSize != table->defaultCell.textFontSize)
markup.AddChildAttr ("fontSize", textFontSize);
if (textFontFace != table->defaultCell.textFontFace)
markup.AddChildAttr ("fontFace", textFontFace);
if (textFontSize != table->defaultCell.textFontSize)
markup.AddChildAttr ("fontWeight", textFontSize);
int align = GetAlignment();
if (align != table->defaultCell.GetAlignment())
{
if (align & ALIGN_CENTER)
markup.AddChildAttr("align", "center");
else if (align & ALIGN_RIGHT)
markup.AddChildAttr("align", "right");
if (align & ALIGN_MIDDLE)
markup.AddChildAttr("vlign", "middle");
else if (align & ALIGN_BOTTOM)
markup.AddChildAttr("valign", "bottom");
}
bool ellipsis = GetEllipsis ();
if (ellipsis != table->defaultCell.GetEllipsis())
{
if (ellipsis)
markup.AddChildAttr ("ellipsis", "true");
else
markup.AddChildAttr ("ellipsis", "false");
}
bool singleLine = GetSingleLine();
if (singleLine != table->defaultCell.GetSingleLine ())
{
if (overlap)
markup.AddChildAttr ("singleline", "true");
else
markup.AddChildAttr ("singleline", "false");
}
bool wordBreak = GetWordbreak();
if (wordBreak != table->defaultCell.GetWordbreak ())
{
if (wordBreak)
markup.AddChildAttr ("wordbreak", "true");
else
markup.AddChildAttr ("wordbreak", "false");
}
if (leftMargin != table->defaultCell.leftMargin)
markup.AddChildAttr ("leftMargin", leftMargin);
if (rightMargin != table->defaultCell.rightMargin)
markup.AddChildAttr ("rightMargin", rightMargin);
bool overlap = GetOverlap ();
if (overlap != table->defaultCell.GetOverlap ())
{
if (overlap)
markup.AddChildAttr ("overlap", "true");
else
markup.AddChildAttr ("overlap", "false");
}
if (label != table->defaultCell.label)
markup.AddChildAttr ("label", label);
if (text != "")
markup.SetChildData(text);
return 0;
}
int XCell::FromXML (CMarkup& markup)
{
CString value;
*this = table->defaultCell;
colSpan = 1;
rowSpan = 1;
value = markup.GetChildAttr("colSpan");
if (value != "")
colSpan = atoi (value);
value = markup.GetChildAttr("rowSpan");
if (value != "")
rowSpan = atoi (value);
value = markup.GetChildAttr("backColor");
if (value != "")
{
if (*value == '#')
sscanf(value, "#%x", &backColor);
else
backColor = atoi (value);
backColor = RGB (GetBValue(backColor), GetGValue(backColor), GetRValue(backColor));
}
value = markup.GetChildAttr("textColor");
if (value != "")
{
if (*value == '#')
sscanf(value, "#%x", &textColor);
else
textColor = atoi (value);
textColor = RGB (GetBValue(textColor), GetGValue(textColor), GetRValue(textColor));
}
value = markup.GetChildAttr("fontWeight");
if (value != "")
textFontSize = atoi (value);
value = markup.GetChildAttr("fontFace");
if (value != "")
textFontFace = value;
value = markup.GetChildAttr("backMode");
if (value != "opaque")
backMode = TRANSPARENT;
else
backMode = OPAQUE;
value = markup.GetChildAttr("align");
if (value == "center")
SetAlignment(ALIGN_CENTER);
else if (value == "right")
SetAlignment(ALIGN_RIGHT);
value = markup.GetChildAttr("valign");
if (value == "middle")
SetAlignment(ALIGN_MIDDLE);
else if (value == "bottom")
SetAlignment(ALIGN_BOTTOM);
value = markup.GetChildAttr("ellipsis");
if (value == "true")
SetEllipsis(true);
else
SetEllipsis(false);
value = markup.GetChildAttr("singleline");
if (value == "true")
SetSingleLine(true);
else
SetSingleLine(false);
value = markup.GetChildAttr("wordbreak");
if (value == "true")
SetWordbreak(true);
else
SetWordbreak(false);
value = markup.GetChildAttr("leftMargin");
if (value != "")
leftMargin = atoi (value);
value = markup.GetChildAttr("rightMargin");
if (value != "")
rightMargin = atoi (value);
value = markup.GetChildAttr("overlap");
if (value == "true")
overlap = true;
else
overlap = false;
label = markup.GetChildAttr("label");
text = markup.GetChildData();
if (text != "")
text = markup.GetChildData();
return 0;
}
int XCell::SetSpan(int rows, int cols)
{
rowSpan = rows;
colSpan = cols;
return 0;
}
int XCell::SetText(CString str)
{
text = str;
return 0;
}
CString XCell::GetText()
{
return text;
}
int XCell::SetTextColor(COLORREF color)
{
textColor = color;
return 0;
}
COLORREF XCell::GetTextColor()
{
return textColor;
}
int XCell::SetAlignment (int align)
{
if ( (align & ~ALIGN_MASK) != 0) return -1;
format = (format & ~ALIGN_MASK) | align;
return 0;
}
int XCell::GetAlignment ()
{
return format & ALIGN_MASK;
}
int XCell::SetFormat (int format)
{
this->format = format;
return 0;
}
int XCell::GetFormat ()
{
return format;
}
int XCell::SetSingleLine (bool enable)
{
if (enable)
format |= DT_SINGLELINE;
else
format &= ~DT_SINGLELINE;
return 0;
}
bool XCell::GetSingleLine ()
{
return (format & DT_SINGLELINE) != 0;
}
int XCell::SetWordbreak (bool enable)
{
if (enable)
format |= DT_WORDBREAK;
else
format &= ~DT_WORDBREAK;
return 0;
}
bool XCell::GetWordbreak ()
{
return (format & DT_WORDBREAK) != 0;
}
int XCell::SetEllipsis (bool enable)
{
if (enable)
format |= DT_END_ELLIPSIS;
else
format &= ~DT_END_ELLIPSIS;
return 0;
}
bool XCell::GetEllipsis ()
{
return (format & DT_END_ELLIPSIS) != 0;
}
int XCell::SetLeftMargin (int pixels)
{
leftMargin = pixels;
return 0;
}
int XCell::GetLeftMargin ()
{
return leftMargin;
}
int XCell::SetRightMargin (int pixels)
{
rightMargin = pixels;
return 0;
}
int XCell::GetRightMargin ()
{
return rightMargin;
}
int XCell::SetLabel (CString str)
{
label = str;
return 0;
}
CString XCell::GetLabel ()
{
return label;
}
int XCell::SetOverlap (bool enable)
{
overlap = enable;
return 0;
}
bool XCell::GetOverlap ()
{
return overlap;
}
int XCell::SetTextFont(CFont* font)
{
LOGFONT longfont;
if (!font->GetLogFont(&longfont))
return -1;
if (textFont)
{
delete textFont;
textFont = NULL;
}
textFont = new CFont;
textFont->CreateFontIndirect(&longfont);
return 0;
}
CFont* XCell::GetTextFont()
{
return textFont;
}
int XCell::SetTextFontSize(int size)
{
textFontSize = size;
return 0;
}
int XCell::GetTextFontSize()
{
return textFontSize;
}
int XCell::SetLabelColor(COLORREF color)
{
labelColor = color;
return 0;
}
COLORREF XCell::GetLabelColor()
{
return labelColor;
}
int XCell::SetLabelFont(CFont* font)
{
LOGFONT logfont;
if (!font->GetLogFont(&logfont))
return -1;
if (labelFont)
{
labelFont->DeleteObject();
labelFont = NULL;
}
labelFont = new CFont;
labelFont->CreateFontIndirect(&logfont);
return 0;
}
CFont* XCell::GetLabelFont()
{
return labelFont;
}
int XCell::SetLabelFontSize(int size)
{
labelFontSize = size;
return 0;
}
int XCell::GetLabelFontSize()
{
return labelFontSize;
}
int XCell::SetBackMode(int mode)
{
backMode = mode;
return 0;
}
int XCell::GetBackMode()
{
return backMode;
}
int XCell::SetBackColor(COLORREF color)
{
backColor = color;
return 0;
}
COLORREF XCell::GetBackColor()
{
return backColor;
}
int XCell::SetBorderSyle(int syle)
{
borderStyle = syle;
return 0;
}
int XCell::GetBorderSyle()
{
return borderStyle;
}
int XCell::DrawText(CDC* pDC, RECT rect)
{
if (text.IsEmpty()) return 0;
COLORREF oldTextColor = pDC->SetTextColor (textColor);
int oldBkMode = pDC->SetBkMode (backMode);
CFont* oldFont;
CFont tempFont;
if (textFont)
oldFont = pDC->SelectObject (textFont);
else
{
tempFont.CreateFont (textFontSize,0,0, 0, FW_NORMAL, FALSE, FALSE, 0,
ANSI_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, textFontFace);
oldFont = pDC->SelectObject (&tempFont);
}
if (leftMargin)
rect.left += leftMargin;
if (rightMargin)
rect.right -= rightMargin;
pDC->DrawText (text, &rect, format);
pDC->SetTextColor(oldTextColor);
pDC->SetBkMode (oldBkMode);
pDC->SelectObject (oldFont);
tempFont.DeleteObject ();
return 0;
}
int XCell::DrawLabel(CDC* pDC, RECT rect)
{
return 0;
}
int XCell::Draw(CDC* pDC, RECT rect)
{
DrawBorder (pDC, rect);
RECT rect1;
rect1.left = rect.left+1;
rect1.top = rect.top+1;
rect1.right = rect.right;
rect1.bottom = rect.bottom;
DrawBackground (pDC, rect1);
DrawText (pDC, rect1);
return 0;
}
int XCell::DrawBorder(CDC* pDC, RECT rect)
{
CPen linePen (PS_SOLID, 1, borderColor);
CPen* pOldPen = pDC->SelectObject(&linePen);
pDC->MoveTo (rect.left, rect.top);
pDC->LineTo (rect.right, rect.top);
pDC->LineTo (rect.right, rect.bottom);
pDC->LineTo (rect.left, rect.bottom);
pDC->LineTo (rect.left, rect.top);
pDC->SelectObject(pOldPen);
return 0;
}
int XCell::DrawHitBorder (CDC* pDC, RECT rect, COLORREF color)
{
CPen pen (PS_SOLID, 3, color);
CPen* oldPen = pDC->SelectObject(&pen);
pDC->MoveTo (rect.left, rect.top);
pDC->LineTo (rect.right, rect.top);
pDC->LineTo (rect.right, rect.bottom);
pDC->LineTo (rect.left, rect.bottom);
pDC->LineTo (rect.left, rect.top);
pDC->SelectObject(oldPen);
return 0;
}
int XCell::DrawBackground (CDC* pDC, RECT rect)
{
CBrush bkBrush (backColor);
pDC->FillRect (&rect, &bkBrush);
return 0;
}
int XCell::CalcTextRect (CDC* pDC, RECT* rect)
{
CFont* oldFont;
CFont tempFont;
if (textFont)
oldFont = pDC->SelectObject (textFont);
else
{
tempFont.CreateFont (textFontSize,0,0, 0, FW_NORMAL, FALSE, FALSE, 0,
ANSI_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, textFontFace);
oldFont = pDC->SelectObject (&tempFont);
}
if (leftMargin)
rect->left += leftMargin;
pDC->DrawText (text, rect, format | DT_CALCRECT);
pDC->SelectObject (oldFont);
tempFont.DeleteObject ();
return 0;
}