diff options
| author | nyamatongwe <unknown> | 2002-11-21 12:35:51 +0000 | 
|---|---|---|
| committer | nyamatongwe <unknown> | 2002-11-21 12:35:51 +0000 | 
| commit | 80a672aa76c64c58f5a7571879b83e1e44cd2db6 (patch) | |
| tree | f3b69c94fcefff4ff2b0828a740940b9d0b96fb6 | |
| parent | 882b4355011c56f17284981bab13ed74ed395284 (diff) | |
| download | scintilla-mirror-80a672aa76c64c58f5a7571879b83e1e44cd2db6.tar.gz | |
Patch from Biswa to add icons to autocompletion lists.
| -rw-r--r-- | gtk/PlatGTK.cxx | 146 | ||||
| -rw-r--r-- | include/Platform.h | 4 | ||||
| -rw-r--r-- | include/Scintilla.h | 1 | ||||
| -rw-r--r-- | include/Scintilla.iface | 3 | ||||
| -rw-r--r-- | src/AutoComplete.h | 5 | ||||
| -rw-r--r-- | src/PropSet.cxx | 24 | ||||
| -rw-r--r-- | src/ScintillaBase.cxx | 4 | ||||
| -rw-r--r-- | win32/PlatWin.cxx | 5 | 
8 files changed, 143 insertions, 49 deletions
| diff --git a/gtk/PlatGTK.cxx b/gtk/PlatGTK.cxx index 8d61adde7..2554f3dd4 100644 --- a/gtk/PlatGTK.cxx +++ b/gtk/PlatGTK.cxx @@ -186,7 +186,6 @@ void Palette::Allocate(Window &w) {  	delete []successPalette;  } -  static const char *CharacterSetName(int characterSet) {  	switch (characterSet) {  	case SC_CHARSET_ANSI: @@ -233,9 +232,9 @@ static const char *CharacterSetName(int characterSet) {  }  static void GenerateFontSpecStrings(const char *fontName, int characterSet, -                             char *foundary, int foundary_len, -                             char *faceName, int faceName_len, -                             char *charset, int charset_len) { +                                    char *foundary, int foundary_len, +                                    char *faceName, int faceName_len, +                                    char *charset, int charset_len) {  	// supported font strings include:  	// foundary-fontface-isoxxx-x  	// fontface-isoxxx-x @@ -283,7 +282,7 @@ static void SetLogFont(LOGFONT &lf, const char *faceName, int characterSet, int  	lf.bold = bold;  	lf.italic = italic;  	lf.characterSet = characterSet; -	strncpy(lf.faceName, faceName, sizeof(lf.faceName)-1); +	strncpy(lf.faceName, faceName, sizeof(lf.faceName) - 1);  }  /** @@ -293,11 +292,11 @@ static void SetLogFont(LOGFONT &lf, const char *faceName, int characterSet, int   */  static int HashFont(const char *faceName, int characterSet, int size, bool bold, bool italic) {  	return -		size ^ -		(characterSet << 10) ^ -		(bold ? 0x10000000 : 0) ^ -		(italic ? 0x20000000 : 0) ^ -		faceName[0]; +	    size ^ +	    (characterSet << 10) ^ +	    (bold ? 0x10000000 : 0) ^ +	    (italic ? 0x20000000 : 0) ^ +	    faceName[0];  }  class FontCached : Font { @@ -309,8 +308,8 @@ class FontCached : Font {  	~FontCached() {}  	bool SameAs(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_);  	virtual void Release(); -        static FontID CreateNewFont(const char *fontName, int characterSet, -                  int size, bool bold, bool italic); +	static FontID CreateNewFont(const char *fontName, int characterSet, +	                            int size, bool bold, bool italic);  	static FontCached *first;  public:  	static FontID FindOrCreate(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_); @@ -320,7 +319,7 @@ public:  FontCached *FontCached::first = 0;  FontCached::FontCached(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_) : -	next(0), usage(0), hash(0) { +next(0), usage(0), hash(0) {  	::SetLogFont(lf, faceName_, characterSet_, size_, bold_, italic_);  	hash = HashFont(faceName_, characterSet_, size_, bold_, italic_);  	id = CreateNewFont(faceName_, characterSet_, size_, bold_, italic_); @@ -329,11 +328,11 @@ FontCached::FontCached(const char *faceName_, int characterSet_, int size_, bool  bool FontCached::SameAs(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_) {  	return -		lf.size == size_ && -		lf.bold == bold_ && -		lf.italic == italic_ && -		lf.characterSet == characterSet_ && -		0 == strcmp(lf.faceName,faceName_); +	    lf.size == size_ && +	    lf.bold == bold_ && +	    lf.italic == italic_ && +	    lf.characterSet == characterSet_ && +	    0 == strcmp(lf.faceName, faceName_);  }  void FontCached::Release() { @@ -346,9 +345,9 @@ FontID FontCached::FindOrCreate(const char *faceName_, int characterSet_, int si  	FontID ret = 0;  	FontMutexLock();  	int hashFind = HashFont(faceName_, characterSet_, size_, bold_, italic_); -	for (FontCached *cur=first; cur; cur=cur->next) { +	for (FontCached *cur = first; cur; cur = cur->next) {  		if ((cur->hash == hashFind) && -			cur->SameAs(faceName_, characterSet_, size_, bold_, italic_)) { +		        cur->SameAs(faceName_, characterSet_, size_, bold_, italic_)) {  			cur->usage++;  			ret = cur->id;  		} @@ -367,8 +366,8 @@ FontID FontCached::FindOrCreate(const char *faceName_, int characterSet_, int si  void FontCached::ReleaseId(FontID id_) {  	FontMutexLock(); -	FontCached **pcur=&first; -	for (FontCached *cur=first; cur; cur=cur->next) { +	FontCached **pcur = &first; +	for (FontCached *cur = first; cur; cur = cur->next) {  		if (cur->id == id_) {  			cur->usage--;  			if (cur->usage == 0) { @@ -379,13 +378,13 @@ void FontCached::ReleaseId(FontID id_) {  			}  			break;  		} -		pcur=&cur->next; +		pcur = &cur->next;  	}  	FontMutexUnlock();  }  FontID FontCached::CreateNewFont(const char *fontName, int characterSet, -                  int size, bool bold, bool italic) { +                                 int size, bool bold, bool italic) {  	char fontset[1024];  	char fontspec[300];  	char foundary[50]; @@ -396,7 +395,7 @@ FontID FontCached::CreateNewFont(const char *fontName, int characterSet,  	foundary[0] = '\0';  	faceName[0] = '\0';  	charset[0] = '\0'; -        FontID newid = 0; +	FontID newid = 0;  	// If name of the font begins with a '-', assume, that it is  	// a full fontspec. @@ -531,7 +530,6 @@ FontID FontCached::CreateNewFont(const char *fontName, int characterSet,  	return newid;  } -  Font::Font() : id(0) {}  Font::~Font() {} @@ -547,7 +545,6 @@ void Font::Release() {  	id = 0;  } -  class SurfaceImpl : public Surface {  	bool unicodeMode;  	GdkDrawable *drawable; @@ -939,8 +936,10 @@ int SurfaceImpl::Ascent(Font &font_) {  	if (!font_.GetID())  		return 1;  #ifdef FAST_WAY +  	return PFont(font_)->ascent;  #else +  	gint lbearing;  	gint rbearing;  	gint width; @@ -957,8 +956,10 @@ int SurfaceImpl::Descent(Font &font_) {  	if (!font_.GetID())  		return 1;  #ifdef FAST_WAY +  	return PFont(font_)->descent;  #else +  	gint lbearing;  	gint rbearing;  	gint width; @@ -1047,6 +1048,7 @@ void Window::SetPosition(PRectangle rc) {  	alloc.height = rc.Height();  	gtk_widget_size_allocate(PWidget(id), &alloc);  #else +  	gtk_widget_set_uposition(id, rc.left, rc.top);  	gtk_widget_set_usize(id, rc.right - rc.left, rc.bottom - rc.top);  #endif @@ -1059,6 +1061,7 @@ void Window::SetPositionRelative(PRectangle rc, Window relativeTo) {  	gtk_widget_set_uposition(PWidget(id), rc.left + ox, rc.top + oy);  #if 0 +  	GtkAllocation alloc;  	alloc.x = rc.left + ox;  	alloc.y = rc.top + oy; @@ -1066,6 +1069,7 @@ void Window::SetPositionRelative(PRectangle rc, Window relativeTo) {  	alloc.height = rc.bottom - rc.top;  	gtk_widget_size_allocate(id, &alloc);  #endif +  	gtk_widget_set_usize(PWidget(id), rc.right - rc.left, rc.bottom - rc.top);  } @@ -1136,10 +1140,28 @@ void Window::SetTitle(const char *s) {  	gtk_window_set_title(GTK_WINDOW(id), s);  } -ListBox::ListBox() : list(0), current(0), desiredVisibleRows(5), maxItemCharacters(0), +struct ListImage { +	const char **xpm_data; +	GdkPixmap *pixmap; +	GdkBitmap *bitmap; +}; + +ListBox::ListBox() : list(0), current(0), pixhash(NULL), desiredVisibleRows(5), maxItemCharacters(0),  doubleClickAction(NULL), doubleClickActionData(NULL) {} -ListBox::~ListBox() {} +static void list_image_free(gpointer, gpointer value, gpointer) { +	ListImage *list_image = (ListImage *) value; +	if (list_image->pixmap) +		gdk_pixmap_unref(list_image->pixmap); +	if (list_image->bitmap) +		gdk_bitmap_unref(list_image->bitmap); +	g_free(list_image); +} + +ListBox::~ListBox() { +	g_hash_table_foreach((GHashTable *) pixhash, list_image_free, NULL); +	g_hash_table_destroy((GHashTable *) pixhash); +}  static void SelectionAC(GtkWidget *, gint row, gint,                          GdkEventButton *, gpointer p) { @@ -1230,8 +1252,10 @@ PRectangle ListBox::GetDesiredRect() {  		int height;  #if GTK_MAJOR_VERSION < 2 +  		int ythickness = PWidget(list)->style->klass->ythickness;  #else +  		int ythickness = PWidget(list)->style->ythickness;  #endif  		// First calculate height of the clist for our desired visible row count otherwise it tries to expand to the total # of rows @@ -1262,9 +1286,32 @@ void ListBox::Clear() {  	maxItemCharacters = 0;  } -void ListBox::Append(char *s) { -	char *szs[] = { s, 0}; -	gtk_clist_append(GTK_CLIST(list), szs); +static void init_pixmap(ListImage *li, GtkWidget *window) { +	li->pixmap = gdk_pixmap_colormap_create_from_xpm_d(NULL +	             , gtk_widget_get_colormap(window), &(li->bitmap), NULL +	             , (gchar **) li->xpm_data); +	if (NULL == li->pixmap) { +		if (li->bitmap) +			gdk_bitmap_unref(li->bitmap); +		li->bitmap = NULL; +	} +} + +#define SPACING 5 + +void ListBox::Append(char *s, int type) { +	char * szs[] = { s, NULL }; +	ListImage *list_image = NULL; +	if (type >= 0) +		list_image = (ListImage *) g_hash_table_lookup((GHashTable *) pixhash +		             , (gconstpointer) GINT_TO_POINTER(type)); +	int rownum = gtk_clist_append(GTK_CLIST(list), szs); +	if (list_image) { +		if (NULL == list_image->pixmap) +			init_pixmap(list_image, (GtkWidget *) list); +		gtk_clist_set_pixtext(GTK_CLIST(list), rownum, 0, s, SPACING +		                      , list_image->pixmap, list_image->bitmap); +	}  	size_t len = strlen(s);  	if (maxItemCharacters < len)  		maxItemCharacters = len; @@ -1298,8 +1345,18 @@ int ListBox::Find(const char *prefix) {  }  void ListBox::GetValue(int n, char *value, int len) { -	char *text = 0; -	gtk_clist_get_text(GTK_CLIST(list), n, 0, &text); +	char *text = NULL; +	GtkCellType type = gtk_clist_get_cell_type(GTK_CLIST(list), n, 0); +	switch (type) { +	case GTK_CELL_TEXT: +		gtk_clist_get_text(GTK_CLIST(list), n, 0, &text); +		break; +	case GTK_CELL_PIXTEXT: +		gtk_clist_get_pixtext(GTK_CLIST(list), n, 0, &text, NULL, NULL, NULL); +		break; +	default: +		break; +	}  	if (text && len > 0) {  		strncpy(value, text, len);  		value[len - 1] = '\0'; @@ -1312,6 +1369,24 @@ void ListBox::Sort() {  	gtk_clist_sort(GTK_CLIST(list));  } +void ListBox::SetTypeXpm(int type, const char **xpm_data) { +	ListImage *list_image; +	g_return_if_fail(xpm_data); + +	if (NULL == pixhash) +		pixhash = g_hash_table_new(g_direct_hash, g_direct_equal); +	else { +		list_image = (ListImage *) g_hash_table_lookup((GHashTable *) pixhash +		             , (gconstpointer) GINT_TO_POINTER(type)); +		if (list_image) +			return; +	} +	list_image = g_new0(ListImage, 1); +	list_image->xpm_data = xpm_data; +	g_hash_table_insert((GHashTable *) pixhash, GINT_TO_POINTER(type) +	                    , (gpointer) list_image); +} +  Menu::Menu() : id(0) {}  void Menu::CreatePopUp() { @@ -1376,6 +1451,7 @@ const char *Platform::DefaultFont() {  #ifdef G_OS_WIN32  	return "Lucida Console";  #else +  	return "lucidatypewriter";  #endif  } @@ -1475,7 +1551,7 @@ int Platform::Clamp(int val, int minVal, int maxVal) {  }  void Platform_Initialise() { -        FontMutexAllocate(); +	FontMutexAllocate();  }  void Platform_Finalise() { diff --git a/include/Platform.h b/include/Platform.h index 7e521d63b..53b1dfecc 100644 --- a/include/Platform.h +++ b/include/Platform.h @@ -377,6 +377,7 @@ private:  	WindowID list;  	WindowID scroller;  	int current; +	void *pixhash;  #endif  	int desiredVisibleRows;  	unsigned int maxItemCharacters; @@ -393,13 +394,14 @@ public:  	void SetVisibleRows(int rows);  	PRectangle GetDesiredRect();  	void Clear(); -	void Append(char *s); +	void Append(char *s, int type = -1);  	int Length();  	void Select(int n);  	int GetSelection();  	int Find(const char *prefix);  	void GetValue(int n, char *value, int len);  	void Sort(); +	void SetTypeXpm(int type, const char **xpm_data);  	void SetDoubleClickAction(CallBackAction action, void *data) {  		doubleClickAction = action;  		doubleClickActionData = data; diff --git a/include/Scintilla.h b/include/Scintilla.h index 7cc9c6aad..4fa58c481 100644 --- a/include/Scintilla.h +++ b/include/Scintilla.h @@ -243,6 +243,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,  #define SCI_AUTOCGETAUTOHIDE 2119  #define SCI_AUTOCSETDROPRESTOFWORD 2270  #define SCI_AUTOCGETDROPRESTOFWORD 2271 +#define SCI_REGISTERIMAGE 2405  #define SCI_SETINDENT 2122  #define SCI_GETINDENT 2123  #define SCI_SETUSETABS 2124 diff --git a/include/Scintilla.iface b/include/Scintilla.iface index d9f9c14f9..eea164f09 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -582,6 +582,9 @@ set void AutoCSetDropRestOfWord=2270(bool dropRestOfWord,)  # after the inserted text upon completion.  get bool AutoCGetDropRestOfWord=2271(,) +# Register an XPM image for use in autocompletion lists. +fun void RegisterImage=2405(int type, int xpmData) +  # Set the number of spaces used for one level of indentation.  set void SetIndent=2122(int indentSize,) diff --git a/src/AutoComplete.h b/src/AutoComplete.h index 622a5666e..7983e3611 100644 --- a/src/AutoComplete.h +++ b/src/AutoComplete.h @@ -15,6 +15,7 @@ class AutoComplete {  	char stopChars[256];  	char fillUpChars[256];  	char separator; +	char typesep; // Type seperator  public:  	bool ignoreCase; @@ -48,6 +49,10 @@ public:  	void SetSeparator(char separator_);  	char GetSeparator(); +	/// The typesep character is used for seperating the word from the type +	void SetTypesep(char separator_); +	char GetTypesep(); +  	/// The list string contains a sequence of words separated by the separator character  	void SetList(const char *list); diff --git a/src/PropSet.cxx b/src/PropSet.cxx index b527c385c..60d53088f 100644 --- a/src/PropSet.cxx +++ b/src/PropSet.cxx @@ -98,13 +98,13 @@ void PropSet::Set(const char *key, const char *val, int lenKey, int lenVal) {  		lenVal = static_cast<int>(strlen(val));  	unsigned int hash = HashString(key, lenKey);  	for (Property *p = props[hash % hashRoots]; p; p = p->next) { -		if ((hash == p->hash) &&  -			((strlen(p->key) == static_cast<unsigned int>(lenKey)) &&  +		if ((hash == p->hash) && +			((strlen(p->key) == static_cast<unsigned int>(lenKey)) &&  				(0 == strncmp(p->key, key, lenKey)))) {  			// Replace current value  			delete [](p->val);  			p->val = StringDup(val, lenVal); -			return ; +			return;  		}  	}  	// Not found @@ -257,7 +257,7 @@ SString PropSet::GetWild(const char *keybase, const char *filename) {  				if (keyfile == NULL)  					keyfile = orgkeyfile; -				for (; ; ) { +				for (;;) {  					char *del = strchr(keyfile, ';');  					if (del == NULL)  						del = keyfile + strlen(keyfile); @@ -328,9 +328,9 @@ void PropSet::Clear() {  		while (p) {  			Property *pNext = p->next;  			p->hash = 0; -			delete p->key; +			delete []p->key;  			p->key = 0; -			delete p->val; +			delete []p->val;  			p->val = 0;  			delete p;  			p = pNext; @@ -669,13 +669,13 @@ char *WordList::GetNearestWords(  			if (!cond) {  				// Find first match  				while ((pivot > start) && -					(0 == CompareNCaseInsensitive(wordStart,  +					(0 == CompareNCaseInsensitive(wordStart,  						wordsNoCase[pivot-1], searchLen))) {  					--pivot;  				}  				// Grab each match  				while ((pivot <= end) && -					(0 == CompareNCaseInsensitive(wordStart,  +					(0 == CompareNCaseInsensitive(wordStart,  						wordsNoCase[pivot], searchLen))) {  					wordlen = LengthWord(wordsNoCase[pivot], otherSeparator) + 1;  					wordsNear.append(wordsNoCase[pivot], wordlen, ' '); @@ -695,14 +695,14 @@ char *WordList::GetNearestWords(  			if (!cond) {  				// Find first match  				while ((pivot > start) && -					(0 == strncmp(wordStart,  -						words[pivot-1], searchLen))) {  +					(0 == strncmp(wordStart, +						words[pivot-1], searchLen))) {  					--pivot;  				}  				// Grab each match  				while ((pivot <= end) && -					(0 == strncmp(wordStart,  -						words[pivot], searchLen))) {  +					(0 == strncmp(wordStart, +						words[pivot], searchLen))) {  					wordlen = LengthWord(words[pivot], otherSeparator) + 1;  					wordsNear.append(words[pivot], wordlen, ' ');  					++pivot; diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx index ab6e9a19b..1c44b0bd6 100644 --- a/src/ScintillaBase.cxx +++ b/src/ScintillaBase.cxx @@ -509,6 +509,10 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara  	case SCI_AUTOCGETDROPRESTOFWORD:  		return ac.dropRestOfWord; +	case SCI_REGISTERIMAGE: +		ac.lb.SetTypeXpm(wParam, reinterpret_cast<const char **>(lParam)); +		break; +  	case SCI_CALLTIPSHOW: {  			AutoCompleteCancel();  			if (!ct.wCallTip.Created()) { diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index 5113ab24c..fd8ed249b 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -826,7 +826,7 @@ void ListBox::Clear() {  	maxItemCharacters = 0;  } -void ListBox::Append(char *s) { +void ListBox::Append(char *s, int) {  	Window_SendMessage(this, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(s));  	unsigned int len = static_cast<unsigned int>(strlen(s));  	if (maxItemCharacters < len) @@ -871,6 +871,9 @@ void ListBox::Sort() {  	// Windows keeps sorted so no need to sort  } +void ListBox::SetTypeXpm(int, const char **) { +} +  Menu::Menu() : id(0) {  } | 
