[NEW_FEATURE] Add style transparency feature, rightclick on color to enable.

git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository@170 f5eea248-9336-0410-98b8-ebc06183d4e3
This commit is contained in:
donho 2008-04-19 13:57:57 +00:00
parent 11333a7ec3
commit 12a2f16042
11 changed files with 239 additions and 72 deletions

View File

@ -192,7 +192,7 @@ enum winVer{WV_UNKNOWN, WV_WIN32S, WV_95, WV_98, WV_ME, WV_NT, WV_W2K, WV_XP, WV
// returned value : TRUE if tab bar is hidden, otherwise FALSE
#define NPPM_CHECKDOCSTATUS (NPPMSG + 53)
// VOID NPPM_CHECKDOCSTATUS(TRUE, 0)
// VOID NPPM_CHECKDOCSTATUS(BOOL, 0)
#define NPPM_ENABLECHECKDOCOPT (NPPMSG + 54)
// VOID NPPM_ENABLECHECKDOCOPT(OPT, 0)
@ -209,6 +209,11 @@ enum winVer{WV_UNKNOWN, WV_WIN32S, WV_95, WV_98, WV_ME, WV_NT, WV_W2K, WV_XP, WV
#define NPPM_GETEXTPART (RUNCOMMAND_USER + EXT_PART)
#define NPPM_GETCURRENTWORD (RUNCOMMAND_USER + CURRENT_WORD)
#define NPPM_GETNPPDIRECTORY (RUNCOMMAND_USER + NPP_DIRECTORY)
// BOOL NPPM_GETXXXXXXXXXXXXXXXX(size_t strLen, char *str)
// where str is the allocated char array,
// strLen is the allocated array size
// The return value is TRUE when get string operation success
// Otherwise (allocated array size is too small) FALSE
#define VAR_NOT_RECOGNIZED 0
#define FULL_CURRENT_PATH 1

View File

@ -2421,21 +2421,24 @@ void Notepad_plus::addHotSpot(bool docIsModifing)
int activeFG = 0xFF0000;
char fontName[256];
Style hotspotStyle;
_pEditView->execute(SCI_STYLEGETFONT, idStyle, (LPARAM)fontName);
int fg = _pEditView->execute(SCI_STYLEGETFORE, idStyle);
int bg = _pEditView->execute(SCI_STYLEGETBACK, idStyle);
int fontSize = _pEditView->execute(SCI_STYLEGETSIZE, idStyle);
hotspotStyle._fgColor = _pEditView->execute(SCI_STYLEGETFORE, idStyle);
hotspotStyle._bgColor = _pEditView->execute(SCI_STYLEGETBACK, idStyle);
hotspotStyle._fontSize = _pEditView->execute(SCI_STYLEGETSIZE, idStyle);
int isBold = _pEditView->execute(SCI_STYLEGETBOLD, idStyle);
int isItalic = _pEditView->execute(SCI_STYLEGETITALIC, idStyle);
int isUnderline = _pEditView->execute(SCI_STYLEGETUNDERLINE, idStyle);
hotspotStyle._fontStyle = (isBold?FONTSTYLE_BOLD:0) | (isItalic?FONTSTYLE_ITALIC:0) | (isUnderline?FONTSTYLE_UNDERLINE:0);
int fontStyle = (isBold?FONTSTYLE_BOLD:0) | (isItalic?FONTSTYLE_ITALIC:0) | (isUnderline?FONTSTYLE_UNDERLINE:0);
int urlAction = (NppParameters::getInstance())->getNppGUI()._styleURL;
if (urlAction == 2)
fontStyle |= FONTSTYLE_UNDERLINE;
hotspotStyle._fontStyle |= FONTSTYLE_UNDERLINE;
_pEditView->setStyle(style_hotspot, fg, bg, fontName, fontStyle, fontSize);
_pEditView->setStyle(hotspotStyle);
_pEditView->execute(SCI_STYLESETHOTSPOT, style_hotspot, TRUE);
_pEditView->execute(SCI_SETHOTSPOTACTIVEFORE, TRUE, activeFG);
@ -6801,6 +6804,17 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa
else if (Message == NPPM_GETEXTPART)
fileStr = PathFindExtension(str);
// For the compability reason, if wParam is 0, then we assume the size of string buffer (lParam) is large enough.
// otherwise we check if the string buffer size is enough for the string to copy.
if (wParam != 0)
{
if (strlen(fileStr) >= wParam)
{
::MessageBox(_hSelf, "Allocated buffer size is not enough to copy the string.", "NPPM error", MB_OK);
return FALSE;
}
}
strcpy((char *)lParam, fileStr);
return TRUE;
}
@ -6815,6 +6829,18 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa
_pEditView->expandWordSelection();
_pEditView->getSelectedText(str, strSize, true);
// For the compability reason, if wParam is 0, then we assume the size of string buffer (lParam) is large enough.
// otherwise we check if the string buffer size is enough for the string to copy.
if (wParam != 0)
{
if (strlen(str) >= wParam)
{
::MessageBox(_hSelf, "Allocated buffer size is not enough to copy the string.", "NPPM_GETCURRENTWORD error", MB_OK);
return FALSE;
}
}
strcpy((char *)lParam, str);
return TRUE;
}
@ -6826,6 +6852,18 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa
::GetModuleFileName(NULL, str, strSize);
PathRemoveFileSpec(str);
// For the compability reason, if wParam is 0, then we assume the size of string buffer (lParam) is large enough.
// otherwise we check if the string buffer size is enough for the string to copy.
if (wParam != 0)
{
if (strlen(str) >= wParam)
{
::MessageBox(_hSelf, "Allocated buffer size is not enough to copy the string.", "NPPM_GETNPPDIRECTORY error", MB_OK);
return FALSE;
}
}
strcpy((char *)lParam, str);
return TRUE;
}
@ -8313,3 +8351,4 @@ winVer getWindowsVersion()
return WV_UNKNOWN;
}

