#include "Platform.h"
#include "wx/stc/stc.h"
+
+#ifdef __WXGTK__
+#include <gtk/gtk.h>
+#endif
+
Point Point::FromLong(long lpoint) {
return Point(lpoint & 0xFFFF, lpoint >> 16);
}
wxRect wxRectFromPRectangle(PRectangle prc) {
wxRect rc(prc.left, prc.top,
- prc.right-prc.left+1, prc.bottom-prc.top+1);
+ prc.right-prc.left, prc.bottom-prc.top);
return rc;
}
Release();
hdc = new wxMemoryDC(surface_->hdc);
hdcOwned = true;
- bitmap = new wxBitmap(width, height+1);
+ bitmap = new wxBitmap(width, height);
((wxMemoryDC*)hdc)->SelectObject(*bitmap);
// **** ::SetTextAlign(hdc, TA_BASELINE);
}
}
void Surface::SetFont(Font &font_) {
-
- // I think the following check is valid.
- // It eliminates a crash for me. -- eric@sourcegear.com
-
- if (font_.GetID())
- {
+ if (font_.GetID()) {
hdc->SetFont(*font_.GetID());
}
}
}
void Surface::FlushCachedState() {
- // TODO Is there anything we need to do here? eric@sourcegear.com
- // TODO I had to add this method when I merged new Scintilla code
- // TODO from Neil.
}
Window::~Window() {
PRectangle Window::GetClientPosition() {
wxSize sz = id->GetClientSize();
- return PRectangle(0, 0, sz.x - 1, sz.y - 1);
+ return PRectangle(0, 0, sz.x, sz.y);
}
void Window::Show(bool show) {
}
+class wxSTCListBox : public wxListBox {
+public:
+ wxSTCListBox(wxWindow* parent, wxWindowID id)
+ : wxListBox(parent, id, wxDefaultPosition, wxDefaultSize,
+ 0, NULL, wxLB_SINGLE | wxLB_SORT | wxSIMPLE_BORDER)
+ {}
+
+ void OnFocus(wxFocusEvent& event) {
+ GetParent()->SetFocus();
+ event.Skip();
+ }
+
+#ifdef __WXGTK__
+ void DoSetFirstItem(int n);
+#endif
+
+private:
+ DECLARE_EVENT_TABLE()
+};
+
+BEGIN_EVENT_TABLE(wxSTCListBox, wxListBox)
+ EVT_SET_FOCUS(wxSTCListBox::OnFocus)
+END_EVENT_TABLE()
+
+
+
+
+#ifdef __WXGTK__
+ // This can be removed after 2.2.2 I think
+void wxSTCListBox::DoSetFirstItem( int n )
+{
+ wxCHECK_RET( m_list, wxT("invalid listbox") );
+
+ if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (m_list))
+ return;
+
+ // terribly efficient
+ const gchar *vadjustment_key = "gtk-vadjustment";
+ guint vadjustment_key_id = g_quark_from_static_string (vadjustment_key);
+
+ GtkAdjustment *adjustment =
+ (GtkAdjustment*) gtk_object_get_data_by_id (GTK_OBJECT (m_list), vadjustment_key_id);
+ wxCHECK_RET( adjustment, wxT("invalid listbox code") );
+
+ GList *target = g_list_nth( m_list->children, n );
+ wxCHECK_RET( target, wxT("invalid listbox index") );
+
+ GtkWidget *item = GTK_WIDGET(target->data);
+ wxCHECK_RET( item, wxT("invalid listbox code") );
+
+ // find the last item before this one which is already realized
+ size_t nItemsBefore;
+ for ( nItemsBefore = 0; item && (item->allocation.y == -1); nItemsBefore++ )
+ {
+ target = target->prev;
+ if ( !target )
+ {
+ // nothing we can do if there are no allocated items yet
+ return;
+ }
+
+ item = GTK_WIDGET(target->data);
+ }
+
+ gtk_adjustment_set_value(adjustment,
+ item->allocation.y +
+ nItemsBefore*item->allocation.height);
+}
+#endif
+
ListBox::ListBox() {
}
}
void ListBox::Create(Window &parent, int ctrlID) {
- id = new wxListBox(parent.id, ctrlID, wxDefaultPosition, wxDefaultSize,
- 0, NULL, wxLB_SINGLE | wxLB_SORT);
+ id = new wxSTCListBox(parent.id, ctrlID);
+// id = new wxListBox(parent.id, ctrlID, wxDefaultPosition, wxDefaultSize,
+// 0, NULL, wxLB_SINGLE | wxLB_SORT | wxSIMPLE_BORDER);
+}
+
+PRectangle ListBox::GetDesiredRect() {
+ wxSize sz = ((wxListBox*)id)->GetBestSize();
+ PRectangle rc;
+ rc.top = 0;
+ rc.left = 0;
+ if (sz.x > 150) // TODO: A better way to determine these max sizes
+ sz.x = 150;
+ if (sz.y > 100)
+ sz.y = 100;
+ rc.right = sz.x;
+ rc.bottom = sz.y;
+
+ return rc;
+}
+
+void ListBox::SetAverageCharWidth(int width) {
+ aveCharWidth = width;
+}
+
+void ListBox::SetFont(Font &font) {
+ Window::SetFont(font);
}
void ListBox::Clear() {
}
int ListBox::Length() {
- return ((wxListBox*)id)->Number();
+ return ((wxListBox*)id)->GetCount();
}
void ListBox::Select(int n) {
((wxListBox*)id)->SetSelection(n);
+#ifdef __WXGTK__
+ if (n > 4)
+ n = n - 4;
+ else
+ n = 1;
+ ((wxListBox*)id)->SetFirstItem(n);
+#endif
}
int ListBox::GetSelection() {
}
int ListBox::Find(const char *prefix) {
- for (int x=0; x < ((wxListBox*)id)->Number(); x++) {
- wxString text = ((wxListBox*)id)->GetString(x);
- if (text.StartsWith(prefix))
- return x;
+ if (prefix) {
+ for (int x=0; x < ((wxListBox*)id)->GetCount(); x++) {
+ wxString text = ((wxListBox*)id)->GetString(x);
+ if (text.StartsWith(prefix))
+ return x;
+ }
}
return -1;
}