diff options
Diffstat (limited to 'gtk/ScintillaGTK.h')
-rw-r--r-- | gtk/ScintillaGTK.h | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/gtk/ScintillaGTK.h b/gtk/ScintillaGTK.h new file mode 100644 index 000000000..e98176328 --- /dev/null +++ b/gtk/ScintillaGTK.h @@ -0,0 +1,287 @@ +// Scintilla source code edit control +// ScintillaGTK.h - GTK+ specific subclass of ScintillaBase +// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org> +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef SCINTILLAGTK_H +#define SCINTILLAGTK_H + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +class ScintillaGTKAccessible; + +#define OBJECT_CLASS GObjectClass + +class ScintillaGTK : public ScintillaBase { + friend class ScintillaGTKAccessible; + + _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; + AtkObject *accessible; + + // Private so ScintillaGTK objects can not be copied + ScintillaGTK(const ScintillaGTK &); + ScintillaGTK &operator=(const ScintillaGTK &); + +public: + explicit ScintillaGTK(_ScintillaObject *sci_); + virtual ~ScintillaGTK(); + static ScintillaGTK *FromWidget(GtkWidget *widget); + 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 + AtkObject* GetAccessibleThis(GtkWidget *widget); + static AtkObject* GetAccessible(GtkWidget *widget); + + 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); + virtual void SetDocPointer(Document *document); + 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); +}; + +// 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; + } +}; + +std::string ConvertText(const char *s, size_t len, const char *charSetDest, + const char *charSetSource, bool transliterations, bool silent=false); + +#ifdef SCI_NAMESPACE +} +#endif + +#endif |