aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gtk/PlatGTK.cxx64
-rw-r--r--include/Platform.h13
-rw-r--r--src/AutoComplete.cxx8
-rw-r--r--src/AutoComplete.h2
-rw-r--r--src/Editor.cxx7
-rw-r--r--src/Editor.h1
-rw-r--r--src/ScintillaBase.cxx25
-rw-r--r--src/ScintillaBase.h1
-rw-r--r--win32/PlatWin.cxx38
9 files changed, 133 insertions, 26 deletions
diff --git a/gtk/PlatGTK.cxx b/gtk/PlatGTK.cxx
index a3a9c27f4..3e59cf6c3 100644
--- a/gtk/PlatGTK.cxx
+++ b/gtk/PlatGTK.cxx
@@ -525,6 +525,7 @@ PRectangle Window::GetPosition() {
}
void Window::SetPosition(PRectangle rc) {
+#if 0
//gtk_widget_set_uposition(id, rc.left, rc.top);
GtkAllocation alloc;
alloc.x = rc.left;
@@ -532,6 +533,9 @@ void Window::SetPosition(PRectangle rc) {
alloc.width = rc.Width();
alloc.height = rc.Height();
gtk_widget_size_allocate(id, &alloc);
+#endif
+ gtk_widget_set_uposition(id, rc.left, rc.top);
+ gtk_widget_set_usize(id, rc.right - rc.left,rc.bottom - rc.top);
}
void Window::SetPositionRelative(PRectangle rc, Window relativeTo) {
@@ -540,12 +544,15 @@ void Window::SetPositionRelative(PRectangle rc, Window relativeTo) {
gdk_window_get_origin(relativeTo.id->window, &ox, &oy);
gtk_widget_set_uposition(id, rc.left + ox, rc.top + oy);
+#if 0
GtkAllocation alloc;
alloc.x = rc.left + ox;
alloc.y = rc.top + oy;
alloc.width = rc.right - rc.left;
alloc.height = rc.bottom - rc.top;
gtk_widget_size_allocate(id, &alloc);
+#endif
+ gtk_widget_set_usize(id, rc.right - rc.left,rc.bottom - rc.top);
}
PRectangle Window::GetClientPosition() {
@@ -603,7 +610,7 @@ void Window::SetTitle(const char *s) {
gtk_window_set_title(GTK_WINDOW(id), s);
}
-ListBox::ListBox() : list(0), current(0) {}
+ListBox::ListBox() : list(0), current(0), desiredVisibleRows(5), maxItemCharacters(0) {}
ListBox::~ListBox() {}
@@ -637,13 +644,68 @@ void ListBox::Create(Window &, int) {
gtk_widget_realize(id);
}
+void ListBox::SetFont(Font &scint_font) {
+ GtkStyle* style;
+
+ style = gtk_widget_get_style(GTK_WIDGET(list));
+ if (!gdk_font_equal(style->font, scint_font.GetID())) {
+ style = gtk_style_copy(style);
+ gdk_font_unref(style->font);
+ style->font = scint_font.GetID();
+ gdk_font_ref(style->font);
+ gtk_widget_set_style(GTK_WIDGET(list), style);
+ gtk_style_unref(style);
+ }
+}
+
+void ListBox::SetAverageCharWidth(int width) {
+ aveCharWidth = width;
+}
+
+void ListBox::SetVisibleRows(int rows) {
+ desiredVisibleRows = rows;
+}
+
+PRectangle ListBox::GetDesiredRect() {
+ // Before any size allocated pretend its 100 wide so not scrolled
+ PRectangle rc(0, 0, 100, 100);
+ if (id) {
+ GtkRequisition req;
+ int height;
+
+ // First calculate height of the clist for our desired visible row count otherwise it tries to expand to the total # of rows
+ height = (desired_visible_rows * GTK_CLIST(list)->row_height
+ + desired_visible_rows + 1
+ + 2 * (list->style->klass->ythickness
+ + GTK_CONTAINER(list)->border_width));
+ gtk_widget_set_usize(GTK_WIDGET(list), -1, height);
+
+ // Get the size of the scroller because we set usize on the window
+ gtk_widget_size_request(GTK_WIDGET(scroller), &req);
+ rc.right = req.width;
+ rc.bottom = req.height;
+
+ gtk_widget_set_usize(GTK_WIDGET(list), -1, -1);
+ int width = maxItemCharacters;
+ if (width < 12)
+ width = 12;
+ rc.right = width * 8 + 16;
+ }
+ return rc;
+
+}
+
void ListBox::Clear() {
gtk_clist_clear(GTK_CLIST(list));
+ maxItemCharacters = 0;
}
void ListBox::Append(char *s) {
char *szs[] = { s, 0};
gtk_clist_append(GTK_CLIST(list), szs);
+ size_t len = strlen(s);
+ if (maxItemCharacters < len)
+ maxItemCharacters = len;
}
int ListBox::Length() {
diff --git a/include/Platform.h b/include/Platform.h
index 785bc8923..6fff59afa 100644
--- a/include/Platform.h
+++ b/include/Platform.h
@@ -328,7 +328,7 @@ public:
void Show(bool show=true);
void InvalidateAll();
void InvalidateRectangle(PRectangle rc);
- void SetFont(Font &font);
+ virtual void SetFont(Font &font);
enum Cursor { cursorText, cursorArrow, cursorUp, cursorWait, cursorHoriz, cursorVert, cursorReverseArrow };
void SetCursor(Cursor curs);
void SetTitle(const char *s);
@@ -345,14 +345,17 @@ class ListBox : public Window {
WindowID scroller;
int current;
#endif
+ int desiredVisibleRows;
+ size_t maxItemCharacters;
+ unsigned int aveCharWidth;
public:
ListBox();
virtual ~ListBox();
- ListBox &operator=(WindowID id_) {
- id = id_;
- return *this;
- }
void Create(Window &parent, int ctrlID);
+ virtual void SetFont(Font &font);
+ void SetAverageCharWidth(int width);
+ void SetVisibleRows(int rows);
+ PRectangle GetDesiredRect();
void Clear();
void Append(char *s);
int Length();
diff --git a/src/AutoComplete.cxx b/src/AutoComplete.cxx
index d45ab27a6..f9dbd4d67 100644
--- a/src/AutoComplete.cxx
+++ b/src/AutoComplete.cxx
@@ -11,7 +11,6 @@
#include "AutoComplete.h"
AutoComplete::AutoComplete() {
- lb = 0;
active = false;
posStart = 0;
strcpy(stopChars, "");
@@ -54,8 +53,7 @@ char AutoComplete::GetSeparator() {
return separator;
}
-int AutoComplete::SetList(const char *list) {
- int maxStrLen = 12;
+void AutoComplete::SetList(const char *list) {
lb.Clear();
char *words = new char[strlen(list) + 1];
if (words) {
@@ -66,18 +64,15 @@ int AutoComplete::SetList(const char *list) {
if (words[i] == separator) {
words[i] = '\0';
lb.Append(startword);
- maxStrLen = Platform::Maximum(maxStrLen, strlen(startword));
startword = words + i + 1;
}
}
if (startword) {
lb.Append(startword);
- maxStrLen = Platform::Maximum(maxStrLen, strlen(startword));
}
delete []words;
}
lb.Sort();
- return maxStrLen;
}
void AutoComplete::Show() {
@@ -88,7 +83,6 @@ void AutoComplete::Show() {
void AutoComplete::Cancel() {
if (lb.Created()) {
lb.Destroy();
- lb = 0;
active = false;
}
}
diff --git a/src/AutoComplete.h b/src/AutoComplete.h
index 96d061f50..37795fce6 100644
--- a/src/AutoComplete.h
+++ b/src/AutoComplete.h
@@ -35,7 +35,7 @@ public:
char GetSeparator();
// The list string contains a sequence of words separated by the separator character
- int SetList(const char *list);
+ void SetList(const char *list);
void Show();
void Cancel();
diff --git a/src/Editor.cxx b/src/Editor.cxx
index 29037474e..487a4c4f7 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -116,6 +116,7 @@ Editor::~Editor() {
}
void Editor::Finalise() {
+ CancelModes();
}
void Editor::DropGraphics() {
@@ -1950,6 +1951,10 @@ void Editor::LineTranspose() {
}
}
+void Editor::CancelModes() {
+ SetEmptySelection(currentPos);
+}
+
int Editor::KeyCommand(UINT iMessage) {
Point pt = LocationFromPosition(currentPos);
@@ -2069,7 +2074,7 @@ int Editor::KeyCommand(UINT iMessage) {
break;
case SCI_CANCEL: // Cancel any modes - handled in subclass
// Also unselect text
- SetEmptySelection(currentPos);
+ CancelModes();
break;
case SCI_DELETEBACK:
DelCharBack();
diff --git a/src/Editor.h b/src/Editor.h
index c39157747..4f42c80a0 100644
--- a/src/Editor.h
+++ b/src/Editor.h
@@ -246,6 +246,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
void PageMove(int direction, bool extend=false);
void ChangeCaseOfSelection(bool makeUpperCase);
void LineTranspose();
+ virtual void CancelModes();
virtual int KeyCommand(UINT iMessage);
virtual int KeyDefault(int /* key */, int /*modifiers*/);
int KeyDown(int key, bool shift, bool ctrl, bool alt);
diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx
index bf1b28394..d381b6739 100644
--- a/src/ScintillaBase.cxx
+++ b/src/ScintillaBase.cxx
@@ -49,6 +49,7 @@ ScintillaBase::~ScintillaBase() {
}
void ScintillaBase::Finalise() {
+ Editor::Finalise();
popup.Destroy();
}
@@ -162,7 +163,7 @@ int ScintillaBase::KeyCommand(UINT iMessage) {
}
void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
- //Platform::DebugPrintf("AutoCOmplete %s\n", list);
+ //Platform::DebugPrintf("AutoComplete %s\n", list);
ct.CallTipCancel();
ac.Start(wDraw, idAutoComplete, currentPos, lenEntered);
@@ -170,7 +171,6 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
PRectangle rcClient = GetClientRectangle();
Point pt = LocationFromPosition(currentPos-lenEntered);
- //Platform::DebugPrintf("Auto complete %x\n", lbAutoComplete);
int heightLB = 100;
int widthLB = 100;
if (pt.x >= rcClient.right - widthLB) {
@@ -193,16 +193,18 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
rcac.right = rcac.left + widthLB;
rcac.bottom = Platform::Minimum(rcac.top + heightLB, rcClient.bottom);
ac.lb.SetPositionRelative(rcac, wMain);
- ac.lb.SetFont(vs.styles[0].font);
+ ac.lb.SetFont(vs.styles[STYLE_DEFAULT].font);
+ ac.lb.SetAverageCharWidth(vs.styles[STYLE_DEFAULT].aveCharWidth);
- int maxStrLen = ac.SetList(list);
+ ac.SetList(list);
// Fiddle the position of the list so it is right next to the target and wide enough for all its strings
- PRectangle rcList = ac.lb.GetPosition();
+ PRectangle rcList = ac.lb.GetDesiredRect();
int heightAlloced = rcList.bottom - rcList.top;
+ widthLB = Platform::Maximum(widthLB, rcList.right - rcList.left);
// Make an allowance for large strings in list
rcList.left = pt.x - 5;
- rcList.right = rcList.left + Platform::Maximum(widthLB, maxStrLen * 8 + 16);
+ rcList.right = rcList.left + widthLB;
if (pt.y >= rcClient.bottom - heightLB && // Wont fit below.
pt.y >= (rcClient.bottom + rcClient.top) / 2) { // and there is more room above.
rcList.top = pt.y - heightAlloced;
@@ -249,7 +251,7 @@ void ScintillaBase::AutoCompleteChanged(char ch) {
void ScintillaBase::AutoCompleteCompleted() {
int item = ac.lb.GetSelection();
- char selected[200];
+ char selected[1000];
if (item != -1) {
ac.lb.GetValue(item, selected, sizeof(selected));
}
@@ -278,9 +280,14 @@ void ScintillaBase::ContextMenu(Point pt) {
popup.Show(pt, wMain);
}
-void ScintillaBase::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) {
+void ScintillaBase::CancelModes() {
AutoCompleteCancel();
ct.CallTipCancel();
+ Editor::CancelModes();
+}
+
+void ScintillaBase::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) {
+ CancelModes();
Editor::ButtonDown(pt, curTime, shift, ctrl, alt);
}
@@ -364,7 +371,7 @@ LRESULT ScintillaBase::WndProc(UINT iMessage, WPARAM wParam, LPARAM lParam) {
if (!ct.wCallTip.Created()) {
PRectangle rc = ct.CallTipStart(currentPos, LocationFromPosition(wParam),
reinterpret_cast<char *>(lParam),
- vs.styles[0].fontName, vs.styles[0].size);
+ vs.styles[STYLE_DEFAULT].fontName, vs.styles[STYLE_DEFAULT].size);
// If the call-tip window would be out of the client
// space, adjust so it displays above the text.
PRectangle rcClient = GetClientRectangle();
diff --git a/src/ScintillaBase.h b/src/ScintillaBase.h
index a7aefd8bc..2e7402a1c 100644
--- a/src/ScintillaBase.h
+++ b/src/ScintillaBase.h
@@ -47,6 +47,7 @@ protected:
virtual void AddCharUTF(char *s, unsigned int len);
void Command(int cmdId);
+ virtual void CancelModes();
virtual int KeyCommand(UINT iMessage);
void AutoCompleteStart(int lenEntered, const char *list);
diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx
index bea215566..87f90cfa1 100644
--- a/win32/PlatWin.cxx
+++ b/win32/PlatWin.cxx
@@ -698,7 +698,7 @@ HINSTANCE Window::GetInstance() {
::GetWindowLong(id,GWL_HINSTANCE));
}
-ListBox::ListBox() {
+ListBox::ListBox() : desiredVisibleRows(5), maxItemCharacters(0), aveCharWidth(8) {
}
ListBox::~ListBox() {
@@ -712,12 +712,45 @@ void ListBox::Create(Window &parent, int ctrlID) {
parent.GetInstance(), 0);
}
+void ListBox::SetFont(Font &font) {
+ Window::SetFont(font);
+}
+
+void ListBox::SetAverageCharWidth(int width) {
+ aveCharWidth = width;
+}
+
+void ListBox::SetVisibleRows(int rows) {
+ desiredVisibleRows = rows;
+}
+
+PRectangle ListBox::GetDesiredRect() {
+ PRectangle rcDesired = GetPosition();
+ int itemHeight = SendMessage(LB_GETITEMHEIGHT, 0);
+ int rows = Length();
+ if ((rows == 0) || (rows > desiredVisibleRows))
+ rows = desiredVisibleRows;
+ // The +6 allows for borders
+ rcDesired.bottom = rcDesired.top + 6 + itemHeight * rows;
+ int width = maxItemCharacters;
+ if (width < 12)
+ width = 12;
+ rcDesired.right = rcDesired.left + width * (aveCharWidth+aveCharWidth/3);
+ if (Length() > rows)
+ rcDesired.right = rcDesired.right + GetSystemMetrics(SM_CXVSCROLL);
+ return rcDesired;
+}
+
void ListBox::Clear() {
SendMessage(LB_RESETCONTENT);
+ maxItemCharacters = 0;
}
void ListBox::Append(char *s) {
SendMessage(LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(s));
+ size_t len = strlen(s);
+ if (maxItemCharacters < len)
+ maxItemCharacters = len;
}
int ListBox::Length() {
@@ -733,7 +766,8 @@ int ListBox::GetSelection() {
}
int ListBox::Find(const char *prefix) {
- return SendMessage(LB_FINDSTRING, 0, reinterpret_cast<LPARAM>(prefix));
+ return SendMessage(LB_FINDSTRING, static_cast<WPARAM>(-1),
+ reinterpret_cast<LPARAM>(prefix));
}
void ListBox::GetValue(int n, char *value, int len) {