#include "DXFColorChooser.h" ////////////////////////////////////////////////////////////////////////// // Chooser dialog uint32 DXF_COLOR_TABLE[] = { 0x000000, 0x0000FF, 0x00FFFF, 0x00FF00, 0xFFFF00, 0xFF0000, 0xFF00FF, 0xFFFFFF, 0x414141, 0x808080, 0x0000FF, 0xAAAAFF, 0x0000BD, 0x7E7EBD, 0x000081, 0x565681, 0x000068, 0x454568, 0x00004F, 0x35354F, 0x003FFF, 0xAABFFF, 0x002EBD, 0x7E8DBD, 0x001F81, 0x566081, 0x001968, 0x454E68, 0x00134F, 0x353B4F, 0x007FFF, 0xAAD4FF, 0x005EBD, 0x7E9DBD, 0x004081, 0x566B81, 0x003468, 0x455668, 0x00274F, 0x35424F, 0x00BFFF, 0xAAEAFF, 0x008DBD, 0x7EADBD, 0x006081, 0x567681, 0x004E68, 0x455F68, 0x003B4F, 0x35494F, 0x00FFFF, 0xAAFFFF, 0x00BDBD, 0x7EBDBD, 0x008181, 0x568181, 0x006868, 0x456868, 0x004F4F, 0x354F4F, 0x00FFBF, 0xAAFFEA, 0x00BD8D, 0x7EBDAD, 0x008160, 0x568176, 0x00684E, 0x45685F, 0x004F3B, 0x354F49, 0x00FF7F, 0xAAFFD4, 0x00BD5E, 0x7EBD9D, 0x008140, 0x56816B, 0x006834, 0x456856, 0x004F27, 0x354F42, 0x00FF3F, 0xAAFFBF, 0x00BD2E, 0x7EBD8D, 0x00811F, 0x568160, 0x006819, 0x45684E, 0x004F13, 0x354F3B, 0x00FF00, 0xAAFFAA, 0x00BD00, 0x7EBD7E, 0x008100, 0x568156, 0x006800, 0x456845, 0x004F00, 0x354F35, 0x3FFF00, 0xBFFFAA, 0x2EBD00, 0x8DBD7E, 0x1F8100, 0x608156, 0x196800, 0x4E6845, 0x134F00, 0x3B4F35, 0x7FFF00, 0xD4FFAA, 0x5EBD00, 0x9DBD7E, 0x408100, 0x6B8156, 0x346800, 0x566845, 0x274F00, 0x424F35, 0xBFFF00, 0xEAFFAA, 0x8DBD00, 0xADBD7E, 0x608100, 0x768156, 0x4E6800, 0x5F6845, 0x3B4F00, 0x494F35, 0xFFFF00, 0xFFFFAA, 0xBDBD00, 0xBDBD7E, 0x818100, 0x818156, 0x686800, 0x686845, 0x4F4F00, 0x4F4F35, 0xFFBF00, 0xFFEAAA, 0xBD8D00, 0xBDAD7E, 0x816000, 0x817656, 0x684E00, 0x685F45, 0x4F3B00, 0x4F4935, 0xFF7F00, 0xFFD4AA, 0xBD5E00, 0xBD9D7E, 0x814000, 0x816B56, 0x683400, 0x685645, 0x4F2700, 0x4F4235, 0xFF3F00, 0xFFBFAA, 0xBD2E00, 0xBD8D7E, 0x811F00, 0x816056, 0x681900, 0x684E45, 0x4F1300, 0x4F3B35, 0xFF0000, 0xFFAAAA, 0xBD0000, 0xBD7E7E, 0x810000, 0x815656, 0x680000, 0x684545, 0x4F0000, 0x4F3535, 0xFF003F, 0xFFAABF, 0xBD002E, 0xBD7E8D, 0x81001F, 0x815660, 0x680019, 0x68454E, 0x4F0013, 0x4F353B, 0xFF007F, 0xFFAAD4, 0xBD005E, 0xBD7E9D, 0x810040, 0x81566B, 0x680034, 0x684556, 0x4F0027, 0x4F3542, 0xFF00BF, 0xFFAAEA, 0xBD008D, 0xBD7EAD, 0x810060, 0x815676, 0x68004E, 0x68455F, 0x4F003B, 0x4F3549, 0xFF00FF, 0xFFAAFF, 0xBD00BD, 0xBD7EBD, 0x810081, 0x815681, 0x680068, 0x684568, 0x4F004F, 0x4F354F, 0xBF00FF, 0xEAAAFF, 0x8D00BD, 0xAD7EBD, 0x600081, 0x765681, 0x4E0068, 0x5F4568, 0x3B004F, 0x49354F, 0x7F00FF, 0xD4AAFF, 0x5E00BD, 0x9D7EBD, 0x400081, 0x6B5681, 0x340068, 0x564568, 0x27004F, 0x42354F, 0x3F00FF, 0xBFAAFF, 0x2E00BD, 0x8D7EBD, 0x1F0081, 0x605681, 0x190068, 0x4E4568, 0x13004F, 0x3B354F, 0x333333, 0x505050, 0x696969, 0x828282, 0xBEBEBE, 0xFFFFFF }; const char *STD_DXF_COLOR_NAMES[] = { tt_("DXF\vred"), tt_("DXF\vyellow"), tt_("DXF\vgreen"), tt_("DXF\vcyan"), tt_("DXF\vblue"), tt_("DXF\vmagenta"), tt_("DXF\vwhite") }; #define LAYOUTFILE #include // the chooser dialog class DXFColorChooserDlg : public WithDXFColorChooserLayout { private: // fills big colors panes void fillBig(ImageCtrl &ctrl, int startCol); // fills small color panes void fillSmall(ImageCtrl &ctrl, int startCol, int count); // mouse event handler for childs void ChildMouseEvent(Ctrl *ctrl, int event, Point p, int zdelta,dword keyflags); // sets labels with index and rgb color values void SetLabels(int idx); protected: public: typedef DXFColorChooserDlg CLASSNAME; // constructor DXFColorChooserDlg(uint32 c); // the color int color, prevColor; }; // constructor DXFColorChooserDlg::DXFColorChooserDlg(uint32 c) { // initializes layout CtrlLayout(*this); color = prevColor = c; // setup button handlers okBtn.Ok() <<= Acceptor(IDOK); cancelBtn.Cancel() <<= Breaker(IDCANCEL); WhenClose = Breaker(IDCANCEL); fillBig(upperImg, 10); fillBig(lowerImg, 11); fillSmall(firstImg, 1, 9); fillSmall(lastImg, 250, 6); int aCol = DXF_COLOR_TABLE[color & 0xFF]; // correct blue part -- if == 0, upp shows red color as black... if((aCol & 0xff0000) == 0x00) aCol |= 0x010000; prevPreviewImg.Color(Color(aCol, 0)); curPreviewImg.Color(Color(aCol, 0)); if(color >= 1 && color <= 7) colorEdit <<= GetLngString(STD_DXF_COLOR_NAMES[color - 1]); else colorEdit <<= Format("%d", color); colorEdit.SetReadOnly(); colorEdit.NoWantFocus(); } // sets labels with index and rgb color values void DXFColorChooserDlg::SetLabels(int idx) { if(idx == -1) { indexLbl.SetText(t_("DXF\vIndex color :")); rgbLbl.SetText(t_("DXF\vRed,Green,Blue :")); return; } uint32 aCol = DXF_COLOR_TABLE[idx]; int r = GetRValue(aCol); int g = GetGValue(aCol); int b = GetBValue(aCol); indexLbl.SetText(Format(String(t_("DXF\vIndex color :")) + " %d", idx)); rgbLbl.SetText(Format(String(t_("DXF\vRed,Green,Blue :")) + "%d,%d,%d", r, g, b)); Refresh(); // Ctrl::ProcessEvents(); } // mouse event handler for childs void DXFColorChooserDlg::ChildMouseEvent(Ctrl *ctrl, int event, Point p, int zdelta,dword keyflags) { int nextColor = 0; if(ctrl == &upperImg && event != MOUSELEAVE) { Size sz = upperImg.GetSize(); int col = p.x / (sz.cx / 24); int row = 4 - p.y / (sz.cy / 5); nextColor = 10 + ((col * 5) + row) * 2; SetLabels(nextColor); } else if(ctrl == &lowerImg && event != MOUSELEAVE) { Size sz = lowerImg.GetSize(); int col = p.x / (sz.cx / 24); int row = p.y / (sz.cy / 5); nextColor = 11 + ((col * 5) + row) * 2; SetLabels(nextColor); } else if(ctrl == &firstImg && event != MOUSELEAVE) { Size sz = firstImg.GetSize(); int col = p.x / (sz.cx / 9); nextColor = 1 + col; SetLabels(nextColor); } else if(ctrl == &lastImg && event != MOUSELEAVE) { Size sz = lastImg.GetSize(); int col = p.x / (sz.cx / 5); nextColor = 250 + col; SetLabels(nextColor); } else if(ctrl == &curPreviewImg && event != MOUSELEAVE) { nextColor = color; SetLabels(color); } else if(ctrl == &prevPreviewImg && event != MOUSELEAVE) { nextColor = prevColor; SetLabels(prevColor); } else { SetLabels(-1); return; } if(event == LEFTDOWN) { color = nextColor; int aCol = DXF_COLOR_TABLE[color & 0xFF]; // correct blue part -- if == 0, upp shows red color as black... if((aCol & 0xff0000) == 0x00) aCol |= 0x010000; curPreviewImg.Color(Color(aCol, 0)); if(color >= 1 && color <= 7) colorEdit <<= GetLngString(STD_DXF_COLOR_NAMES[color - 1]); else colorEdit <<= Format("%d", color); } } // fills big colors panes void DXFColorChooserDlg::fillBig(ImageCtrl &ctrl, int startCol) { Size imgSize = ctrl.GetSize(); Size spaceSize(imgSize.cx / 24, imgSize.cy / 5); Size boxSize(spaceSize.cx - 2, spaceSize.cy - 2); int dir; if(startCol & 1) dir = -1; else dir = 1; ImageDraw dw(imgSize); dw.DrawRect(0, 0, imgSize.cx, imgSize.cy, SColorFace()); for(int iCol = 0; iCol < 24; iCol++) { for(int iRow = 0; iRow < 5; iRow++) { Point pos; if(dir == 1) pos = Point(spaceSize.cx * iCol, imgSize.cy - spaceSize.cy * (iRow + 1)); else pos = Point(spaceSize.cx * iCol, spaceSize.cy * iRow); pos.x += 1; pos.y += 1; uint32 aCol = DXF_COLOR_TABLE[startCol & 0xFF]; // correct blue part -- if == 0, upp shows red color as black... if((aCol & 0xff0000) == 0x00) aCol |= 0x010000; dw.DrawRect(pos.x, pos.y, boxSize.cx, boxSize.cy, Color(aCol, 0)); startCol += 2; } } ctrl.SetImage(dw); } // fills small color panes void DXFColorChooserDlg::fillSmall(ImageCtrl &ctrl, int startCol, int count) { Size imgSize = ctrl.GetSize(); Size spaceSize(imgSize.cx / count, imgSize.cy); Size boxSize(spaceSize.cx - 2, spaceSize.cy - 2); ImageDraw dw(imgSize); dw.DrawRect(0, 0, imgSize.cx, imgSize.cy, SColorFace()); for(int iCol = 0; iCol < count; iCol++) { Point pos = Point(spaceSize.cx * iCol + 1, 1); uint32 aCol = DXF_COLOR_TABLE[startCol++ & 0xFF]; // correct blue part -- if == 0, upp shows red color as black... if((aCol & 0xff0000) == 0x00) aCol |= 0x010000; dw.DrawRect(pos.x, pos.y, boxSize.cx, boxSize.cy, Color(aCol, 0)); } ctrl.SetImage(dw); } ////////////////////////////////////////////////////////////////////////// // Chooser ctrl // constructor DXFColorChooser::DXFColorChooser() { // white by default color = 7; AddFrame(InsetFrame()); } // paint control void DXFColorChooser::Paint(Draw &w) { Size sz = GetView().GetSize(); Size rectSize(sz.cy - 2, sz.cy - 2); w.DrawLine(1, 1, rectSize.cx + 1, 1, Black()); w.DrawLine(rectSize.cx + 1, 1, rectSize.cx + 1, rectSize.cy + 1, Black()); w.DrawLine(rectSize.cx + 1, rectSize.cy + 1, 1, rectSize.cy + 1, Black()); w.DrawLine(1, rectSize.cy + 1, 1, 1, Black()); uint32 aCol = DXF_COLOR_TABLE[color & 0xFF]; // correct blue part -- if == 0, upp shows red color as black... if((aCol & 0xff0000) == 0x00) aCol |= 0x010000; w.DrawRect(2, 2, rectSize.cx - 2, rectSize.cy - 2, Color(aCol, 0)); int txtPartSize = sz.cx - rectSize.cx - 2; w.DrawRect(rectSize.cx + 2, 0, txtPartSize, sz.cy, White()); String txtCol = color >= 1 && color <= 7 ? GetLngString(STD_DXF_COLOR_NAMES[color - 1]) : Format("%d", color); Size txtSize = GetTextSize(txtCol, StdFont()); w.DrawText(rectSize.cx + (txtPartSize - txtSize.cx) / 2, (sz.cy - txtSize.cy) / 2, txtCol); } // handle mouse clicks void DXFColorChooser::LeftDown(Point p, dword) { DXFColorChooserDlg dlg(color); if(dlg.RunAppModal() == IDOK) { SetColor(dlg.color); WhenAction(); } }