qstescintillabase.cpp

来自「porting scintilla to qt」· C++ 代码 · 共 713 行 · 第 1/2 页

CPP
713
字号
	Point pos(event->x(),event->y());	if(event->button() == Qt::LeftButton){		unsigned clickTime;		if(triple_click.isActive() && (event->globalPos() - triple_click_at).manhattanLength() < QApplication::startDragDistance())			clickTime = lastClickTime + Platform::DoubleClickTime() - 1;		else			clickTime = lastClickTime + Platform::DoubleClickTime() + 1;		triple_click.stop();		bool shift = event->modifiers() & Qt::ShiftModifier;		bool ctrl = event->modifiers() & Qt::ControlModifier;		bool alt = event->modifiers() & Qt::AltModifier;//		ButtonDown(pos,clickTime,shift,ctrl,alt); change alt<->shift just to cheat reflection		ButtonDown(pos,clickTime,alt,ctrl,shift);	}else if(event->button() == Qt::MidButton){		QClipboard *cb = QApplication::clipboard();		if(cb->supportsSelection()){			int ppos = PositionFromLocation(pos);			SetSelection(ppos,ppos);			pasteFromClipboard(QClipboard::Selection);		}	}}//reimplemented to handle mouse releasesvoid QSteScintillaBase::mouseReleaseEvent(QMouseEvent *event){	if(HaveMouseCapture() && event->button() == Qt::LeftButton){ //inherits from Editor		bool ctrl  = event->modifiers() & Qt::ControlModifier;		ButtonUp(Point(event->x(),event->y()),0,ctrl);	}}//reimplemented to handle viewport paintvoid QSteScintillaBase::paintEvent(QPaintEvent *event){	Surface *sw = Surface::Allocate();	if(!sw)		return;	paintState = painting;//inherits from Editor	const QRect &rect = event->rect();	rcPaint.left = rect.left();//inherits from Editor	rcPaint.top = rect.top();	rcPaint.bottom = rect.bottom() + 1;	rcPaint.right = rect.right() + 1;	PRectangle rctext = GetTextRectangle();	paintingAllText = rcPaint.Contains(rctext);	QPainter painter(viewport());	sw->Init(&painter);	sw->SetUnicodeMode(CodePage() == SC_CP_UTF8);	Paint(sw,rcPaint);	delete sw;	if(paintState == paintAbandoned)		update();	paintState = notPainting;}//reimplemented to handle resizesvoid QSteScintillaBase::resizeEvent(QResizeEvent *event){	ChangeSize();//inherits from Editor}//reimplemented to handle scrollingvoid QSteScintillaBase::scrollContentsBy(int dx,int dy){}void QSteScintillaBase::handleTimer(){	Tick();//inherits from Editor}void QSteScintillaBase::handleVSb(int value){	ScrollTo(value);}void QSteScintillaBase::handleHSb(int value){	HorizontalScrollTo(value);}void QSteScintillaBase::handleSelection(){	if(!QApplication::clipboard()->ownsSelection())		unclaimSelection();}sptr_t QSteScintillaBase::WndProc(unsigned int msg,uptr_t wparam,sptr_t lparam){	switch(msg){		case SCI_GETDIRECTFUNCTION:			return reinterpret_cast<sptr_t>(DirectFunction);		case SCI_GETDIRECTPOINTER:			return reinterpret_cast<sptr_t>(this);	}	return ScintillaBase::WndProc(msg,wparam,lparam);}sptr_t QSteScintillaBase::DirectFunction(QSteScintillaBase *qste, unsigned int msg,uptr_t wparam,sptr_t lparam){    return qste->WndProc(msg,wparam,lparam);}void QSteScintillaBase::Initialise(){	SetTicking(true);//inherits from Editor}void QSteScintillaBase::Finalise(){	SetTicking(false);	ScintillaBase::Finalise();}void QSteScintillaBase::StartDrag()//overload of Editor{	QMimeData *mime = new QMimeData;	mime->setText(textRange(&drag));//drag inherits from Editor	QDrag *d = new QDrag(this);	d->setMimeData(mime);		Qt::DropActions actions = Qt::CopyAction;	if(!pdoc->IsReadOnly())		actions |= Qt::MoveAction;	Qt::DropAction act = d->start(actions);	if(act == Qt::MoveAction && d->target() != this)		ClearSelection();	inDragDrop = ddNone;//inDragDrop inherits from Editor 	SetDragPosition(-1);//inDragDrop inherits from Editor}sptr_t QSteScintillaBase::DefWndProc(unsigned int,uptr_t,sptr_t){	return 0;}void QSteScintillaBase::SetTicking(bool on){	if(timer.ticking != on){//timer inherits from scintillaBase->Editor		timer.ticking = on;		if(timer.ticking){			qtimer.start(timer.tickSize);		}else{			qtimer.stop();		}	}	timer.ticksToWait = caret.period;//caret inherits from scintillabase->Editor}void QSteScintillaBase::SetMouseCapture(bool on){	if(mouseDownCaptures){//mouseDownCaptures inherits from scintillaBase->Editor		if(on)			viewport()->grabMouse();		else			viewport()->releaseMouse();	}	capturedMouse = on;}bool QSteScintillaBase::HaveMouseCapture(){	return capturedMouse;}void QSteScintillaBase::SetVerticalScrollPos(){	verticalScrollBar()->setValue(topLine);//topLine inherits from scintillaBase->Editor}void QSteScintillaBase::SetHorizontalScrollPos(){	horizontalScrollBar()->setValue(xOffset);//xOffset inherits from scintillaBase->Editor}bool QSteScintillaBase::ModifyScrollBars(int nmax,int npage){	verticalScrollBar()->setMinimum(0);	horizontalScrollBar()->setMinimum(0);	verticalScrollBar()->setMaximum(nmax - npage + 1);	horizontalScrollBar()->setMaximum(scrollWidth);//scrollWidth inherits from scintillaBase->Editor	verticalScrollBar()->setSingleStep(1);//will get from QSteGlobalProper	verticalScrollBar()->setPageStep(npage);	horizontalScrollBar()->setPageStep(scrollWidth/10);	return true;}void QSteScintillaBase::reconfigureScrollBars(){	bool show = (horizontalScrollBarVisible && wrapState == eWrapNone);//wrap & eWrapNone inherit from scintillaBase->Editor	setHorizontalScrollBarPolicy(show? Qt::ScrollBarAlwaysOn : Qt::ScrollBarAlwaysOff);	setVerticalScrollBarPolicy(verticalScrollBarVisible ? Qt::ScrollBarAlwaysOn : Qt::ScrollBarAlwaysOff);}void QSteScintillaBase::NotifyChange(){	emit qsteDocChanged();}void QSteScintillaBase::NotifyParent(SCNotification scn)//inherits from Editor{	switch(scn.nmhdr.code){		case SCN_CALLTIPCLICK:			emit qsteCallTipClick(scn.position);			break;		case SCN_AUTOCSELECTION:			printf("notify autocomplete\n");			emit qsteAutoCompleteSelect(scn.text,scn.lParam);			break;		case SCN_CHARADDED:			emit qsteAddCharacter(scn.ch);			break;		case SCN_DOUBLECLICK:			emit qsteDoubleClick(scn.position,scn.line,scn.modifiers);			break;		case SCN_DWELLEND:			emit qsteDwellEnd(scn.position,scn.x,scn.y);			break;		case SCN_DWELLSTART:			emit qsteDwellStart(scn.position,scn.x,scn.y);			break;		case SCN_HOTSPOTCLICK:			emit qsteHotspotClick(scn.position,scn.modifiers);			break;		case SCN_HOTSPOTDOUBLECLICK:			emit qsteHotspotDoubleClick(scn.position,scn.modifiers);			break;		case SCN_MACRORECORD:			emit qsteMarcoRecordExecute(scn.message,scn.wParam,scn.lParam);			break;		case SCN_MARGINCLICK:			emit qsteMarginClick(scn.position,scn.modifiers,scn.margin);			break;		case SCN_MODIFYATTEMPTRO:			emit qsteModifiedReadOnly();			break;		case SCN_NEEDSHOWN:			emit qsteNeedShown(scn.position,scn.length);			break;		case SCN_PAINTED://	emit qstep();			break;		case SCN_SAVEPOINTLEFT:			emit qsteSavePointLeft();			break;		case SCN_SAVEPOINTREACHED:			emit qsteSavePointReached();			break;		case SCN_STYLENEEDED:			emit qsteStyleNeeded(scn.position);			break;		case SCN_UPDATEUI:			emit qsteUpdated();			break;		case SCN_USERLISTSELECTION:			emit qsteUserListSelection(scn.text,scn.wParam);			break;		case SCN_ZOOM:			emit qsteZoom();			break;		default: //no undefined msgId			break;	}}void QSteScintillaBase::CopyToClipboard(const SelectionText &seltext){	QApplication::clipboard()->setText(textRange(&seltext));}void QSteScintillaBase::Copy(){	if(currentPos != anchor){		SelectionText text;		CopySelectionRange(&text);//inherits from Editor		CopyToClipboard(text);	}}void QSteScintillaBase::Paste(){	pasteFromClipboard(QClipboard::Clipboard);}void QSteScintillaBase::CreateCallTipWindow(PRectangle rc){	if(!ct.wCallTip.Created())//ct inher		ct.wCallTip = ct.wDraw = new QSteCallTip(this);	QSteCallTip *wtip = reinterpret_cast<QSteCallTip *>(ct.wCallTip.GetID());	wtip->resize(rc.right - rc.left,rc.bottom - rc.top);	ct.wCallTip.Show();}void QSteScintillaBase::AddToPopUp(const char *label,int cmd,bool enable){	QStePopup *pmenuitem = static_cast<QStePopup *>(popup.GetID());//popup inherits from ScintillaBase	if(*label)		pmenuitem->addItem(qApp->translate("ContextMenu",label),cmd,enable,this);	else		pmenuitem->addSeparator();}void QSteScintillaBase::ClaimSelection(){	bool isSel = (currentPos != anchor);	if(isSel){		QClipboard *cb = QApplication::clipboard();		if(cb->supportsSelection()){			SelectionText text;			CopySelectionRange(&text);			if(text.s)				cb->setText(text.s,QClipboard::Selection);		}		primarySelection = true;//primarySelection inherits from Editor	}else{		primarySelection = false;	}	emit qsteSelectChanged(isSel);}void QSteScintillaBase::unclaimSelection(){	if(primarySelection){		primarySelection = false;		viewport()->update();	}}QString QSteScintillaBase::textRange(const SelectionText *seltext){	if(!seltext->s)		return QString();	if(IsUnicodeMode())//inherits from Editor		return QString::fromUtf8(seltext->s);	else		return QString::fromLatin1(seltext->s);}void QSteScintillaBase::pasteFromClipboard(QClipboard::Mode mode){	QString str = QApplication::clipboard()->text(mode);		if(str.isEmpty())		return;	pdoc->BeginUndoAction();	ClearSelection();//inherts from Editor	int len;	const char *s;	QByteArray bytes;	if(IsUnicodeMode()){		bytes = str.toUtf8();		len = bytes.length();		s =  bytes.data();	}else{		bytes = str.toLatin1();		len = bytes.length();		s = bytes.data();	}	if(len > 0)		pdoc->InsertString(currentPos,s,len);	SetEmptySelection(currentPos + len);	pdoc->EndUndoAction();	NotifyChange();	Redraw();//inherits from Editor}void QSteScintillaBase::startAutoComplete(){}bool QSteScintillaBase::gotoBraceMatch(){	return true;}void QSteScintillaBase::selectBraceMatch(){}void QSteScintillaBase::insertAbbreviation(){}void QSteScintillaBase::expandAbbreviation(){}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?