diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Document.cxx | 6 | ||||
| -rw-r--r-- | src/Editor.cxx | 210 | ||||
| -rw-r--r-- | src/Editor.h | 2 | ||||
| -rw-r--r-- | src/ViewStyle.cxx | 79 | ||||
| -rw-r--r-- | src/ViewStyle.h | 7 | 
5 files changed, 153 insertions, 151 deletions
| diff --git a/src/Document.cxx b/src/Document.cxx index cfcda92be..51800b905 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -1271,11 +1271,7 @@ void Document::SetCharClasses(const unsigned char *chars, CharClassify::cc newCh  void Document::SetStylingBits(int bits) {  	stylingBits = bits; -	stylingBitsMask = 0; -	for (int bit = 0; bit < stylingBits; bit++) { -		stylingBitsMask <<= 1; -		stylingBitsMask |= 1; -	} +	stylingBitsMask = (1 << stylingBits) - 1;  }  void Document::StartStyling(int position, char mask) { diff --git a/src/Editor.cxx b/src/Editor.cxx index 9c4c77d3c..c4e86fb09 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -5662,6 +5662,89 @@ static char *CharPtrFromSPtr(sptr_t lParam) {  	return reinterpret_cast<char *>(lParam);  } +void Editor::StyleSetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { +	vs.EnsureStyle(wParam); +	switch (iMessage) { +	case SCI_STYLESETFORE: +		vs.styles[wParam].fore.desired = ColourDesired(lParam); +		break; +	case SCI_STYLESETBACK: +		vs.styles[wParam].back.desired = ColourDesired(lParam); +		break; +	case SCI_STYLESETBOLD: +		vs.styles[wParam].bold = lParam != 0; +		break; +	case SCI_STYLESETITALIC: +		vs.styles[wParam].italic = lParam != 0; +		break; +	case SCI_STYLESETEOLFILLED: +		vs.styles[wParam].eolFilled = lParam != 0; +		break; +	case SCI_STYLESETSIZE: +		vs.styles[wParam].size = lParam; +		break; +	case SCI_STYLESETFONT: +		if (lParam != 0) { +			vs.SetStyleFontName(wParam, CharPtrFromSPtr(lParam)); +		} +		break; +	case SCI_STYLESETUNDERLINE: +		vs.styles[wParam].underline = lParam != 0; +		break; +	case SCI_STYLESETCASE: +		vs.styles[wParam].caseForce = static_cast<Style::ecaseForced>(lParam); +		break; +	case SCI_STYLESETCHARACTERSET: +		vs.styles[wParam].characterSet = lParam; +		break; +	case SCI_STYLESETVISIBLE: +		vs.styles[wParam].visible = lParam != 0; +		break; +	case SCI_STYLESETCHANGEABLE: +		vs.styles[wParam].changeable = lParam != 0; +		break; +	case SCI_STYLESETHOTSPOT: +		vs.styles[wParam].hotspot = lParam != 0; +		break; +	} +	InvalidateStyleRedraw(); +} + +sptr_t Editor::StyleGetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { +	vs.EnsureStyle(wParam); +	switch (iMessage) { +	case SCI_STYLEGETFORE: +		return vs.styles[wParam].fore.desired.AsLong(); +	case SCI_STYLEGETBACK: +		return vs.styles[wParam].back.desired.AsLong(); +	case SCI_STYLEGETBOLD: +		return vs.styles[wParam].bold ? 1 : 0; +	case SCI_STYLEGETITALIC: +		return vs.styles[wParam].italic ? 1 : 0; +	case SCI_STYLEGETEOLFILLED: +		return vs.styles[wParam].eolFilled ? 1 : 0; +	case SCI_STYLEGETSIZE: +		return vs.styles[wParam].size; +	case SCI_STYLEGETFONT: +		if (lParam != 0) +			strcpy(CharPtrFromSPtr(lParam), vs.styles[wParam].fontName); +		return strlen(vs.styles[wParam].fontName); +	case SCI_STYLEGETUNDERLINE: +		return vs.styles[wParam].underline ? 1 : 0; +	case SCI_STYLEGETCASE: +		return static_cast<int>(vs.styles[wParam].caseForce); +	case SCI_STYLEGETCHARACTERSET: +		return vs.styles[wParam].characterSet; +	case SCI_STYLEGETVISIBLE: +		return vs.styles[wParam].visible ? 1 : 0; +	case SCI_STYLEGETCHANGEABLE: +		return vs.styles[wParam].changeable ? 1 : 0; +	case SCI_STYLEGETHOTSPOT: +		return vs.styles[wParam].hotspot ? 1 : 0; +	} +	return 0; +} +  sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  	//Platform::DebugPrintf("S start wnd proc %d %d %d\n",iMessage, wParam, lParam); @@ -6406,7 +6489,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  		break;  	case SCI_TEXTWIDTH: -		PLATFORM_ASSERT(wParam <= STYLE_MAX); +		PLATFORM_ASSERT(wParam <= vs.stylesSize);  		PLATFORM_ASSERT(lParam);  		return TextWidth(wParam, CharPtrFromSPtr(lParam)); @@ -6635,157 +6718,42 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  		break;  	case SCI_STYLESETFORE: -		if (wParam <= STYLE_MAX) { -			vs.styles[wParam].fore.desired = ColourDesired(lParam); -			InvalidateStyleRedraw(); -		} -		break;  	case SCI_STYLESETBACK: -		if (wParam <= STYLE_MAX) { -			vs.styles[wParam].back.desired = ColourDesired(lParam); -			InvalidateStyleRedraw(); -		} -		break;  	case SCI_STYLESETBOLD: -		if (wParam <= STYLE_MAX) { -			vs.styles[wParam].bold = lParam != 0; -			InvalidateStyleRedraw(); -		} -		break;  	case SCI_STYLESETITALIC: -		if (wParam <= STYLE_MAX) { -			vs.styles[wParam].italic = lParam != 0; -			InvalidateStyleRedraw(); -		} -		break;  	case SCI_STYLESETEOLFILLED: -		if (wParam <= STYLE_MAX) { -			vs.styles[wParam].eolFilled = lParam != 0; -			InvalidateStyleRedraw(); -		} -		break;  	case SCI_STYLESETSIZE: -		if (wParam <= STYLE_MAX) { -			vs.styles[wParam].size = lParam; -			InvalidateStyleRedraw(); -		} -		break;  	case SCI_STYLESETFONT: -		if (lParam == 0) -			return 0; -		if (wParam <= STYLE_MAX) { -			vs.SetStyleFontName(wParam, CharPtrFromSPtr(lParam)); -			InvalidateStyleRedraw(); -		} -		break;  	case SCI_STYLESETUNDERLINE: -		if (wParam <= STYLE_MAX) { -			vs.styles[wParam].underline = lParam != 0; -			InvalidateStyleRedraw(); -		} -		break;  	case SCI_STYLESETCASE: -		if (wParam <= STYLE_MAX) { -			vs.styles[wParam].caseForce = static_cast<Style::ecaseForced>(lParam); -			InvalidateStyleRedraw(); -		} -		break;  	case SCI_STYLESETCHARACTERSET: -		if (wParam <= STYLE_MAX) { -			vs.styles[wParam].characterSet = lParam; -			InvalidateStyleRedraw(); -		} -		break;  	case SCI_STYLESETVISIBLE: -		if (wParam <= STYLE_MAX) { -			vs.styles[wParam].visible = lParam != 0; -			InvalidateStyleRedraw(); -		} -		break;  	case SCI_STYLESETCHANGEABLE: -		if (wParam <= STYLE_MAX) { -			vs.styles[wParam].changeable = lParam != 0; -			InvalidateStyleRedraw(); -		} -		break;  	case SCI_STYLESETHOTSPOT: -		if (wParam <= STYLE_MAX) { -			vs.styles[wParam].hotspot = lParam != 0; -			InvalidateStyleRedraw(); -		} +		StyleSetMessage(iMessage, wParam, lParam);  		break; +  	case SCI_STYLEGETFORE: -		if (wParam <= STYLE_MAX) -			return vs.styles[wParam].fore.desired.AsLong(); -		else -			return 0;  	case SCI_STYLEGETBACK: -		if (wParam <= STYLE_MAX) -			return vs.styles[wParam].back.desired.AsLong(); -		else -			return 0;  	case SCI_STYLEGETBOLD: -		if (wParam <= STYLE_MAX) -			return vs.styles[wParam].bold ? 1 : 0; -		else -			return 0;  	case SCI_STYLEGETITALIC: -		if (wParam <= STYLE_MAX) -			return vs.styles[wParam].italic ? 1 : 0; -		else -			return 0;  	case SCI_STYLEGETEOLFILLED: -		if (wParam <= STYLE_MAX) -			return vs.styles[wParam].eolFilled ? 1 : 0; -		else -			return 0;  	case SCI_STYLEGETSIZE: -		if (wParam <= STYLE_MAX) -			return vs.styles[wParam].size; -		else -			return 0;  	case SCI_STYLEGETFONT: -		if (lParam == 0) -			return strlen(vs.styles[wParam].fontName); - -		if (wParam <= STYLE_MAX) -			strcpy(CharPtrFromSPtr(lParam), vs.styles[wParam].fontName); -		break;  	case SCI_STYLEGETUNDERLINE: -		if (wParam <= STYLE_MAX) -			return vs.styles[wParam].underline ? 1 : 0; -		else -			return 0;  	case SCI_STYLEGETCASE: -		if (wParam <= STYLE_MAX) -			return static_cast<int>(vs.styles[wParam].caseForce); -		else -			return 0;  	case SCI_STYLEGETCHARACTERSET: -		if (wParam <= STYLE_MAX) -			return vs.styles[wParam].characterSet; -		else -			return 0;  	case SCI_STYLEGETVISIBLE: -		if (wParam <= STYLE_MAX) -			return vs.styles[wParam].visible ? 1 : 0; -		else -			return 0;  	case SCI_STYLEGETCHANGEABLE: -		if (wParam <= STYLE_MAX) -			return vs.styles[wParam].changeable ? 1 : 0; -		else -			return 0;  	case SCI_STYLEGETHOTSPOT: -		if (wParam <= STYLE_MAX) -			return vs.styles[wParam].hotspot ? 1 : 0; -		else -			return 0; +		return StyleGetMessage(iMessage, wParam, lParam); +  	case SCI_STYLERESETDEFAULT:  		vs.ResetDefaultStyle();  		InvalidateStyleRedraw();  		break;  	case SCI_SETSTYLEBITS: +		vs.EnsureStyle((1 << wParam) - 1);  		pdoc->SetStylingBits(wParam);  		break; diff --git a/src/Editor.h b/src/Editor.h index 213b0e361..501abb632 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -454,6 +454,8 @@ protected:	// ScintillaBase subclass needs access to much of Editor  	void AddStyledText(char *buffer, int appendLength);  	virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) = 0; +	void StyleSetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam); +	sptr_t StyleGetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam);  public:  	// Public so the COM thunks can access it. diff --git a/src/ViewStyle.cxx b/src/ViewStyle.cxx index 8f51fd5b9..f73c15ed1 100644 --- a/src/ViewStyle.cxx +++ b/src/ViewStyle.cxx @@ -29,15 +29,15 @@ MarginStyle::MarginStyle() :  // A list of the fontnames - avoids wasting space in each style  FontNames::FontNames() { -    size = 8; -    names = new char *[size]; +	size = 8; +	names = new char *[size];  	max = 0;  }  FontNames::~FontNames() {  	Clear(); -    delete []names; -    names = 0; +	delete []names; +	names = 0;  }  void FontNames::Clear() { @@ -55,17 +55,17 @@ const char *FontNames::Save(const char *name) {  			return names[i];  		}  	} -    if (max >= size) { -        // Grow array -        int sizeNew = size * 2; -        char **namesNew = new char *[sizeNew]; -    	for (int j=0;j<max;j++) { -            namesNew[j] = names[j]; -        } -        delete []names; -        names = namesNew; -        size = sizeNew; -    } +	if (max >= size) { +		// Grow array +		int sizeNew = size * 2; +		char **namesNew = new char *[sizeNew]; +		for (int j=0;j<max;j++) { +			namesNew[j] = names[j]; +		} +		delete []names; +		names = namesNew; +		size = sizeNew; +	}  	names[max] = new char[strlen(name) + 1];  	strcpy(names[max], name);  	max++; @@ -77,8 +77,8 @@ ViewStyle::ViewStyle() {  }  ViewStyle::ViewStyle(const ViewStyle &source) { -	Init(); -	for (unsigned int sty=0;sty<(sizeof(styles)/sizeof(styles[0]));sty++) { +	Init(source.stylesSize); +	for (unsigned int sty=0;sty<source.stylesSize;sty++) {  		styles[sty] = source.styles[sty];  		// Can't just copy fontname as its lifetime is relative to its owning ViewStyle  		styles[sty].fontName = fontNames.Save(source.styles[sty].fontName); @@ -142,9 +142,14 @@ ViewStyle::ViewStyle(const ViewStyle &source) {  }  ViewStyle::~ViewStyle() { +	delete []styles; +	styles = NULL;  } -void ViewStyle::Init() { +void ViewStyle::Init(size_t stylesSize_) { +	stylesSize = 0; +	styles = NULL; +	AllocStyles(stylesSize_);  	fontNames.Clear();  	ResetDefaultStyle(); @@ -232,7 +237,7 @@ void ViewStyle::Init() {  void ViewStyle::RefreshColourPalette(Palette &pal, bool want) {  	unsigned int i; -	for (i=0;i<(sizeof(styles)/sizeof(styles[0]));i++) { +	for (i=0;i<stylesSize;i++) {  		pal.WantFind(styles[i].fore, want);  		pal.WantFind(styles[i].back, want);  	} @@ -267,7 +272,7 @@ void ViewStyle::Refresh(Surface &surface) {  	maxAscent = styles[STYLE_DEFAULT].ascent;  	maxDescent = styles[STYLE_DEFAULT].descent;  	someStylesProtected = false; -	for (unsigned int i=0;i<(sizeof(styles)/sizeof(styles[0]));i++) { +	for (unsigned int i=0; i<stylesSize; i++) {  		if (i != STYLE_DEFAULT) {  			styles[i].Realise(surface, zoomLevel, &styles[STYLE_DEFAULT], extraFontFlag);  			if (maxAscent < styles[i].ascent) @@ -295,17 +300,45 @@ void ViewStyle::Refresh(Surface &surface) {  	}  } +void ViewStyle::AllocStyles(size_t sizeNew) { +	Style *stylesNew = new Style[sizeNew]; +	size_t i=0; +	for (; i<stylesSize; i++) { +		stylesNew[i] = styles[i]; +		stylesNew[i].fontName = styles[i].fontName; +	} +	if (stylesSize > STYLE_DEFAULT) { +		for (; i<sizeNew; i++) { +			if (i != STYLE_DEFAULT) { +				stylesNew[i].ClearTo(styles[STYLE_DEFAULT]); +			} +		} +	} +	delete []styles; +	styles = stylesNew; +	stylesSize = sizeNew; +} + +void ViewStyle::EnsureStyle(size_t index) { +	if (index >= stylesSize) { +		size_t sizeNew = stylesSize * 2; +		while (sizeNew < index) +			sizeNew *= 2; +		AllocStyles(sizeNew); +	} +} +  void ViewStyle::ResetDefaultStyle() {  	styles[STYLE_DEFAULT].Clear(ColourDesired(0,0,0),  		ColourDesired(0xff,0xff,0xff), -	        Platform::DefaultFontSize(), fontNames.Save(Platform::DefaultFont()), +		Platform::DefaultFontSize(), fontNames.Save(Platform::DefaultFont()),  		SC_CHARSET_DEFAULT,  		false, false, false, false, Style::caseMixed, true, true, false);  }  void ViewStyle::ClearStyles() {  	// Reset all styles to be like the default style -	for (unsigned int i=0;i<(sizeof(styles)/sizeof(styles[0]));i++) { +	for (unsigned int i=0; i<stylesSize; i++) {  		if (i != STYLE_DEFAULT) {  			styles[i].ClearTo(styles[STYLE_DEFAULT]);  		} @@ -322,5 +355,5 @@ void ViewStyle::SetStyleFontName(int styleIndex, const char *name) {  }  bool ViewStyle::ProtectionActive() const { -    return someStylesProtected; +	return someStylesProtected;  } diff --git a/src/ViewStyle.h b/src/ViewStyle.h index 39adf81e8..a41e5f452 100644 --- a/src/ViewStyle.h +++ b/src/ViewStyle.h @@ -45,7 +45,8 @@ enum WhiteSpaceVisibility {wsInvisible=0, wsVisibleAlways=1, wsVisibleAfterInden  class ViewStyle {  public:  	FontNames fontNames; -	Style styles[STYLE_MAX + 1]; +	size_t stylesSize; +	Style *styles;  	LineMarker markers[MARKER_MAX + 1];  	Indicator indicators[INDIC_MAX + 1];  	int lineHeight; @@ -103,9 +104,11 @@ public:  	ViewStyle();  	ViewStyle(const ViewStyle &source);  	~ViewStyle(); -	void Init(); +	void Init(size_t stylesSize_=64);  	void RefreshColourPalette(Palette &pal, bool want);  	void Refresh(Surface &surface); +	void AllocStyles(size_t sizeNew); +	void EnsureStyle(size_t index);  	void ResetDefaultStyle();  	void ClearStyles();  	void SetStyleFontName(int styleIndex, const char *name); | 