View File

@ -1845,6 +1845,12 @@ void StyleArray::addStyler(int styleID, TiXmlNode *styleNode)
unsigned long result = hexStrVal(str);
_styleArray[_nbStyler]._bgColor = (RGB((result >> 16) & 0xFF, (result >> 8) & 0xFF, result & 0xFF)) | (result & 0xFF000000);
}
str = element->Attribute("colorStyle");
if (str)
{
_styleArray[_nbStyler]._colorStyle = decStrVal(str);
}
str = element->Attribute("fontName");
_styleArray[_nbStyler]._fontName = str;
@ -3804,6 +3810,11 @@ void NppParameters::writeStyle2Element(Style & style2Wite, Style & style2Sync, T
element->SetAttribute("bgColor", bgStr);
}
if (style2Wite._colorStyle != COLORSTYLE_ALL)
{
element->SetAttribute("colorStyle", style2Wite._colorStyle);
}
if (style2Wite._fontName)
{
const char *oldFontName = element->Attribute("fontName");
@ -3898,6 +3909,11 @@ void NppParameters::insertUserLang2Tree(TiXmlNode *node, UserLangContainer *user
styleElement->SetAttribute("bgColor", bgStr);
}
if (style2Wite._colorStyle != COLORSTYLE_ALL)
{
styleElement->SetAttribute("colorStyle", style2Wite._colorStyle);
}
if (style2Wite._fontName)
{
styleElement->SetAttribute("fontName", style2Wite._fontName);
@ -4013,3 +4029,4 @@ void NppParameters::addScintillaModifiedIndex(int index)

View File

@ -236,6 +236,10 @@ const int FONTSTYLE_BOLD = 1;
const int FONTSTYLE_ITALIC = 2;
const int FONTSTYLE_UNDERLINE = 4;
const int COLORSTYLE_FOREGROUND = 0x01;
const int COLORSTYLE_BACKGROUND = 0x02;
const int COLORSTYLE_ALL = COLORSTYLE_FOREGROUND|COLORSTYLE_BACKGROUND;
struct Style
{
int _styleID;
@ -243,6 +247,7 @@ struct Style
COLORREF _fgColor;
COLORREF _bgColor;
int _colorStyle;
const char *_fontName;
int _fontStyle;
int _fontSize;
@ -250,7 +255,7 @@ struct Style
int _keywordClass;
string *_keywords;
Style():_styleID(-1), _fgColor(COLORREF(-1)), _bgColor(COLORREF(-1)), _fontName(NULL), _fontStyle(-1), _fontSize(-1), _keywordClass(-1), _keywords(NULL){};
Style():_styleID(-1), _fgColor(COLORREF(-1)), _bgColor(COLORREF(-1)), _colorStyle(COLORSTYLE_ALL), _fontName(NULL), _fontStyle(-1), _fontSize(-1), _keywordClass(-1), _keywords(NULL){};
~Style(){
if (_keywords)
@ -263,6 +268,7 @@ struct Style
_styleDesc = style._styleDesc;
_fgColor = style._fgColor;
_bgColor = style._bgColor;
_colorStyle = style._colorStyle;
_fontName = style._fontName;
_fontSize = style._fontSize;
_fontStyle = style._fontStyle;
@ -280,6 +286,7 @@ struct Style
this->_styleDesc = style._styleDesc;
this->_fgColor = style._fgColor;
this->_bgColor = style._bgColor;
this->_colorStyle = style._colorStyle;
this->_fontName = style._fontName;
this->_fontSize = style._fontSize;
this->_fontStyle = style._fontStyle;

View File

@ -1247,7 +1247,8 @@ void Finder::setFinderStyle()
if (iStyleDefault != -1)
{
Style & styleDefault = stylers.getStyler(iStyleDefault);
_scintView.setStyle(styleDefault._styleID, styleDefault._fgColor, styleDefault._bgColor, styleDefault._fontName, styleDefault._fontStyle, styleDefault._fontSize);
styleDefault._colorStyle = COLORSTYLE_ALL; //All colors set
_scintView.setStyle(styleDefault);
}
_scintView.execute(SCI_STYLECLEARALL);

View File

@ -191,35 +191,35 @@ LRESULT ScintillaEditView::scintillaNew_Proc(HWND hwnd, UINT Message, WPARAM wPa
}
return _callWindowProc(_scintillaDefaultProc, hwnd, Message, wParam, lParam);
}
void ScintillaEditView::setSpecialStyle(int styleID, COLORREF fgColour, COLORREF bgColour, const char *fontName, int fontStyle, int fontSize)
void ScintillaEditView::setSpecialStyle(Style & styleToSet)
{
if (!((fgColour >> 24) & 0xFF))
execute(SCI_STYLESETFORE, styleID, fgColour);
int styleID = styleToSet._styleID;
if ( styleToSet._colorStyle & COLORSTYLE_FOREGROUND )
execute(SCI_STYLESETFORE, styleID, styleToSet._fgColor);
if (!((bgColour >> 24) & 0xFF))
execute(SCI_STYLESETBACK, styleID, bgColour);
if ( styleToSet._colorStyle & COLORSTYLE_BACKGROUND )
execute(SCI_STYLESETBACK, styleID, styleToSet._bgColor);
if ((!fontName)||(strcmp(fontName, "")))
execute(SCI_STYLESETFONT, (WPARAM)styleID, (LPARAM)fontName);
if ((!styleToSet._fontName)||(strcmp(styleToSet._fontName, "")))
execute(SCI_STYLESETFONT, (WPARAM)styleID, (LPARAM)styleToSet._fontName);
int fontStyle = styleToSet._fontStyle;
if (fontStyle != -1)
{
execute(SCI_STYLESETBOLD, (WPARAM)styleID, fontStyle & FONTSTYLE_BOLD);
execute(SCI_STYLESETITALIC, (WPARAM)styleID, fontStyle & FONTSTYLE_ITALIC);
execute(SCI_STYLESETUNDERLINE, (WPARAM)styleID, fontStyle & FONTSTYLE_UNDERLINE);
execute(SCI_STYLESETBOLD, (WPARAM)styleID, fontStyle & FONTSTYLE_BOLD);
execute(SCI_STYLESETITALIC, (WPARAM)styleID, fontStyle & FONTSTYLE_ITALIC);
execute(SCI_STYLESETUNDERLINE, (WPARAM)styleID, fontStyle & FONTSTYLE_UNDERLINE);
}
if (fontSize > 0)
execute(SCI_STYLESETSIZE, styleID, fontSize);
if (styleToSet._fontSize > 0)
execute(SCI_STYLESETSIZE, styleID, styleToSet._fontSize);
}
void ScintillaEditView::setStyle(int styleID, COLORREF fgColour, COLORREF bgColour, const char *fontName, int fontStyle, int fontSize)
void ScintillaEditView::setStyle(Style styleToSet)
{
GlobalOverride & go = _pParameter->getGlobalOverrideStyle();
//go.enableBg = true;
const char *localFn = fontName;
if (go.isEnable())
{
StyleArray & stylers = _pParameter->getMiscStylerArray();
@ -228,42 +228,62 @@ void ScintillaEditView::setStyle(int styleID, COLORREF fgColour, COLORREF bgColo
{
Style & style = stylers.getStyler(i);
if (go.enableFg)
fgColour = style._fgColor;
if (go.enableBg)
bgColour = style._bgColor;
if (go.enableFg) {
if (style._colorStyle & COLORSTYLE_FOREGROUND) {
styleToSet._colorStyle |= COLORSTYLE_FOREGROUND;
styleToSet._fgColor = style._fgColor;
} else {
if (styleToSet._styleID == STYLE_DEFAULT) { //if global is set to transparent, use default style color
styleToSet._colorStyle |= COLORSTYLE_FOREGROUND;
} else {
styleToSet._colorStyle &= ~COLORSTYLE_FOREGROUND;
}
}
}
if (go.enableBg) {
if (style._colorStyle & COLORSTYLE_BACKGROUND) {
styleToSet._colorStyle |= COLORSTYLE_BACKGROUND;
styleToSet._bgColor = style._bgColor;
} else {
if (styleToSet._styleID == STYLE_DEFAULT) { //if global is set to transparent, use default style color
styleToSet._colorStyle |= COLORSTYLE_BACKGROUND;
} else {
styleToSet._colorStyle &= ~COLORSTYLE_BACKGROUND;
}
}
}
if (go.enableFont && style._fontName && style._fontName[0])
localFn = style._fontName;
styleToSet._fontName = style._fontName;
if (go.enableFontSize && (style._fontSize > 0))
fontSize = style._fontSize;
styleToSet._fontSize = style._fontSize;
if (style._fontStyle != -1)
{
if (go.enableBold)
{
if (style._fontStyle & FONTSTYLE_BOLD)
fontStyle |= FONTSTYLE_BOLD;
styleToSet._fontStyle |= FONTSTYLE_BOLD;
else
fontStyle &= ~FONTSTYLE_BOLD;
styleToSet._fontStyle &= ~FONTSTYLE_BOLD;
}
if (go.enableItalic)
{
if (style._fontStyle & FONTSTYLE_ITALIC)
fontStyle |= FONTSTYLE_ITALIC;
styleToSet._fontStyle |= FONTSTYLE_ITALIC;
else
fontStyle &= ~FONTSTYLE_ITALIC;
styleToSet._fontStyle &= ~FONTSTYLE_ITALIC;
}
if (go.enableUnderLine)
{
if (style._fontStyle & FONTSTYLE_UNDERLINE)
fontStyle |= FONTSTYLE_UNDERLINE;
styleToSet._fontStyle |= FONTSTYLE_UNDERLINE;
else
fontStyle &= ~FONTSTYLE_UNDERLINE;
styleToSet._fontStyle &= ~FONTSTYLE_UNDERLINE;
}
}
}
}
setSpecialStyle(styleID, fgColour, bgColour, localFn, fontStyle, fontSize);
setSpecialStyle(styleToSet);
}
@ -361,7 +381,7 @@ void ScintillaEditView::setUserLexer()
for (int i = 0 ; i < userLangContainer._styleArray.getNbStyler() ; i++)
{
Style & style = userLangContainer._styleArray.getStyler(i);
setStyle(style._styleID, style._fgColor, style._bgColor, style._fontName, style._fontStyle, style._fontSize);
setStyle(style);
}
}
@ -387,7 +407,7 @@ void ScintillaEditView::setUserLexer(const char *userLangName)
for (int i = 0 ; i < userLangContainer._styleArray.getNbStyler() ; i++)
{
Style & style = userLangContainer._styleArray.getStyler(i);
setStyle(style._styleID, style._fgColor, style._bgColor, style._fontName, style._fontStyle, style._fontSize);
setStyle(style);
}
}
@ -404,7 +424,7 @@ void ScintillaEditView::setExternalLexer(LangType typeDoc)
{
Style & style = pStyler->getStyler(i);
setStyle(style._styleID, style._fgColor, style._bgColor, style._fontName, style._fontStyle, style._fontSize);
setStyle(style);
if (style._keywordClass >= 0 && style._keywordClass <= KEYWORDSET_MAX)
{
@ -473,7 +493,7 @@ void ScintillaEditView::setCppLexer(LangType langType)
{
for (int i = 0 ; i < pStyler->getNbStyler() ; i++)
{
Style & style = pStyler->getStyler(i);
Style style = pStyler->getStyler(i); //not by reference, but copy
int cppID = style._styleID;
switch (style._styleID)
{
@ -489,7 +509,8 @@ void ScintillaEditView::setCppLexer(LangType langType)
case SCE_HJ_SINGLESTRING : cppID = SCE_C_CHARACTER; break;
case SCE_HJ_REGEX : cppID = SCE_C_REGEX; break;
}
setStyle(cppID, style._fgColor, style._bgColor, style._fontName, style._fontStyle, style._fontSize);
style._styleID = cppID;
setStyle(style);
}
}
execute(SCI_STYLESETEOLFILLED, SCE_C_DEFAULT, true);
@ -617,7 +638,8 @@ void ScintillaEditView::defineDocType(LangType typeDoc)
if (iStyleDefault != -1)
{
Style & styleDefault = stylers.getStyler(iStyleDefault);
setStyle(styleDefault._styleID, styleDefault._fgColor, styleDefault._bgColor, styleDefault._fontName, styleDefault._fontStyle, styleDefault._fontSize);
styleDefault._colorStyle = COLORSTYLE_ALL; //override transparency
setStyle(styleDefault);
}
execute(SCI_STYLECLEARALL);
@ -626,21 +648,21 @@ void ScintillaEditView::defineDocType(LangType typeDoc)
if (iFind != -1)
{
Style & styleFind = stylers.getStyler(iFind);
setSpecialStyle(styleFind._styleID, styleFind._fgColor, styleFind._bgColor, styleFind._fontName, styleFind._fontStyle, styleFind._fontSize);
setSpecialStyle(styleFind);
}
iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_FOUND_STYLE_2);
if (iFind != -1)
{
Style & styleFind = stylers.getStyler(iFind);
setSpecialStyle(styleFind._styleID, styleFind._fgColor, styleFind._bgColor, styleFind._fontName, styleFind._fontStyle, styleFind._fontSize);
setSpecialStyle(styleFind);
}
iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_SELECT_STYLE);
if (iFind != -1)
{
Style & styleFind = stylers.getStyler(iFind);
setSpecialStyle(styleFind._styleID, styleFind._fgColor, styleFind._bgColor, styleFind._fontName, styleFind._fontStyle, styleFind._fontSize);
setSpecialStyle(styleFind);
}
int caretWidth = 1;
@ -703,18 +725,22 @@ void ScintillaEditView::defineDocType(LangType typeDoc)
LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName("nfo");
COLORREF bg = black;
COLORREF fg = liteGrey;
Style nfoStyle;
nfoStyle._styleID = STYLE_DEFAULT;
nfoStyle._fontName = "MS LineDraw";
if (pStyler)
{
int i = pStyler->getStylerIndexByName("DEFAULT");
if (i != -1)
{
Style & style = pStyler->getStyler(i);
bg = style._bgColor;
fg = style._fgColor;
nfoStyle._bgColor = style._bgColor;
nfoStyle._fgColor = style._fgColor;
nfoStyle._colorStyle = style._colorStyle;
}
}
setStyle(STYLE_DEFAULT, fg, bg, "MS LineDraw");
setStyle(nfoStyle);
execute(SCI_STYLECLEARALL);
}
break;
@ -821,14 +847,14 @@ void ScintillaEditView::defineDocType(LangType typeDoc)
if (indexOfIndentGuide != -1)
{
static Style & styleIG = stylers.getStyler(indexOfIndentGuide);
setStyle(styleIG._styleID, styleIG._fgColor, styleIG._bgColor, styleIG._fontName, styleIG._fontStyle, styleIG._fontSize);
setStyle(styleIG);
}
static int indexOfBraceLight = stylers.getStylerIndexByID(STYLE_BRACELIGHT);
if (indexOfBraceLight != -1)
{
static Style & styleBL = stylers.getStyler(indexOfBraceLight);
setStyle(styleBL._styleID, styleBL._fgColor, styleBL._bgColor, styleBL._fontName, styleBL._fontStyle, styleBL._fontSize);
setStyle(styleBL);
}
//setStyle(STYLE_CONTROLCHAR, liteGrey);
@ -836,14 +862,14 @@ void ScintillaEditView::defineDocType(LangType typeDoc)
if (indexBadBrace != -1)
{
static Style & styleBB = stylers.getStyler(indexBadBrace);
setStyle(styleBB._styleID, styleBB._fgColor, styleBB._bgColor, styleBB._fontName, styleBB._fontStyle, styleBB._fontSize);
setStyle(styleBB);
}
static int indexLineNumber = stylers.getStylerIndexByID(STYLE_LINENUMBER);
if (indexLineNumber != -1)
{
static Style & styleLN = stylers.getStyler(indexLineNumber);
setSpecialStyle(styleLN._styleID, styleLN._fgColor, styleLN._bgColor, styleLN._fontName, styleLN._fontStyle, styleLN._fontSize);
setSpecialStyle(styleLN);
}
execute(SCI_SETTABWIDTH, ((NppParameters::getInstance())->getNppGUI())._tabSize);
@ -1273,7 +1299,7 @@ void ScintillaEditView::makeStyle(const char *lexerName, const char **keywordArr
for (int i = 0 ; i < pStyler->getNbStyler() ; i++)
{
Style & style = pStyler->getStyler(i);
setStyle(style._styleID, style._fgColor, style._bgColor, style._fontName, style._fontStyle, style._fontSize);
setStyle(style);
if (keywordArray)
{
if ((style._keywordClass != -1) && (style._keywords))

View File

@ -665,9 +665,9 @@ protected:
bool _wrapRestoreNeeded;
void setStyle(int styleID, COLORREF fgColor, COLORREF bgColor = -1, const char *fontName = NULL, int fontStyle = -1, int fontSize = 0);
void setSpecialStyle(int styleID, COLORREF fgColor, COLORREF bgColor = -1, const char *fontName = NULL, int fontStyle = -1, int fontSize = 0);
void setCppLexer(LangType type);
void setStyle(Style styleToSet); //NOT by reference (style edited)
void setSpecialStyle(Style & styleToSet); //by reference
void setCppLexer(LangType type);
void setXmlLexer(LangType type);
void setUserLexer();
void setUserLexer(const char *userLangName);

View File

@ -92,8 +92,10 @@ void SharedParametersDialog::styleUpdate(const Style & style, ColourPicker *pFgC
int fontComboId, int fontSizeComboId, int boldCheckId, int italicCheckId, int underlineCheckId)
{
pFgColourPicker->setColour((style._fgColor == COLORREF(-1))?black:style._fgColor);
pFgColourPicker->setEnabled((style._colorStyle & COLORSTYLE_FOREGROUND) != 0);
pFgColourPicker->redraw();
pBgColourPicker->setColour((style._bgColor == COLORREF(-1))?white:style._bgColor);
pBgColourPicker->setEnabled((style._colorStyle & COLORSTYLE_BACKGROUND) != 0);
pBgColourPicker->redraw();
HWND hFontCombo = ::GetDlgItem(_hSelf, fontComboId);
@ -217,12 +219,20 @@ BOOL CALLBACK SharedParametersDialog::run_dlgProc(UINT Message, WPARAM wParam, L
if (index != -1)
{
Style & style = _pUserLang->_styleArray.getStyler(index);
if (isFG)
style._fgColor = pCP->getColour();
else
style._bgColor = pCP->getColour();
}
if (isFG) {
style._fgColor = pCP->getColour();
if (pCP->isEnabled())
style._colorStyle |= COLORSTYLE_FOREGROUND;
else
style._colorStyle &= ~COLORSTYLE_FOREGROUND;
} else {
style._bgColor = pCP->getColour();
if (pCP->isEnabled())
style._colorStyle |= COLORSTYLE_BACKGROUND;
else
style._colorStyle &= ~COLORSTYLE_BACKGROUND;
}
}
// A cause de "#define CPN_COLOURPICKED (BN_CLICKED)"
// Nous sommes obligés de mettre ce bloc ici !!!
// A modifier !!!

View File

@ -48,17 +48,46 @@ void ColourPicker::init(HINSTANCE hInst, HWND parent)
}
void ColourPicker::drawSelf(HDC hDC)
void ColourPicker::drawBackground(HDC hDC)
{
PAINTSTRUCT ps;
RECT rc;
HBRUSH hbrush;
if(!hDC)
return;
HDC hdc = hDC?hDC:(::BeginPaint(_hSelf, &ps));
getClientRect(rc);
HBRUSH hbrush = ::CreateSolidBrush(_currentColour);
FillRect(hdc, &rc, hbrush);
hbrush = ::CreateSolidBrush(_currentColour);
HGDIOBJ oldObj = ::SelectObject(hDC, hbrush);
::Rectangle(hDC, 0, 0, rc.right, rc.bottom);
::SelectObject(hDC, oldObj);
//FillRect(hDC, &rc, hbrush);
::DeleteObject(hbrush);
::EndPaint(_hSelf, &ps);
}
void ColourPicker::drawForeground(HDC hDC)
{
RECT rc;
HBRUSH hbrush;
if(!hDC || _isEnabled)
return;
int oldMode = ::SetBkMode(hDC, TRANSPARENT);
getClientRect(rc);
COLORREF strikeOut = RGB(0,0,0);
if ((((_currentColour ) & 0xFF) +
((_currentColour >> 8) & 0xFF) +
((_currentColour >> 16) & 0xFF)) < 200) //check if the color is too dark, if so, use white strikeout
strikeOut = RGB(0xFF,0xFF,0xFF);
if (!_isEnabled)
hbrush = ::CreateHatchBrush(HS_FDIAGONAL, strikeOut);
HGDIOBJ oldObj = ::SelectObject(hDC, hbrush);
::Rectangle(hDC, 0, 0, rc.right, rc.bottom);
::SelectObject(hDC, oldObj);
//FillRect(hDC, &rc, hbrush);
::DeleteObject(hbrush);
::SetBkMode(hDC, oldMode);
}
LRESULT ColourPicker::runProc(UINT Message, WPARAM wParam, LPARAM lParam)
@ -85,10 +114,28 @@ LRESULT ColourPicker::runProc(UINT Message, WPARAM wParam, LPARAM lParam)
}
return TRUE;
}
case WM_RBUTTONDOWN:
{
_isEnabled = !_isEnabled;
redraw();
::SendMessage(_hParent, WM_COMMAND, MAKELONG(0, CPN_COLOURPICKED), (LPARAM)_hSelf);
break;
}
case WM_ERASEBKGND:
{
HDC dc = (HDC)wParam;
drawBackground(dc);
return TRUE;
break;
}
case WM_PAINT :
{
drawSelf((HDC)wParam);
PAINTSTRUCT ps;
HDC dc = ::BeginPaint(_hSelf, &ps);
drawForeground(dc);
::EndPaint(_hSelf, &ps);
return TRUE;
}

View File

@ -29,7 +29,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
class ColourPicker : public Window
{
public :
ColourPicker() : Window(), _currentColour(RGB(0xFF, 0x00, 0x00)), _pColourPopup(NULL){};
ColourPicker() : Window(), _currentColour(RGB(0xFF, 0x00, 0x00)), _pColourPopup(NULL), _isEnabled(true) {};
~ColourPicker(){};
virtual void init(HINSTANCE hInst, HWND parent);
virtual void destroy() {
@ -42,16 +42,21 @@ public :
COLORREF getColour() const {return _currentColour;};
bool isEnabled() {return _isEnabled;};
void setEnabled(bool enabled) {_isEnabled = enabled;};
private :
COLORREF _currentColour;
WNDPROC _buttonDefaultProc;
ColourPopup *_pColourPopup;
bool _isEnabled;
static LRESULT CALLBACK staticWinProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
return (((ColourPicker *)(::GetWindowLong(hwnd, GWL_USERDATA)))->runProc(Message, wParam, lParam));
};
LRESULT runProc(UINT Message, WPARAM wParam, LPARAM lParam);
inline void drawSelf(HDC hDC);
void drawForeground(HDC hDC);
void drawBackground(HDC hDC);
};
#endif // COLOUR_PICKER_H

View File

@ -400,10 +400,18 @@ void WordStyleDlg::updateColour(bool which)
if (which == C_FOREGROUND)
{
style._fgColor = _pFgColour->getColour();
if (_pFgColour->isEnabled())
style._colorStyle |= COLORSTYLE_FOREGROUND;
else
style._colorStyle &= ~COLORSTYLE_FOREGROUND;
}
else //(which == C_BACKGROUND)
{
style._bgColor = _pBgColour->getColour();
if (_pBgColour->isEnabled())
style._colorStyle |= COLORSTYLE_BACKGROUND;
else
style._colorStyle &= ~COLORSTYLE_BACKGROUND;
}
}
@ -581,6 +589,7 @@ void WordStyleDlg::setVisualFromStyleList()
if (HIBYTE(HIWORD(style._fgColor)) != 0xFF)
{
_pFgColour->setColour(style._fgColor);
_pFgColour->setEnabled((style._colorStyle & COLORSTYLE_FOREGROUND) != 0);
isEnable = true;
}
enableFg(isEnable);
@ -589,6 +598,7 @@ void WordStyleDlg::setVisualFromStyleList()
if (HIBYTE(HIWORD(style._bgColor)) != 0xFF)
{
_pBgColour->setColour(style._bgColor);
_pBgColour->setEnabled((style._colorStyle & COLORSTYLE_BACKGROUND) != 0);
isEnable = true;
}
enableBg(isEnable);
@ -706,4 +716,4 @@ void WordStyleDlg::apply()
//_isDirty = false;
_isSync = false;
::SendMessage(_hParent, WM_UPDATESCINTILLAS, 0, 0);
}
}