diff options
Diffstat (limited to 'gtk/ScintillaGTK.cxx')
-rw-r--r-- | gtk/ScintillaGTK.cxx | 376 |
1 files changed, 88 insertions, 288 deletions
diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index 33aec818b..2d5daa2f0 100644 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -72,7 +72,9 @@ #include "ExternalLexer.h" #endif +#include "ScintillaGTK.h" #include "scintilla-marshal.h" +#include "ScintillaGTKAccessible.h" #include "Converter.h" @@ -105,8 +107,6 @@ static GdkWindow *WindowFromWidget(GtkWidget *w) { #pragma warning(disable: 4505) #endif -#define OBJECT_CLASS GObjectClass - #ifdef SCI_NAMESPACE using namespace Scintilla; #endif @@ -118,228 +118,6 @@ static GdkWindow *PWindow(const Window &w) { extern std::string UTF8FromLatin1(const char *s, int len); -class ScintillaGTK : public ScintillaBase { - _ScintillaObject *sci; - Window wText; - Window scrollbarv; - Window scrollbarh; - GtkAdjustment *adjustmentv; - GtkAdjustment *adjustmenth; - int verticalScrollBarWidth; - int horizontalScrollBarHeight; - - SelectionText primary; - - GdkEventButton *evbtn; - bool capturedMouse; - bool dragWasDropped; - int lastKey; - int rectangularSelectionModifier; - - GtkWidgetClass *parentClass; - - static GdkAtom atomClipboard; - static GdkAtom atomUTF8; - static GdkAtom atomString; - static GdkAtom atomUriList; - static GdkAtom atomDROPFILES_DND; - GdkAtom atomSought; - -#if PLAT_GTK_WIN32 - CLIPFORMAT cfColumnSelect; -#endif - - Window wPreedit; - Window wPreeditDraw; - GtkIMContext *im_context; - PangoScript lastNonCommonScript; - - // Wheel mouse support - unsigned int linesPerScroll; - GTimeVal lastWheelMouseTime; - gint lastWheelMouseDirection; - gint wheelMouseIntensity; - -#if GTK_CHECK_VERSION(3,0,0) - cairo_rectangle_list_t *rgnUpdate; -#else - GdkRegion *rgnUpdate; -#endif - bool repaintFullWindow; - - guint styleIdleID; - - // Private so ScintillaGTK objects can not be copied - ScintillaGTK(const ScintillaGTK &); - ScintillaGTK &operator=(const ScintillaGTK &); - -public: - explicit ScintillaGTK(_ScintillaObject *sci_); - virtual ~ScintillaGTK(); - static void ClassInit(OBJECT_CLASS* object_class, GtkWidgetClass *widget_class, GtkContainerClass *container_class); -private: - virtual void Initialise(); - virtual void Finalise(); - virtual bool AbandonPaint(); - virtual void DisplayCursor(Window::Cursor c); - virtual bool DragThreshold(Point ptStart, Point ptNow); - virtual void StartDrag(); - int TargetAsUTF8(char *text); - int EncodedFromUTF8(char *utf8, char *encoded) const; - virtual bool ValidCodePage(int codePage) const; -public: // Public for scintilla_send_message - virtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam); -private: - virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam); - struct TimeThunk { - TickReason reason; - ScintillaGTK *scintilla; - guint timer; - TimeThunk() : reason(tickCaret), scintilla(NULL), timer(0) {} - }; - TimeThunk timers[tickDwell+1]; - virtual bool FineTickerAvailable(); - virtual bool FineTickerRunning(TickReason reason); - virtual void FineTickerStart(TickReason reason, int millis, int tolerance); - virtual void FineTickerCancel(TickReason reason); - virtual bool SetIdle(bool on); - virtual void SetMouseCapture(bool on); - virtual bool HaveMouseCapture(); - virtual bool PaintContains(PRectangle rc); - void FullPaint(); - virtual PRectangle GetClientRectangle() const; - virtual void ScrollText(int linesToMove); - virtual void SetVerticalScrollPos(); - virtual void SetHorizontalScrollPos(); - virtual bool ModifyScrollBars(int nMax, int nPage); - void ReconfigureScrollBars(); - virtual void NotifyChange(); - virtual void NotifyFocus(bool focus); - virtual void NotifyParent(SCNotification scn); - void NotifyKey(int key, int modifiers); - void NotifyURIDropped(const char *list); - const char *CharacterSetID() const; - virtual CaseFolder *CaseFolderForEncoding(); - virtual std::string CaseMapString(const std::string &s, int caseMapping); - virtual int KeyDefault(int key, int modifiers); - virtual void CopyToClipboard(const SelectionText &selectedText); - virtual void Copy(); - virtual void Paste(); - virtual void CreateCallTipWindow(PRectangle rc); - virtual void AddToPopUp(const char *label, int cmd = 0, bool enabled = true); - bool OwnPrimarySelection(); - virtual void ClaimSelection(); - void GetGtkSelectionText(GtkSelectionData *selectionData, SelectionText &selText); - void ReceivedSelection(GtkSelectionData *selection_data); - void ReceivedDrop(GtkSelectionData *selection_data); - static void GetSelection(GtkSelectionData *selection_data, guint info, SelectionText *selected); - void StoreOnClipboard(SelectionText *clipText); - static void ClipboardGetSelection(GtkClipboard* clip, GtkSelectionData *selection_data, guint info, void *data); - static void ClipboardClearSelection(GtkClipboard* clip, void *data); - - void UnclaimSelection(GdkEventSelection *selection_event); - void Resize(int width, int height); - - // Callback functions - void RealizeThis(GtkWidget *widget); - static void Realize(GtkWidget *widget); - void UnRealizeThis(GtkWidget *widget); - static void UnRealize(GtkWidget *widget); - void MapThis(); - static void Map(GtkWidget *widget); - void UnMapThis(); - static void UnMap(GtkWidget *widget); - gint FocusInThis(GtkWidget *widget); - static gint FocusIn(GtkWidget *widget, GdkEventFocus *event); - gint FocusOutThis(GtkWidget *widget); - static gint FocusOut(GtkWidget *widget, GdkEventFocus *event); - static void SizeRequest(GtkWidget *widget, GtkRequisition *requisition); -#if GTK_CHECK_VERSION(3,0,0) - static void GetPreferredWidth(GtkWidget *widget, gint *minimalWidth, gint *naturalWidth); - static void GetPreferredHeight(GtkWidget *widget, gint *minimalHeight, gint *naturalHeight); -#endif - static void SizeAllocate(GtkWidget *widget, GtkAllocation *allocation); -#if GTK_CHECK_VERSION(3,0,0) - gboolean DrawTextThis(cairo_t *cr); - static gboolean DrawText(GtkWidget *widget, cairo_t *cr, ScintillaGTK *sciThis); - gboolean DrawThis(cairo_t *cr); - static gboolean DrawMain(GtkWidget *widget, cairo_t *cr); -#else - gboolean ExposeTextThis(GtkWidget *widget, GdkEventExpose *ose); - static gboolean ExposeText(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis); - gboolean Expose(GtkWidget *widget, GdkEventExpose *ose); - static gboolean ExposeMain(GtkWidget *widget, GdkEventExpose *ose); -#endif - void ForAll(GtkCallback callback, gpointer callback_data); - static void MainForAll(GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); - - static void ScrollSignal(GtkAdjustment *adj, ScintillaGTK *sciThis); - static void ScrollHSignal(GtkAdjustment *adj, ScintillaGTK *sciThis); - gint PressThis(GdkEventButton *event); - static gint Press(GtkWidget *widget, GdkEventButton *event); - static gint MouseRelease(GtkWidget *widget, GdkEventButton *event); - static gint ScrollEvent(GtkWidget *widget, GdkEventScroll *event); - static gint Motion(GtkWidget *widget, GdkEventMotion *event); - gboolean KeyThis(GdkEventKey *event); - static gboolean KeyPress(GtkWidget *widget, GdkEventKey *event); - static gboolean KeyRelease(GtkWidget *widget, GdkEventKey *event); -#if GTK_CHECK_VERSION(3,0,0) - gboolean DrawPreeditThis(GtkWidget *widget, cairo_t *cr); - static gboolean DrawPreedit(GtkWidget *widget, cairo_t *cr, ScintillaGTK *sciThis); -#else - gboolean ExposePreeditThis(GtkWidget *widget, GdkEventExpose *ose); - static gboolean ExposePreedit(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis); -#endif - - bool KoreanIME(); - void CommitThis(char *str); - static void Commit(GtkIMContext *context, char *str, ScintillaGTK *sciThis); - void PreeditChangedInlineThis(); - void PreeditChangedWindowedThis(); - static void PreeditChanged(GtkIMContext *context, ScintillaGTK *sciThis); - void MoveImeCarets(int pos); - void DrawImeIndicator(int indicator, int len); - void SetCandidateWindowPos(); - - static void StyleSetText(GtkWidget *widget, GtkStyle *previous, void*); - static void RealizeText(GtkWidget *widget, void*); - static void Dispose(GObject *object); - static void Destroy(GObject *object); - static void SelectionReceived(GtkWidget *widget, GtkSelectionData *selection_data, - guint time); - static void SelectionGet(GtkWidget *widget, GtkSelectionData *selection_data, - guint info, guint time); - static gint SelectionClear(GtkWidget *widget, GdkEventSelection *selection_event); - gboolean DragMotionThis(GdkDragContext *context, gint x, gint y, guint dragtime); - static gboolean DragMotion(GtkWidget *widget, GdkDragContext *context, - gint x, gint y, guint dragtime); - static void DragLeave(GtkWidget *widget, GdkDragContext *context, - guint time); - static void DragEnd(GtkWidget *widget, GdkDragContext *context); - static gboolean Drop(GtkWidget *widget, GdkDragContext *context, - gint x, gint y, guint time); - static void DragDataReceived(GtkWidget *widget, GdkDragContext *context, - gint x, gint y, GtkSelectionData *selection_data, guint info, guint time); - static void DragDataGet(GtkWidget *widget, GdkDragContext *context, - GtkSelectionData *selection_data, guint info, guint time); - static gboolean TimeOut(gpointer ptt); - static gboolean IdleCallback(gpointer pSci); - static gboolean StyleIdle(gpointer pSci); - virtual void IdleWork(); - virtual void QueueIdleWork(WorkNeeded::workItems items, int upTo); - static void PopUpCB(GtkMenuItem *menuItem, ScintillaGTK *sciThis); - -#if GTK_CHECK_VERSION(3,0,0) - static gboolean DrawCT(GtkWidget *widget, cairo_t *cr, CallTip *ctip); -#else - static gboolean ExposeCT(GtkWidget *widget, GdkEventExpose *ose, CallTip *ct); -#endif - static gboolean PressCT(GtkWidget *widget, GdkEventButton *event, ScintillaGTK *sciThis); - - static sptr_t DirectFunction(sptr_t ptr, - unsigned int iMessage, uptr_t wParam, sptr_t lParam); -}; - enum { COMMAND_SIGNAL, NOTIFY_SIGNAL, @@ -379,7 +157,7 @@ static GtkWidget *PWidget(Window &w) { return static_cast<GtkWidget *>(w.GetID()); } -static ScintillaGTK *ScintillaFromWidget(GtkWidget *widget) { +ScintillaGTK *ScintillaGTK::FromWidget(GtkWidget *widget) { ScintillaObject *scio = SCINTILLA(widget); return static_cast<ScintillaGTK *>(scio->pscin); } @@ -394,7 +172,8 @@ ScintillaGTK::ScintillaGTK(_ScintillaObject *sci_) : wheelMouseIntensity(0), rgnUpdate(0), repaintFullWindow(false), - styleIdleID(0) { + styleIdleID(0), + accessible(0) { sci = sci_; wMain = GTK_WIDGET(sci); @@ -527,7 +306,7 @@ void ScintillaGTK::RealizeThis(GtkWidget *widget) { } void ScintillaGTK::Realize(GtkWidget *widget) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); sciThis->RealizeThis(widget); } @@ -560,7 +339,7 @@ void ScintillaGTK::UnRealizeThis(GtkWidget *widget) { } void ScintillaGTK::UnRealize(GtkWidget *widget) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); sciThis->UnRealizeThis(widget); } @@ -594,7 +373,7 @@ void ScintillaGTK::MapThis() { } void ScintillaGTK::Map(GtkWidget *widget) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); sciThis->MapThis(); } @@ -617,7 +396,7 @@ void ScintillaGTK::UnMapThis() { } void ScintillaGTK::UnMap(GtkWidget *widget) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); sciThis->UnMapThis(); } @@ -634,7 +413,7 @@ void ScintillaGTK::ForAll(GtkCallback callback, gpointer callback_data) { } void ScintillaGTK::MainForAll(GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data) { - ScintillaGTK *sciThis = ScintillaFromWidget((GtkWidget *)container); + ScintillaGTK *sciThis = FromWidget((GtkWidget *)container); if (callback != NULL && include_internals) { sciThis->ForAll(callback, callback_data); @@ -690,7 +469,7 @@ gint ScintillaGTK::FocusInThis(GtkWidget *widget) { } gint ScintillaGTK::FocusIn(GtkWidget *widget, GdkEventFocus * /*event*/) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); return sciThis->FocusInThis(widget); } @@ -710,12 +489,12 @@ gint ScintillaGTK::FocusOutThis(GtkWidget *widget) { } gint ScintillaGTK::FocusOut(GtkWidget *widget, GdkEventFocus * /*event*/) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); return sciThis->FocusOutThis(widget); } void ScintillaGTK::SizeRequest(GtkWidget *widget, GtkRequisition *requisition) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); requisition->width = 1; requisition->height = 1; GtkRequisition child_requisition; @@ -745,7 +524,7 @@ void ScintillaGTK::GetPreferredHeight(GtkWidget *widget, gint *minimalHeight, gi #endif void ScintillaGTK::SizeAllocate(GtkWidget *widget, GtkAllocation *allocation) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); try { gtk_widget_set_allocation(widget, allocation); if (IS_WIDGET_REALIZED(widget)) @@ -882,6 +661,12 @@ void ScintillaGTK::Finalise() { for (TickReason tr = tickCaret; tr <= tickDwell; tr = static_cast<TickReason>(tr + 1)) { FineTickerCancel(tr); } + if (accessible) { + gtk_accessible_set_widget(GTK_ACCESSIBLE(accessible), NULL); + g_object_unref(accessible); + accessible = 0; + } + ScintillaBase::Finalise(); } @@ -925,8 +710,11 @@ void ScintillaGTK::StartDrag() { #endif } -static std::string ConvertText(const char *s, size_t len, const char *charSetDest, - const char *charSetSource, bool transliterations, bool silent=false) { +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif +std::string ConvertText(const char *s, size_t len, const char *charSetDest, + const char *charSetSource, bool transliterations, bool silent) { // s is not const because of different versions of iconv disagreeing about const std::string destForm; Converter conv(charSetDest, charSetSource, transliterations); @@ -957,6 +745,9 @@ static std::string ConvertText(const char *s, size_t len, const char *charSetDes } return destForm; } +#ifdef SCI_NAMESPACE +} +#endif // Returns the target converted to UTF8. // Return the length in bytes. @@ -1057,6 +848,17 @@ sptr_t ScintillaGTK::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam case SCI_GETRECTANGULARSELECTIONMODIFIER: return rectangularSelectionModifier; + case SCI_SETREADONLY: { + sptr_t ret = ScintillaBase::WndProc(iMessage, wParam, lParam); + if (accessible) { + ScintillaGTKAccessible *sciAccessible = ScintillaGTKAccessible::FromAccessible(accessible); + if (sciAccessible) { + sciAccessible->NotifyReadOnly(); + } + } + return ret; + } + default: return ScintillaBase::WndProc(iMessage, wParam, lParam); } @@ -1450,40 +1252,6 @@ void ScintillaGTK::Copy() { } } -// helper class to watch a GObject lifetime and get notified when it dies -class GObjectWatcher { - GObject *weakRef; - - void WeakNotifyThis(GObject *obj) { - PLATFORM_ASSERT(obj == weakRef); - - Destroyed(); - weakRef = 0; - } - - static void WeakNotify(gpointer data, GObject *obj) { - static_cast<GObjectWatcher*>(data)->WeakNotifyThis(obj); - } - -public: - GObjectWatcher(GObject *obj) : - weakRef(obj) { - g_object_weak_ref(weakRef, WeakNotify, this); - } - - virtual ~GObjectWatcher() { - if (weakRef) { - g_object_weak_unref(weakRef, WeakNotify, this); - } - } - - virtual void Destroyed() {} - - bool IsDestroyed() { - return weakRef != 0; - } -}; - void ScintillaGTK::Paste() { atomSought = atomUTF8; GtkClipboard *clipBoard = @@ -1968,12 +1736,12 @@ gint ScintillaGTK::PressThis(GdkEventButton *event) { gint ScintillaGTK::Press(GtkWidget *widget, GdkEventButton *event) { if (event->window != WindowFromWidget(widget)) return FALSE; - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); return sciThis->PressThis(event); } gint ScintillaGTK::MouseRelease(GtkWidget *widget, GdkEventButton *event) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); try { //Platform::DebugPrintf("Release %x %d %d\n",sciThis,event->time,event->state); if (!sciThis->HaveMouseCapture()) @@ -1999,7 +1767,7 @@ gint ScintillaGTK::MouseRelease(GtkWidget *widget, GdkEventButton *event) { // win32gtk and GTK >= 2 use SCROLL_* events instead of passing the // button4/5/6/7 events to the GTK app gint ScintillaGTK::ScrollEvent(GtkWidget *widget, GdkEventScroll *event) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); try { if (widget == NULL || event == NULL) @@ -2083,7 +1851,7 @@ gint ScintillaGTK::ScrollEvent(GtkWidget *widget, GdkEventScroll *event) { } gint ScintillaGTK::Motion(GtkWidget *widget, GdkEventMotion *event) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); try { //Platform::DebugPrintf("Motion %x %d\n",sciThis,event->time); if (event->window != WindowFromWidget(widget)) @@ -2314,13 +2082,13 @@ gboolean ScintillaGTK::KeyThis(GdkEventKey *event) { } gboolean ScintillaGTK::KeyPress(GtkWidget *widget, GdkEventKey *event) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); return sciThis->KeyThis(event); } gboolean ScintillaGTK::KeyRelease(GtkWidget *widget, GdkEventKey *event) { //Platform::DebugPrintf("SC-keyrel: %d %x %3s\n",event->keyval, event->state, event->string); - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); if (gtk_im_context_filter_keypress(sciThis->im_context, event)) { return TRUE; } @@ -2768,7 +2536,7 @@ gboolean ScintillaGTK::DrawThis(cairo_t *cr) { } gboolean ScintillaGTK::DrawMain(GtkWidget *widget, cairo_t *cr) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); return sciThis->DrawThis(cr); } @@ -2818,7 +2586,7 @@ gboolean ScintillaGTK::ExposeText(GtkWidget *widget, GdkEventExpose *ose, Scinti } gboolean ScintillaGTK::ExposeMain(GtkWidget *widget, GdkEventExpose *ose) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); //Platform::DebugPrintf("Expose Main %0d,%0d %0d,%0d\n", //ose->area.x, ose->area.y, ose->area.width, ose->area.height); return sciThis->Expose(widget, ose); @@ -2861,14 +2629,14 @@ void ScintillaGTK::ScrollHSignal(GtkAdjustment *adj, ScintillaGTK *sciThis) { void ScintillaGTK::SelectionReceived(GtkWidget *widget, GtkSelectionData *selection_data, guint) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); //Platform::DebugPrintf("Selection received\n"); sciThis->ReceivedSelection(selection_data); } void ScintillaGTK::SelectionGet(GtkWidget *widget, GtkSelectionData *selection_data, guint info, guint) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); try { //Platform::DebugPrintf("Selection get\n"); if (SelectionOfGSD(selection_data) == GDK_SELECTION_PRIMARY) { @@ -2883,7 +2651,7 @@ void ScintillaGTK::SelectionGet(GtkWidget *widget, } gint ScintillaGTK::SelectionClear(GtkWidget *widget, GdkEventSelection *selection_event) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); //Platform::DebugPrintf("Selection clear\n"); sciThis->UnclaimSelection(selection_event); if (GTK_WIDGET_CLASS(sciThis->parentClass)->selection_clear_event) { @@ -2922,12 +2690,12 @@ gboolean ScintillaGTK::DragMotionThis(GdkDragContext *context, gboolean ScintillaGTK::DragMotion(GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint dragtime) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); return sciThis->DragMotionThis(context, x, y, dragtime); } void ScintillaGTK::DragLeave(GtkWidget *widget, GdkDragContext * /*context*/, guint) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); try { sciThis->SetDragPosition(SelectionPosition(invalidPosition)); //Platform::DebugPrintf("DragLeave %x\n", sciThis); @@ -2937,7 +2705,7 @@ void ScintillaGTK::DragLeave(GtkWidget *widget, GdkDragContext * /*context*/, gu } void ScintillaGTK::DragEnd(GtkWidget *widget, GdkDragContext * /*context*/) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); try { // If drag did not result in drop here or elsewhere if (!sciThis->dragWasDropped) @@ -2952,7 +2720,7 @@ void ScintillaGTK::DragEnd(GtkWidget *widget, GdkDragContext * /*context*/) { gboolean ScintillaGTK::Drop(GtkWidget *widget, GdkDragContext * /*context*/, gint, gint, guint) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); try { //Platform::DebugPrintf("Drop %x\n", sciThis); sciThis->SetDragPosition(SelectionPosition(invalidPosition)); @@ -2964,7 +2732,7 @@ gboolean ScintillaGTK::Drop(GtkWidget *widget, GdkDragContext * /*context*/, void ScintillaGTK::DragDataReceived(GtkWidget *widget, GdkDragContext * /*context*/, gint, gint, GtkSelectionData *selection_data, guint /*info*/, guint) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); try { sciThis->ReceivedDrop(selection_data); sciThis->SetDragPosition(SelectionPosition(invalidPosition)); @@ -2975,7 +2743,7 @@ void ScintillaGTK::DragDataReceived(GtkWidget *widget, GdkDragContext * /*contex void ScintillaGTK::DragDataGet(GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); + ScintillaGTK *sciThis = FromWidget(widget); try { sciThis->dragWasDropped = true; if (!sciThis->sel.Empty()) { @@ -3044,6 +2812,28 @@ void ScintillaGTK::QueueIdleWork(WorkNeeded::workItems items, int upTo) { } } +void ScintillaGTK::SetDocPointer(Document *document) { + Document *oldDoc = 0; + ScintillaGTKAccessible *sciAccessible = 0; + if (accessible) { + sciAccessible = ScintillaGTKAccessible::FromAccessible(accessible); + if (sciAccessible && pdoc) { + oldDoc = pdoc; + oldDoc->AddRef(); + } + } + + Editor::SetDocPointer(document); + + if (sciAccessible) { + // the accessible needs have the old Document, but also the new one active + sciAccessible->ChangeDocument(oldDoc, pdoc); + } + if (oldDoc) { + oldDoc->Release(); + } +} + void ScintillaGTK::PopUpCB(GtkMenuItem *menuItem, ScintillaGTK *sciThis) { guint action = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(menuItem), "CmdNum")); if (action) { @@ -3109,6 +2899,14 @@ gboolean ScintillaGTK::ExposeCT(GtkWidget *widget, GdkEventExpose * /*ose*/, Cal #endif +AtkObject* ScintillaGTK::GetAccessibleThis(GtkWidget *widget) { + return ScintillaGTKAccessible::WidgetGetAccessibleImpl(widget, &accessible, scintilla_class_parent_class); +} + +AtkObject* ScintillaGTK::GetAccessible(GtkWidget *widget) { + return FromWidget(widget)->GetAccessibleThis(widget); +} + sptr_t ScintillaGTK::DirectFunction( sptr_t ptr, unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return reinterpret_cast<ScintillaGTK *>(ptr)->WndProc(iMessage, wParam, lParam); @@ -3217,6 +3015,8 @@ void ScintillaGTK::ClassInit(OBJECT_CLASS* object_class, GtkWidgetClass *widget_ widget_class->map = Map; widget_class->unmap = UnMap; + widget_class->get_accessible = GetAccessible; + container_class->forall = MainForAll; } |