#include #include "xuigrid.h" #include // ----------------------------------------------------------------------- const wchar_t GridXuiObjectStr[] = L"Grid"; // xml tag char GridXuiSvcName[] = "Grid xui object"; XMLParamPair Grid::params[] = { { GRID_SETTOPLEFT, L"TOPLEFT"}, { GRID_SETTOP, L"TOP"}, { GRID_SETTOPRIGHT, L"TOPRIGHT"}, { GRID_SETLEFT, L"LEFT"}, { GRID_SETMIDDLE, L"MIDDLE"}, { GRID_SETRIGHT, L"RIGHT"}, { GRID_SETBOTTOMLEFT, L"BOTTOMLEFT"}, { GRID_SETBOTTOM, L"BOTTOM"}, { GRID_SETBOTTOMRIGHT, L"BOTTOMRIGHT"}, }; // ----------------------------------------------------------------------- Grid::Grid() { setRectRgn(1); myxuihandle = newXuiHandle(); CreateXMLParameters(myxuihandle); } void Grid::CreateXMLParameters(int master_handle) { //GRID_PARENT::CreateXMLParameters(master_handle); int numParams = sizeof(params) / sizeof(params[0]); hintNumberOfParams(myxuihandle, numParams); for (int i = 0;i < numParams;i++) addParam(myxuihandle, params[i], XUI_ATTRIBUTE_IMPLIED); } // ----------------------------------------------------------------------- Grid::~Grid() { } // ----------------------------------------------------------------------- int Grid::onInit() { GRID_PARENT::onInit(); doPaint(NULL, 1); // computes the region invalidateWindowRegion(); return 1; } // ----------------------------------------------------------------------- int Grid::onResize() { GRID_PARENT::onResize(); doPaint(NULL, 1); invalidateWindowRegion(); return 1; } // ----------------------------------------------------------------------- int Grid::setXuiParam(int xuihandle, int xmlattributeid, const wchar_t *xmlattributename, const wchar_t *value) { if (xuihandle != myxuihandle) return GRID_PARENT::setXuiParam(xuihandle, xmlattributeid, xmlattributename, value); switch (xmlattributeid) { case GRID_SETTOPLEFT: case GRID_SETTOP: case GRID_SETTOPRIGHT: case GRID_SETLEFT: case GRID_SETMIDDLE: case GRID_SETRIGHT: case GRID_SETBOTTOMLEFT: case GRID_SETBOTTOM: case GRID_SETBOTTOMRIGHT: setGridImage(value, xmlattributeid); break; default: return 0; } return 1; } // ----------------------------------------------------------------------- void Grid::setGridImage(const wchar_t *elementname, int what) { switch (what) { case GRID_SETTOPLEFT: topleft = elementname; break; case GRID_SETTOP: top = elementname; break; case GRID_SETTOPRIGHT: topright = elementname; break; case GRID_SETLEFT: left = elementname; break; case GRID_SETMIDDLE: middle = elementname; break; case GRID_SETRIGHT: right = elementname; break; case GRID_SETBOTTOMLEFT: bottomleft = elementname; break; case GRID_SETBOTTOM: bottom = elementname; break; case GRID_SETBOTTOMRIGHT: bottomright = elementname; break; default: return; } if (isInited()) invalidate(); } // ----------------------------------------------------------------------- int Grid::onPaint(Canvas *canvas) { GRID_PARENT::onPaint(canvas); doPaint(canvas, 0); return 1; } void Grid::doPaint(Canvas *canvas, int dorgn) { RECT r; getGridRect(&r); SkinBitmap *left_bm = left.getBitmap(); SkinBitmap *middle_bm = middle.getBitmap(); SkinBitmap *right_bm = right.getBitmap(); SkinBitmap *topleft_bm = topleft.getBitmap(); SkinBitmap *top_bm = top.getBitmap(); SkinBitmap *topright_bm = topright.getBitmap(); SkinBitmap *bottomleft_bm = bottomleft.getBitmap(); SkinBitmap *bottom_bm = bottom.getBitmap(); SkinBitmap *bottomright_bm = bottomright.getBitmap(); int left_w = left_bm ? left_bm->getWidth() : 0; int left_h = left_bm ? left_bm->getHeight() : 0; int top_h = top_bm ? top_bm->getHeight() : 0; int top_w = top_bm ? top_bm->getWidth() : 0; int topleft_h = topleft_bm ? topleft_bm->getHeight() : 0; int topright_h = topright_bm ? topright_bm->getHeight() : 0; int topleft_w = topleft_bm ? topleft_bm->getWidth() : 0; int topright_w = topright_bm ? topright_bm->getWidth() : 0; int right_w = right_bm ? right_bm->getWidth() : 0; int right_h = right_bm ? right_bm->getHeight() : 0; int bottom_h = bottom_bm ? bottom_bm->getHeight() : 0; int bottom_w = bottom_bm ? bottom_bm->getWidth() : 0; int bottomleft_h = bottomleft_bm ? bottom_bm->getHeight() : 0; int bottomright_h = bottomright_bm ? bottom_bm->getHeight() : 0; int bottomleft_w = bottomleft_bm ? bottomleft_bm->getWidth() : 0; int bottomright_w = bottomright_bm ? bottomright_bm->getWidth() : 0; int middle_w = middle_bm ? middle_bm->getWidth() : 0; int middle_h = middle_bm ? middle_bm->getHeight() : 0; RECT cell; if (dorgn) reg.empty(); int paintingAlpha = 0; if (canvas) paintingAlpha = getPaintingAlpha(); // topleft if (topleft_bm) { cell.left = r.left; cell.top = r.top; cell.right = cell.left + topleft_w; cell.bottom = r.top + topleft_h; if (canvas) topleft_bm->stretchToRectAlpha(canvas, &cell, paintingAlpha); if (dorgn) { RegionI _r(topleft); _r.offset(cell.left-r.left, cell.top-r.top); reg.addRegion(&_r); } } // top if (top_bm) { cell.left = r.left + topleft_w; cell.top = r.top; cell.right = r.right - topright_w; cell.bottom = r.top + top_h; if (canvas) top_bm->stretchToRectAlpha(canvas, &cell, paintingAlpha); if (dorgn && cell.left != cell.right) { RegionI _r(top); _r.scale((double)(cell.right-cell.left) / top_w, 1); _r.offset(cell.left-r.left, cell.top-r.top); reg.addRegion(&_r); } } // topright if (topright_bm) { cell.left = r.right - topright_w; cell.top = r.top; cell.right = r.right; cell.bottom = r.top + topright_h; if (canvas) topright_bm->stretchToRectAlpha(canvas, &cell, paintingAlpha); if (dorgn) { RegionI _r(topright); _r.offset(cell.left-r.left, cell.top-r.top); reg.addRegion(&_r); } } // left if (left_bm) { cell.left = r.left; cell.top = r.top + topleft_h; cell.right = r.left + left_w; cell.bottom = r.bottom - bottomleft_h; if (canvas) left_bm->stretchToRectAlpha(canvas, &cell, paintingAlpha); if (dorgn && cell.bottom != cell.top) { RegionI _r(left); _r.scale(1, (double)(cell.bottom-cell.top) / left_h); _r.offset(cell.left-r.left, cell.top-r.top); reg.addRegion(&_r); } } // middle if (middle_bm) { cell.left = r.left + left_w; cell.top = r.top + top_h; cell.right = r.right - right_w; cell.bottom = r.bottom - bottom_h; if (canvas) middle_bm->stretchToRectAlpha(canvas, &cell, paintingAlpha); if (dorgn && cell.left != cell.right && cell.bottom != cell.top) { RegionI _r(middle); _r.scale((double)(cell.right-cell.left) / middle_w, (double)(cell.bottom-cell.top) / middle_h); _r.offset(cell.left-r.left, cell.top-r.top); reg.addRegion(&_r); } } // right if (right_bm) { cell.left = r.right - right_w; cell.top = r.top + top_h; cell.right = r.right; cell.bottom = r.bottom - bottomright_h; if (canvas) right_bm->stretchToRectAlpha(canvas, &cell, paintingAlpha); if (dorgn && cell.bottom != cell.top) { RegionI _r(right); _r.scale(1, (double)(cell.bottom-cell.top) / right_h); _r.offset(cell.left-r.left, cell.top-r.top); reg.addRegion(&_r); } } // bottomleft if (bottomleft_bm) { cell.left = r.left; cell.top = r.bottom - bottomleft_h; cell.right = r.left + bottomleft_w; cell.bottom = r.bottom; if (canvas) bottomleft_bm->stretchToRectAlpha(canvas, &cell, paintingAlpha); if (dorgn) { RegionI _r(bottomleft); _r.offset(cell.left-r.left, cell.top-r.top); reg.addRegion(&_r); } } // bottom if (bottom_bm) { cell.left = r.left + bottomleft_w; cell.top = r.bottom - bottom_h; cell.right = r.right - bottomright_w; cell.bottom = r.bottom; if (canvas) bottom_bm->stretchToRectAlpha(canvas, &cell, paintingAlpha); if (dorgn && cell.right != cell.left) { RegionI _r(bottom); _r.scale((double)(cell.right-cell.left) / bottom_w, 1); _r.offset(cell.left-r.left, cell.top-r.top); reg.addRegion(&_r); } } // bottomright if (bottomright_bm) { cell.left = r.right - bottomright_w; cell.top = r.bottom - bottomright_h; cell.right = r.right; cell.bottom = r.bottom; if (canvas) bottomright_bm->stretchToRectAlpha(canvas, &cell, paintingAlpha); if (dorgn) { RegionI _r(bottomright); _r.offset(cell.left-r.left, cell.top-r.top); reg.addRegion(&_r); } } }