diff --git a/PowerEditor/src/MISC/PluginsManager/Notepad_plus_msgs.h b/PowerEditor/src/MISC/PluginsManager/Notepad_plus_msgs.h index 847ea66ae..f0a769fc9 100644 --- a/PowerEditor/src/MISC/PluginsManager/Notepad_plus_msgs.h +++ b/PowerEditor/src/MISC/PluginsManager/Notepad_plus_msgs.h @@ -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 diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index d52a3376a..c3ba1936f 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -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; } + diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index 439ccc624..495efe723 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -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) + diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h index c0d239422..687f8807b 100644 --- a/PowerEditor/src/Parameters.h +++ b/PowerEditor/src/Parameters.h @@ -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; diff --git a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp index bb2aee52a..c5fa822f6 100644 --- a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp +++ b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp @@ -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); diff --git a/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp b/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp index e1a864d8c..5043c6620 100644 --- a/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp +++ b/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp @@ -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)) diff --git a/PowerEditor/src/ScitillaComponent/ScintillaEditView.h b/PowerEditor/src/ScitillaComponent/ScintillaEditView.h index 6dcef1104..2c0b49147 100644 --- a/PowerEditor/src/ScitillaComponent/ScintillaEditView.h +++ b/PowerEditor/src/ScitillaComponent/ScintillaEditView.h @@ -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); diff --git a/PowerEditor/src/ScitillaComponent/UserDefineDialog.cpp b/PowerEditor/src/ScitillaComponent/UserDefineDialog.cpp index 845e8ebb3..47521a56a 100644 --- a/PowerEditor/src/ScitillaComponent/UserDefineDialog.cpp +++ b/PowerEditor/src/ScitillaComponent/UserDefineDialog.cpp @@ -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 !!! diff --git a/PowerEditor/src/WinControls/ColourPicker/ColourPicker.cpp b/PowerEditor/src/WinControls/ColourPicker/ColourPicker.cpp index 4d7a0e791..ff7516176 100644 --- a/PowerEditor/src/WinControls/ColourPicker/ColourPicker.cpp +++ b/PowerEditor/src/WinControls/ColourPicker/ColourPicker.cpp @@ -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; } diff --git a/PowerEditor/src/WinControls/ColourPicker/ColourPicker.h b/PowerEditor/src/WinControls/ColourPicker/ColourPicker.h index 6717a7849..9b01aab51 100644 --- a/PowerEditor/src/WinControls/ColourPicker/ColourPicker.h +++ b/PowerEditor/src/WinControls/ColourPicker/ColourPicker.h @@ -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 diff --git a/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.cpp b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.cpp index 02be67305..34bd2aa4b 100644 --- a/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.cpp +++ b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.cpp @@ -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); -} \ No newline at end of file +}