notepad-plus-plus/scintilla/macosx/ScintillaMacOSX.h

239 lines
8.5 KiB
C++

/*
* ScintillaMacOSX.h
* tutorial
*
* Original code by Evan Jones on Sun Sep 01 2002.
* Contributors:
* Shane Caraveo, ActiveState
* Bernd Paradies, Adobe
*
*/
#include "TView.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <time.h>
#include <vector>
#include "Platform.h"
#include "Scintilla.h"
#include "PlatMacOSX.h"
#include "ScintillaWidget.h"
#ifdef SCI_LEXER
#include "SciLexer.h"
#include "PropSetSimple.h"
#include "ILexer.h"
#include "LexAccessor.h"
#include "Accessor.h"
#endif
#include "SVector.h"
#include "SplitVector.h"
#include "Partitioning.h"
#include "RunStyles.h"
#include "ContractionState.h"
#include "CellBuffer.h"
#include "CallTip.h"
#include "KeyMap.h"
#include "Indicator.h"
#include "XPM.h"
#include "LineMarker.h"
#include "Style.h"
#include "AutoComplete.h"
#include "ViewStyle.h"
#include "CharClassify.h"
#include "Decoration.h"
#include "Document.h"
#include "Selection.h"
#include "PositionCache.h"
#include "Editor.h"
#include "ScintillaBase.h"
#include "ScintillaCallTip.h"
static const OSType scintillaMacOSType = 'Scin';
namespace Scintilla {
/**
On the Mac, there is no WM_COMMAND or WM_NOTIFY message that can be sent
back to the parent. Therefore, there must be a callback handler that acts
like a Windows WndProc, where Scintilla can send notifications to. Use
ScintillaMacOSX::registerNotifyHandler() to register such a handler.
Messgae format is:
<br>
WM_COMMAND: HIWORD (wParam) = notification code, LOWORD (wParam) = 0 (no control ID), lParam = ScintillaMacOSX*
<br>
WM_NOTIFY: wParam = 0 (no control ID), lParam = ptr to SCNotification structure, with hwndFrom set to ScintillaMacOSX*
*/
typedef void(*SciNotifyFunc) (intptr_t windowid, unsigned int iMessage, uintptr_t wParam, uintptr_t lParam);
/**
Scintilla sends these two messages to the nofity handler. Please refer
to the Windows API doc for details about the message format.
*/
#define WM_COMMAND 1001
#define WM_NOTIFY 1002
class ScintillaMacOSX : public ScintillaBase, public TView
{
public:
HIViewRef vScrollBar;
HIViewRef hScrollBar;
SInt32 scrollBarFixedSize;
SciNotifyFunc notifyProc;
intptr_t notifyObj;
bool capturedMouse;
// true if scintilla initiated the drag session
bool inDragSession() { return inDragDrop == ddDragging; };
bool isTracking;
// Private so ScintillaMacOSX objects can not be copied
ScintillaMacOSX(const ScintillaMacOSX &) : ScintillaBase(), TView( NULL ) {}
ScintillaMacOSX &operator=(const ScintillaMacOSX &) { return * this; }
public:
/** This is the class ID that we've assigned to Scintilla. */
static const CFStringRef kScintillaClassID;
static const ControlKind kScintillaKind;
ScintillaMacOSX( void* windowid );
virtual ~ScintillaMacOSX();
//~ static void ClassInit(GtkObjectClass* object_class, GtkWidgetClass *widget_class);
/** Returns the HIView object kind, needed to subclass TView. */
virtual ControlKind GetKind() { return kScintillaKind; }
/// Register the notify callback
void registerNotifyCallback(intptr_t windowid, SciNotifyFunc callback);
private:
virtual void Initialise();
virtual void Finalise();
// pasteboard support
bool GetPasteboardData(PasteboardRef &pasteBoard,
SelectionText *selectedText, bool *isFileURL);
void SetPasteboardData(PasteboardRef &pasteBoard,
const SelectionText &selectedText,
bool inDragDropSession);
char *GetStringFromCFString(CFStringRef &textString, int *textLen);
// Drag and drop
virtual void StartDrag();
Scintilla::Point GetDragPoint(DragRef inDrag);
bool GetDragData(DragRef inDrag, PasteboardRef &pasteBoard,
SelectionText *selectedText,
bool *isFileURL);
void SetDragCursor(DragRef inDrag);
virtual bool DragEnter(DragRef inDrag );
virtual bool DragWithin(DragRef inDrag );
virtual bool DragLeave(DragRef inDrag );
virtual OSStatus DragReceive(DragRef inDrag );
void DragScroll();
int scrollSpeed;
int scrollTicks;
EventRecord mouseDownEvent;
MouseTrackingRef mouseTrackingRef;
MouseTrackingRegionID mouseTrackingID;
HIPoint GetLocalPoint(::Point pt);
void InsertCharacters (const UniChar* buf, int len);
static pascal void IdleTimerEventHandler(EventLoopTimerRef inTimer,
EventLoopIdleTimerMessage inState,
void *scintilla );
public: // Public for scintilla_send_message
virtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
void SyncPaint( void* gc, PRectangle rc);
//void FullPaint( void* gc );
virtual void Draw( RgnHandle rgn, CGContextRef gc );
virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
virtual void SetTicking(bool on);
virtual bool SetIdle(bool on);
virtual void SetMouseCapture(bool on);
virtual bool HaveMouseCapture();
virtual PRectangle GetClientRectangle();
virtual void ScrollText(int linesToMove);
virtual void SetVerticalScrollPos();
virtual void SetHorizontalScrollPos();
virtual bool ModifyScrollBars(int nMax, int nPage);
virtual void ReconfigureScrollBars();
void Resize(int width, int height);
static pascal void LiveScrollHandler( ControlHandle control, SInt16 part );
bool ScrollBarHit(HIPoint location);
virtual void NotifyChange();
virtual void NotifyFocus(bool focus);
virtual void NotifyParent(SCNotification scn);
void NotifyKey(int key, int modifiers);
void NotifyURIDropped(const char *list);
#ifndef EXT_INPUT
// Extended UTF8-UTF6-conversion to handle surrogate pairs correctly (CL265070)
virtual int KeyDefault(int key, int modifiers);
#endif
static pascal OSStatus CommandEventHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* data );
bool HasSelection();
bool CanUndo();
bool CanRedo();
bool AlwaysTrue();
virtual void CopyToClipboard(const SelectionText &selectedText);
virtual void Copy();
virtual bool CanPaste();
virtual void Paste();
virtual void Paste(bool rectangular);
virtual void CreateCallTipWindow(PRectangle rc);
virtual void AddToPopUp(const char *label, int cmd = 0, bool enabled = true);
virtual void ClaimSelection();
void ClearSelectionSimple() {
ClearSelection();
}
static sptr_t DirectFunction(ScintillaMacOSX *sciThis,
unsigned int iMessage, uptr_t wParam, sptr_t lParam);
/** Timer event handler. Simply turns around and calls Tick. */
virtual void TimerFired( EventLoopTimerRef );
virtual OSStatus BoundsChanged( UInt32 inOptions, const HIRect& inOriginalBounds, const HIRect& inCurrentBounds, RgnHandle inInvalRgn );
virtual ControlPartCode HitTest( const HIPoint& where );
virtual OSStatus SetFocusPart( ControlPartCode desiredFocus, RgnHandle, Boolean, ControlPartCode* outActualFocus );
virtual OSStatus TextInput( TCarbonEvent& event );
// Configure the features of this control
virtual UInt32 GetBehaviors();
virtual OSStatus MouseDown( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount, TCarbonEvent& inEvent );
virtual OSStatus MouseDown( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount );
virtual OSStatus MouseDown( EventRecord *rec );
virtual OSStatus MouseUp( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount );
virtual OSStatus MouseUp( EventRecord *rec );
virtual OSStatus MouseDragged( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount );
virtual OSStatus MouseDragged( EventRecord *rec );
virtual OSStatus MouseEntered( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount );
virtual OSStatus MouseExited( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount );
virtual OSStatus MouseWheelMoved( EventMouseWheelAxis axis, SInt32 delta, UInt32 modifiers );
virtual OSStatus ContextualMenuClick( HIPoint& location );
virtual OSStatus ActiveStateChanged();
virtual void CallTipClick();
public:
static HIViewRef Create();
private:
static OSStatus Construct( HIViewRef inControl, TView** outView );
};
}