Exemplo n.º 1
0
//timer - blikani kurzoru & scrolovani mysi
int CGUIEditWindow::TimerImpulse(typeID timerID, float time)
{

	if(timerID==cursorblinktimerID)
	{
		if(focused) //blikani kurzoru
		{
			blttext->BlinkCursor();
			cursorblinktimerID = timerGUI->AddRequest(this,.5);
		}
	}
	else
	if(timerID==mousescrolltimerID)
	{
		mousescrolltimerID=0; //scrolovani mysi
		if(mousescroll)
		{
				text->DoneUndo();
				float x=(float)mousescx,y=(float)mousescy;
				InnerCoords(x,y);
				TransformCoordsFrontToBack(x,y);
				int xx=(int)x,yy=(int)y;
				blttext->TransformCoords(xx,yy);
				text->GetCursor()->MoveXY(xx,yy);
				text->SetMarkEnd();
				ScrollToCursor();
				blttext->SetNeedRecalc();

				SetMouseScrollTimer();
				CursorMoved();
		}
	}
	return 0;
}
Exemplo n.º 2
0
//pohyb mysi nad oknem
int CGUIEditWindow::MouseOver(float x, float y, UINT over,UINT state)
{
	mousescroll=0;
	if(CGUIStdWindow::MouseOver(x,y,over,state))
	{
		if(!focused) return 1;
		if(mousesel&&text->GetMarkStart())
		{
			mousescx=(int)x;mousescy=(int)y;
			InnerCoords(x,y);
			if(TransformCoordsFrontToBack(x,y))
			{
				text->DoneUndo();
				int xx,yy;
				xx=(int)x;yy=(int)y;
				blttext->TransformCoords(xx,yy);
				text->GetCursor()->MoveXY(xx,yy);
				text->SetMarkEnd();
				ScrollToCursor();
				blttext->SetNeedRecalc();		
				CursorMoved();
			}else
			{				
				mousescroll=1;
				SetMouseScrollTimer();
			}
		}
		return 1;
	}
	return 0;
}
Exemplo n.º 3
0
void sTextControl::SetCursor(sInt x,sInt y)
{
  sInt i;

  i = 0;
  while(y>0)
  {
    if(Text[i]==0)
      return;
    if(Text[i]=='\n')
      y--;
    i++;
  }
  while(x>0)
  {
    if(Text[i]==0)
      return;
    if(Text[i]=='\n')
      y--;
    i++;
  }
  Cursor = i;
  CursorWish = x;
  SelMode = 0;
  ScrollToCursor();
}
Exemplo n.º 4
0
int CGUIEditWindow::Cut()
{
	if(readonly) return 0;
	if(!text->IsMarked()){
		text->GetCursor()->MoveHome();
		text->SetMarkStart();
		text->GetCursor()->MoveEnd();
		text->GetCursor()->MoveRight();
		text->SetMarkEnd();
	}
	
	Copy();
	text->DeleteSelectedText(); //smazu oznaceny text
	
	if(highlight)
	{//highlightuju
		highlighter->HighlightFromBlock(text->GetCursor()->GetBlock());
		text->GetCursor()->CalcFormat();		
	}
	blttext->BlinkCursor(1);
	SetTextSize();
	ScrollToCursor();
	blttext->SetNeedRecalc();

	changed = 1; ChangedEvent();
	CursorMoved();

	return 1;
}
Exemplo n.º 5
0
void CGUIEditWindow::BadInput()
{
	text->UnMark();
	text->GetCursor()->MoveTextEnd();
	text->SetMarkStart();
	text->GetCursor()->MoveTextHome();
	text->SetMarkEnd();
	ScrollToCursor();

	changed=1; ChangedEvent();
}
Exemplo n.º 6
0
int CGUIEditWindow::MoveCursorToLine(int line, int column)
{
	text->UnMark();
	if(!text->GetCursor()->SetCursorPos(line,column))
	{
		text->GetCursor()->MoveTextEnd();
	}
	blttext->BlinkCursor(1); //zobrazi kurzor (blika)
	ScrollToCursor(1); // nascroluje, aby byl kurzor videt
	blttext->SetNeedRecalc();
	CursorMoved();
	return 1;
}
Exemplo n.º 7
0
void sTextControl::SetSelection(sInt cursor,sInt sel)
{
  sInt len;

  len = sGetStringLen(Text);
  if(cursor>=0 && sel>=0 && cursor<=len && sel<=len)
  {
    Cursor = cursor;
    SelPos = sel;
    SelMode = 1;
    ScrollToCursor();
  }
}
Exemplo n.º 8
0
//levy tlacitko mysi
int CGUIEditWindow::MouseLeft(float x, float y, UINT mouseState, UINT keyState)
{
	mousescroll=0;
	if(CGUIStdWindow::MouseLeft(x,y,mouseState,keyState))
	{
		if(!focused) return 1;

		if(!mouseState && !mousesel) return 1;

		InnerCoords(x,y);
		if(TransformCoordsFrontToBack(x,y))
		{
			text->DoneUndo();

			int xx,yy;
			xx=(int)x;yy=(int)y;
			blttext->TransformCoords(xx,yy);

			if(mouseState && mainGUI->key_shift && !text->GetMarkStart() )
			{
				text->UnMark();
				text->SetMarkStart();
			}

			text->GetCursor()->MoveXY(xx,yy); //nastavi kurzor na pozici mysi

			if(mouseState)
			{
				if(!mainGUI->key_shift)
				{
					text->UnMark();
					text->SetMarkStart();
				}else
					text->SetMarkEnd();
				mousesel=1;
			}else
			{
				text->SetMarkEnd();
				mousesel=0;
			}

			blttext->BlinkCursor(1);
			if(!mouseState) ScrollToCursor();
			blttext->SetNeedRecalc();
			CursorMoved();
		}else
			mousesel=0;
		return 1;
	}
	return 0;
}
Exemplo n.º 9
0
void sTextControl::Log(sChar *s)
{
  sInt tl,sl,stat;

  stat = Static;
  Static = 0;
  tl = sGetStringLen(Text);
  sl = sGetStringLen(s);
  Engine(tl,sl,s);
  Cursor = tl+sl;
  ScrollToCursor();
  Static = stat;
  RecalcSize = sTRUE;
}
Exemplo n.º 10
0
int CGUIEditWindow::Redo()
{
	if(readonly) return 0;
		
	text->Redo(highlighter);
	blttext->BlinkCursor(1);
	SetTextSize();
	ScrollToCursor();
	blttext->SetNeedRecalc();

	changed = 1; ChangedEvent();
	CursorMoved();

	return 1;
}
Exemplo n.º 11
0
//prenos dat do editboxu
int CGUIEditWindow::SetParametr(void *value, int type, int size, int which)
{
	char *s;int dels=0;
	int sz=-1;
	switch(which)
	{
	case 0:
		switch(type)
		{
		case dtString:
		case dtChar: //dostal jsem string
			s=(char*)value;
			sz=size;
			break;
		case dtInt: //dostal jsem int
			s  = new char[100]; dels=1;
			_snprintf(s,99,"%i",*(int*)value);
			break;
		case dtDouble: //dostal jsem double
			s  = new char[100]; dels=1;
			_snprintf(s,99,"%.10g",*(double*)value);
			break;
		default:
			return 1;
		}

		text->UnMark();
		text->SetText(s,sz); 
		if(dels) delete[] s;
		text->GetCursor()->MoveTextHome();
		
		if(highlight&&highlighter)
		{
			highlighter->Highlight();
			text->GetCursor()->CalcFormat();
		}

		SetTextSize();
		ScrollToCursor();
		blttext->SetNeedRecalc();

		changed = 1; ChangedEvent();
		CursorMoved();
		break;
	}
	return 1;
}
Exemplo n.º 12
0
int CGUIEditWindow::Paste()
{
	if(readonly) return 0;

	if(text->IsMarked())
		text->DeleteSelectedText(1,1); //smazu oznaceny text	
	text->PasteFromClipboard(multiline,highlighter); //paste&highlight
	blttext->BlinkCursor(1);
	SetTextSize();
	ScrollToCursor();
	blttext->SetNeedRecalc();

	changed = 1; ChangedEvent();
	CursorMoved();

	return 1;
}
Exemplo n.º 13
0
int CGUIEditWindow::SelectWordRight()
{

	CTextCursor *cur;

	text->UnMark();
	text->SetMarkStart();

	cur = text->GetCursor();

	if(cur->GetChar()=='@')
		cur->MoveRight();
	
	UC c=cur->GetChar();
	if(c)
	{
		if(! ( isspace(c) || ispunct(c) ) )
		{
			//najsem na mezere - prejedu cely slovo
			do{
				cur->MoveRight();
				c=cur->GetChar();
				if(c==0) {
					cur->MoveEnd();
					return 1;
				}
			}while(! ( isspace(c) || ispunct(c) ) );
		}else{
			if(!isspace(c))
			{
				cur->MoveRight();
				c=cur->GetChar();
			}
		}
	}

	text->SetMarkEnd();

	blttext->BlinkCursor(1); //zobrazi kurzor (blika)
	ScrollToCursor(); // nascroluje, aby byl kurzor videt
	blttext->SetNeedRecalc();
	CursorMoved();
	return 1;
}
Exemplo n.º 14
0
//zmenil se focus
int CGUIEditWindow::FocusChanged(UINT focus, typeID dualID)
{
	if(focused!=focus) 
	{
		text->DoneUndo();

		focused = focus;

		if(selectonfocus && focused)
		{
			text->UnMark();
			text->GetCursor()->MoveTextEnd();
			text->SetMarkStart();
			text->GetCursor()->MoveTextHome();
			text->SetMarkEnd();
			ScrollToCursor();
		}
		
		blttext->BlinkCursor(focused);
		blttext->SetShowMark(focused);

		if(focused)
		{
			if(!cursorblinktimerID )
				cursorblinktimerID = timerGUI->AddRequest(this,.5);
		}else{
			timerGUI->DeleteRequest(cursorblinktimerID);cursorblinktimerID=0;
			timerGUI->DeleteRequest(mousescrolltimerID);mousescrolltimerID=0;
		}

		if(!focus && changed )
		{
			EventArise(EOk);
			changed = 0;
		}
	}

	return CGUIStdWindow::FocusChanged(focus,dualID);
}
Exemplo n.º 15
0
//prelozene znaky - psani
int CGUIEditWindow::KeyboardChar(UINT ch, UINT state)
{
	if(readonly) return 0;

	if(mainGUI->key_ctrl)
		return 0;

	if(ch==VK_TAB) return 0;
	
	if(isprint(ch)/*||ch==VK_TAB*/)
	{
		CTextCursor *cur=text->GetCursor();
		int insm=-1;
		if(text->IsMarked())
		{
			text->DeleteSelectedText(1,1); //smazu oznaceny text
			insm = cur->GetInsertMode();
			cur->SetInsertMode(0);
		}
		cur->InsertChar(ch); //vlozi znak

		if(insm!=-1)
			cur->SetInsertMode(insm);
		if(highlight)
		{//highligtuju
			highlighter->HighlightFromBlock(cur->GetBlock());
			cur->CalcFormat();		
		}
		blttext->BlinkCursor(1);
		SetTextSize();
		ScrollToCursor();
		blttext->SetNeedRecalc();

		changed = 1; ChangedEvent();
		CursorMoved();
	}
	return 0;
}
Exemplo n.º 16
0
void
ScrollToCurrent (int caretPos)
{
    ScrollToCursor(&historyOptions[0], caretPos);
}
Exemplo n.º 17
0
//intiace - vola se ze vsech konstruktoru
void CGUIEditWindow::InitEditWindow(float _x, float _y, float _sx, float _sy, CDXFont *dxfont, int textColor, int bgColor, int wordwrap,int noscrollbars, int _multiline, int xmargin, int ymargin, char *title_text, CGUIRectHost *_icon, UINT resizer_color)
{
	RemoveFromTrash(); //kvuli vyjimkam - viz. GUI

	highlight = 0; //bez highlitovani
	highlighter = 0;

	selectonfocus = 0;
	changed = 0;

	mousesel=0; //mysi se ted nic neoznacuje

	SetAvailableEvents(availableEvents,numEvents); //nastavi eventy

	multiline = _multiline; //viceradkovy editor?

	defaultfont=0; //defaultni font

	allowtab = 0; //zakazu psat tab

	readonly = 0; //neni readonly

	if(title_text)
	{	//pridam titulek, ikonu, resizery a scrolbary

		AddResizers(resizer_color,styleSet->Get("Resizers")); //pridam resizery
		AddTitle(title_text,_icon,STD_TITLE_HEIGHT); //pridam titulek

		//nastavi velikost viewportu
		CGUIStyle &style = *(styleSet->Get("Resizers"));
		SetViewPortBackWnd(style[1], style[0]+STD_TITLE_HEIGHT, _sx - 2*style[1], _sy - 2*style[0]-STD_TITLE_HEIGHT);

		//nastavi limity velikosti
		SetLimitSizes(4*STD_TITLE_HEIGHT,3*STD_SCROLLBAR_WIDTH+STD_TITLE_HEIGHT+2*style[0]);

		if(!noscrollbars)
		{
			//pridam vertikalni scrolbar
			CGUIScrollBar* dual = AddSimpleScrollbar(Vertical, sx-style[1]-STD_SCROLLBAR_WIDTH, style[0]+STD_TITLE_HEIGHT, STD_SCROLLBAR_WIDTH, sy - 2*style[0]-STD_TITLE_HEIGHT, STD_SCROLLBAR_SHIFT, 0, STD_SCROLLBAR_SLIDER_RESIZE,0,0,0);

			if(!wordwrap) //budu zalamovat radky?
			{
				//nebudu - pridam horizontalni scrolbar
				AddSimpleScrollbar(Horizontal, style[1], sy-style[0]-STD_SCROLLBAR_WIDTH, STD_SCROLLBAR_WIDTH, sx - 2*style[1], STD_SCROLLBAR_SHIFT, 0, STD_SCROLLBAR_SLIDER_RESIZE,dual,0,0);
			}
		}

	}else{
		//bez titulku, ramecku
		if(!noscrollbars)
		{
			//pridam vertikalni scrolbar
			CGUIScrollBar* dual = AddSimpleScrollbar(Vertical, sx-STD_SCROLLBAR_WIDTH, 0, STD_SCROLLBAR_WIDTH, sy, STD_SCROLLBAR_SHIFT, 0, STD_SCROLLBAR_SLIDER_RESIZE,0,0,0);

			if(!wordwrap) //budu zalamovat radky?
			{
				//nebudu - pridam horizontalni scrolbar
				AddSimpleScrollbar(Horizontal, 0, sy-STD_SCROLLBAR_WIDTH, STD_SCROLLBAR_WIDTH, sx, STD_SCROLLBAR_SHIFT, 0, STD_SCROLLBAR_SLIDER_RESIZE,dual,0,0);
			}
		}
	}

	//chci dostaveat zpravy od mysi a timeru
	MsgAcceptConsume(MsgMouseL|MsgMouseOver);
	MsgAcceptConsume(MsgTimer);

	text = NULL;
	blttext = NULL;

	focused=0; //nejsem focusovany

	if(!dxfont)
	{   //neni zadam defaultni font
		dxfont = (CDXFont*) RefMgr->Find(DEFAULT_EDITFONT); //najdu defaultfont
		if(!dxfont)
		{
			//chyba - font neexistuje
			throw CExc(eGUI,E_BAD_ARGUMENTS,"Font not exist!");
		}
	}

	dxfont->AddRef(); //zvysim pocet referenci
	defaultfont = dxfont;

	text = new CFormatedText(dxfont,textColor,wordwrap); //vytvori formatovany text

	CTextBlock *b;
	b = new CTextBlock("");
	text->AddTextBlockToEnd(b); //pridam jeden prazdny blok
	
	blttext = new CBltFormatedText(text,xmargin,ymargin); //vytvori zobrazovac formatovaneho textu

	back->AddChild(blttext); //pridam zobrazovac dovnitr okna

	text->CreateCursor(); //vytvori textovy kurzor
	blttext->SetCursor(1);

	if(_sy<0) //pokud _sy<0 -> spocitam vysku editboxu
	{
		_sy = (float)blttext->CmpEditBoxHeight();
		Resize(_sx,_sy);
	}

	float xx,yy;
	GetVPSize(xx,yy); //zjisti velikost viewportu
	blttext->SetWidth((int)xx); //nastavi sirku textu - pro zalamovani
	SetTextSize(); //opravi scrollbary

	ScrollToCursor();

	blttext->BlinkCursor(0); //zmizi kurzor

	cursorblinktimerID=0;
	mousescrolltimerID=0;
	mousescroll=0;

	AddToTrash(); //kvuli vyjimkam - viz. GUI

}
Exemplo n.º 18
0
void PageWin::OnKey(sU32 key)
{
  switch(key&(0x8001ffff|sKEYQ_REPEAT))
  {
  case sKEY_APPFOCUS:
    App->SetActiveWindow(this);
    break;
  case 'a':
    sGui->Post(CMD_POPADD,this);
    break;
  case '1':
    sGui->Post(CMD_POPMISC,this);
    break;
  case '2':
    sGui->Post(CMD_POPTEX,this);
    break;
  case '3':
    sGui->Post(CMD_POPMESH,this);
    break;
  case '4':
    sGui->Post(CMD_POPSCENE,this);
    break;
  case '5':
    sGui->Post(CMD_POPMAT,this);
    break;
	case '6':
		sGui->Post(CMD_POPFX,this);
		break;

  case ' ':
    StickyKey = DM_SELECT;
    DragKey = DM_SELECT;
    break;
  case 'r':
    StickyKey = DragKey;
    DragKey = DM_RECT;
    break;
  case 'p':
    StickyKey = DragKey;
    DragKey = DM_PICK;
    break;
  case 'd':
    StickyKey = DragKey;
    DragKey = DM_DUPLICATE;
    break;
  case 'w':
    StickyKey = DragKey;
    DragKey = DM_WIDTH;
    break;
  case 'm':
    StickyKey = DragKey;
    DragKey = DM_MOVE;
    break;
  case 'y':
    StickyKey = DragKey;
    DragKey = DM_SCROLL;
    break;

  case 'r'|sKEYQ_BREAK:
  case 'p'|sKEYQ_BREAK:
  case 'd'|sKEYQ_BREAK:
  case 'w'|sKEYQ_BREAK:
  case 'm'|sKEYQ_BREAK:
  case 'y'|sKEYQ_BREAK:
    DragKey = StickyKey;
    break;


  case 's':
    OnCommand(CMD_SHOW);
    break;
  case sKEY_DELETE:
    OnCommand(CMD_DELETE);
    break;
  case 'x':
    OnCommand(CMD_CUT);
    break;
  case 'c':
    OnCommand(CMD_COPY);
    break;
  case 'v':
    OnCommand(CMD_PASTE);
    break;
  }
  switch(key&(0x8001ffff))
  {
  case sKEY_UP:
    if(CursorY>0)
      CursorY--;
    ScrollToCursor();
    break;
  case sKEY_DOWN:
    if(CursorY+1<PAGESY)
      CursorY++;
    ScrollToCursor();
    break;
  case sKEY_LEFT:
    if(CursorX>0)
      CursorX--;
    ScrollToCursor();
    break;
  case sKEY_RIGHT:
    if(CursorX+CursorWidth<PAGESX)
      CursorX++;
    ScrollToCursor();
    break;
  }
  /*
  if((key&sKEYQ_STICKYBREAK) && StickyKey)
    DragKey = StickyKey;
  if(key&sKEYQ_BREAK && (key&0x1ffff)>='a' && (key&0x1ffff)<='z')
    StickyKey = 0;
    */
}
Exemplo n.º 19
0
//reakce na klavesnici
int CGUIEditWindow::Keyboard(UINT ch, UINT state)
{
	int dy;

	switch(ch)
	{
	case VK_ESCAPE:
		EventArise(ECancel);
		break;
	case VK_RIGHT: //sipka doprava
		text->DoneUndo(); //uzavru posledni krok undo
		if(mainGUI->key_shift){ //se siftem oznacuju
			if(!text->GetMarkStart()) text->SetMarkStart();		
		} else text->UnMark();
		
		if(mainGUI->key_ctrl) //s controlem lezu po slovech
			text->GetCursor()->MoveWordRight();
		else
			text->GetCursor()->MoveRight();

		if(mainGUI->key_shift)
			text->SetMarkEnd();

		blttext->BlinkCursor(1); //zobrazi kurzor (blika)
		ScrollToCursor(); // nascroluje, aby byl kurzor videt
		blttext->SetNeedRecalc();
		CursorMoved();
		break;
	case VK_LEFT: //sipka doleve
		text->DoneUndo(); //uzavru posledni krok undo
		if(mainGUI->key_shift){ //se shiftem oznacuju
			if(!text->GetMarkStart()) text->SetMarkStart();
		}else text->UnMark();

		if(mainGUI->key_ctrl) //s crtl lezu po slovech
			text->GetCursor()->MoveWordLeft();
		else
			text->GetCursor()->MoveLeft();

		if(mainGUI->key_shift)
			text->SetMarkEnd();

		blttext->BlinkCursor(1);
		ScrollToCursor(); //nascroluje, aby byl kurzor videt
		blttext->SetNeedRecalc();
		CursorMoved();
		break;
	case VK_UP: //sipka nahoru
		text->DoneUndo(); //uzavru posledni krok undo
		if(multiline) //viceradkovy editor?
		{
			if(mainGUI->key_shift){ //se shiftem oznacuju
				if(!text->GetMarkStart()) text->SetMarkStart();		
			} else text->UnMark();
			text->GetCursor()->MoveUp(); //lezu nahoru
			if(mainGUI->key_shift)
				text->SetMarkEnd();
			blttext->BlinkCursor(1);
			ScrollToCursor(); //nascroluje, aby byl kurzor videt
			blttext->SetNeedRecalc();
		}else{
			if(changed) {EventArise(EOk); changed=0;}
			EventArise(EChangeTABElement,-1); //presune focus na predchozi element
		}
		CursorMoved();
		break;
	case VK_DOWN: //sipka dolu
		text->DoneUndo(); //uzavru posledni krok undo
		if(multiline)
		{
			if(mainGUI->key_shift){
				if(!text->GetMarkStart()) text->SetMarkStart();		
			} else text->UnMark();
			text->GetCursor()->MoveDown(); //lezu dolu
			if(mainGUI->key_shift) text->SetMarkEnd();
			blttext->BlinkCursor(1);
			ScrollToCursor(); //nascroluje, aby byl kurzor videt
			blttext->SetNeedRecalc();
		}else{
			if(changed) {EventArise(EOk); changed=0;}
			EventArise(EChangeTABElement,1); //presune focus na dalsi element
		}
		CursorMoved();
		break;
	case VK_PRIOR:  //PageUp
		text->DoneUndo();
		if(mainGUI->key_shift){
			if(!text->GetMarkStart()) text->SetMarkStart();		
		} else text->UnMark();
		dy = text->GetCursor()->MovePageUp((int)vp_sy);
		if(mainGUI->key_shift) text->SetMarkEnd();
		blttext->BlinkCursor(1);
		SetWindowPositionVP(0,(float)-dy);
		ScrollToCursor();
		blttext->SetNeedRecalc();
		CursorMoved();
		break;
	case VK_NEXT: //PageDown
		text->DoneUndo();
		if(mainGUI->key_shift){
			if(!text->GetMarkStart()) text->SetMarkStart();		
		} else text->UnMark();
		dy = text->GetCursor()->MovePageDown((int)vp_sy);
		if(mainGUI->key_shift) text->SetMarkEnd();
		blttext->BlinkCursor(1);
		SetWindowPositionVP(0,(float)dy);
		ScrollToCursor();
		blttext->SetNeedRecalc();
		CursorMoved();
		break;
	case VK_HOME: //home
		text->DoneUndo();
		if(mainGUI->key_shift){
			if(!text->GetMarkStart()) text->SetMarkStart();		
		} else text->UnMark();

		if(mainGUI->key_ctrl)
			text->GetCursor()->MoveTextHome(); //ctrl+home -> presune cursor na zacatek textu
		else
			text->GetCursor()->MoveHome();
		if(mainGUI->key_shift) text->SetMarkEnd();
		blttext->BlinkCursor(1);
		ScrollToCursor();
		blttext->SetNeedRecalc();
		CursorMoved();
		break;
	case VK_END: //end
		text->DoneUndo();
		if(mainGUI->key_shift){
			if(!text->GetMarkStart()) text->SetMarkStart();		
		} else text->UnMark();

		if(mainGUI->key_ctrl) //ctrl+end -> presuna cursor na konec textu
			text->GetCursor()->MoveTextEnd();
		else
		text->GetCursor()->MoveEnd();
		if(mainGUI->key_shift) text->SetMarkEnd();
		blttext->BlinkCursor(1);
		ScrollToCursor();
		blttext->SetNeedRecalc();
		CursorMoved();
		break;
	case VK_DELETE:
		if(!readonly){
			if(mainGUI->key_shift) Cut();
			else
			{
				//delete
				if(text->IsMarked())
					text->DeleteSelectedText(); //smazu oznaceny text
				else
					text->GetCursor()->Delete(); //mazu znak
				if(highlight)
				{//highlituju
					highlighter->HighlightFromBlock(text->GetCursor()->GetBlock());
					text->GetCursor()->CalcFormat();		
				}
				blttext->BlinkCursor(1);
				SetTextSize();
				ScrollToCursor();
				blttext->SetNeedRecalc();

				changed = 1; ChangedEvent();		
				CursorMoved();
			}
		}
		break;
	case VK_BACK:
		if(!readonly){	//backspace
			if(text->IsMarked())
				text->DeleteSelectedText(); //smazu oznaceny text
			else
				text->GetCursor()->Backspace(); //smazu znak
			if(highlight)
			{//highlightuju
				highlighter->HighlightFromBlock(text->GetCursor()->GetBlock());
				text->GetCursor()->CalcFormat();		
			}
			blttext->BlinkCursor(1);
			SetTextSize();
			ScrollToCursor();
			blttext->SetNeedRecalc();

			changed = 1; ChangedEvent();
			CursorMoved();
		}
		break;
	case VK_RETURN:
		if(multiline&&!readonly){ //return
			CTextBlock *b=text->GetCursor()->GetBlock();
			if(text->IsMarked())
				text->DeleteSelectedText(1,1); //smazu oznaceny text

			text->GetCursor()->Return(); //vlozim enter

			text->DoIdent(); //vlozim taby na zacatek radky

			if(highlight) 
			{//highlightuju
				highlighter->HighlightFromBlock(b);
				text->GetCursor()->CalcFormat();		
			}

			blttext->BlinkCursor(1);
			SetTextSize();
			ScrollToCursor();
			blttext->SetNeedRecalc();

			changed = 1; ChangedEvent();
			CursorMoved();
		}else
		{ //u jednoradkovyho boxu - presune focus na dalsi element
			text->DoneUndo();
			changed = 0;
			EventArise(EOk);
			EventArise(EChangeTABElement,1); //posunu focus na dalsi element
		}
		break;
	case VK_INSERT:
		if(mainGUI->key_shift)//paste
		{
			Paste();
		}else
		if(mainGUI->key_ctrl)//copy
		{
			Copy();
		}else{//change insert mode	
			text->GetCursor()->ChangeInsertMode();
			blttext->BlinkCursor(1);
			blttext->SetNeedRecalc();
			CursorMoved();
		}
		break;
	case 'A':
		if(mainGUI->key_ctrl) //select all
		{
			text->UnMark();
			text->GetCursor()->MoveTextHome();
			text->SetMarkStart();
			text->GetCursor()->MoveTextEnd();
			text->SetMarkEnd();
			blttext->BlinkCursor(1);
			ScrollToCursor();
			blttext->SetNeedRecalc();
			CursorMoved();
		}
		break;		
	case 'C': //ctrl+C -> copy to clipboard
		if(mainGUI->key_ctrl)
		{
			Copy();
		}
		break;
	case 'V': //ctrl+V ->paste from clipboard
		if(mainGUI->key_ctrl)
		{
			Paste();
		}
		break;
	case 'X': //ctrl+X -> cut
		if(mainGUI->key_ctrl){
			Cut();
		}
		break;
	case 'Z':
		if(mainGUI->key_ctrl) //undo
		{
			Undo();
		}
		break;
	case 'Y': 
		if(mainGUI->key_ctrl) //redo
		{
			Redo();
		}
		break;
	case VK_TAB:
		if(allowtab && !mainGUI->key_ctrl && !readonly){
			CTextCursor *cur=text->GetCursor();
			if(text->IsMarked())
			{
				int insm=-1;

				insm = cur->GetInsertMode();
				cur->SetInsertMode(0);

				CTextBlock *b=text->FindFirstMark()->GetBlock();

				text->IdentBlock(mainGUI->key_shift);

				if(highlight)
				{//highligtuju
					highlighter->HighlightFromBlock(b);
					cur->CalcFormat();		
				}
				cur->SetInsertMode(insm);

				blttext->BlinkCursor(1);
				SetTextSize();
				ScrollToCursor();
				blttext->SetNeedRecalc();

				changed = 1; ChangedEvent();
			}else
			if(!mainGUI->key_shift){
				cur->InsertChar('\t'); //vlozi tab
				if(highlight)
				{//highligtuju
					highlighter->HighlightFromBlock(cur->GetBlock());
					cur->CalcFormat();		
				}
				blttext->BlinkCursor(1);
				SetTextSize();
				ScrollToCursor();
				blttext->SetNeedRecalc();

				changed = 1; ChangedEvent();
			}
			CursorMoved();
		}
		break;

/*	case 'H':
		if(mainGUI->key_ctrl) //vyhighligtuje cely text - pro testovaci ucely
		{
			if(highlight&&highlighter)
			{
				highlighter->Highlight();
				text->GetCursor()->CalcFormat();
				blttext->BlinkCursor(1);
				SetTextSize();
				blttext->SetNeedRecalc();
			}
		}*/
	}

	return 0;
}
Exemplo n.º 20
0
void
wxLayoutWindow::OnChar(wxKeyEvent& event)
{
    int keyCode = event.GetKeyCode();
    bool ctrlDown = event.ControlDown();

#ifdef WXLAYOUT_DEBUG
    if(keyCode == WXK_F1)
    {
        m_llist->Debug();
        return;
    }
#endif

    // Force m_Selecting to be false if shift is no longer
    // pressed. OnKeyUp() cannot catch all Shift-Up events.
    if(m_Selecting && !event.ShiftDown())
    {
        m_Selecting = false;
        m_llist->EndSelection();
        m_llist->DiscardSelection(); //FIXME: correct?
    }

    // If we deleted the selection here, we must not execute the
    // deletion in Delete/Backspace handling.
    bool deletedSelection = false;
    // pressing any non-arrow key optionally replaces the selection:
    if(m_AutoDeleteSelection
        && IsEditable()
        && !m_Selecting
        && m_llist->HasSelection()
        && ! IsDirectionKey(keyCode)
        && ! (event.AltDown() || ctrlDown) )
    {
        m_llist->DeleteSelection();
        deletedSelection = true;
        SetDirty();
    }

    // <Shift>+<arrow> starts selection
    if ( IsDirectionKey(keyCode) )
    {
        // just continue the old selection
        if ( m_Selecting && event.ShiftDown() )
        {
            m_llist->ContinueSelection();
        }
        else
        {
            m_llist->DiscardSelection();
            m_Selecting = false;
            if( event.ShiftDown() )
            {
                m_Selecting = true;
                m_llist->StartSelection();
            }
        }
    }

    // If needed, make cursor visible:
    if(m_CursorVisibility == -1)
        m_CursorVisibility = 1;

    /* These two nested switches work like this:
       The first one processes all non-editing keycodes, to move the
       cursor, etc. It's default will process all keycodes causing
       modifications to the buffer, but only if editing is allowed.
    */
    switch(keyCode)
    {

    case WXK_RIGHT:
        if ( ctrlDown )
            m_llist->MoveCursorWord(1);
        else
            m_llist->MoveCursorHorizontally(1);
        break;

    case WXK_LEFT:
        if ( ctrlDown )
            m_llist->MoveCursorWord(-1);
        else
            m_llist->MoveCursorHorizontally(-1);

        break;

    case WXK_UP:
        m_llist->MoveCursorVertically(-1);
        break;

    case WXK_DOWN:
        m_llist->MoveCursorVertically(1);
        break;

    case WXK_PRIOR:
        m_llist->MoveCursorVertically(-Y_SCROLL_PAGE);
        break;

    case WXK_NEXT:
        m_llist->MoveCursorVertically(Y_SCROLL_PAGE);
        break;

    case WXK_HOME:
        if ( ctrlDown )
            m_llist->MoveCursorTo(wxPoint(0, 0));
        else
            m_llist->MoveCursorToBeginOfLine();
        break;

    case WXK_END:
        if ( ctrlDown )
            m_llist->MoveCursorToEnd();
        else
            m_llist->MoveCursorToEndOfLine();
        break;

    default:

        if(ctrlDown && ! IsEditable())
        {
            switch(keyCode)
            {

            case 'c':
                // this should work even in read-only mode
                Copy(true, true);
                break;

            case 's': // search
                Find(wxEmptyString);
                break;

            case 't': // search again
                FindAgain();
                break;

            default:
                // we don't handle it, maybe an accelerator?
                event.Skip();
            ;
            }
        }
        else if( IsEditable() )
        {
            /* First, handle control keys */
            if(ctrlDown && ! event.AltDown())
            {
                if(keyCode >= 'A' && keyCode <= 'Z')
                    keyCode = tolower(keyCode);

                switch(keyCode)
                {

                case WXK_INSERT:
                    Copy();
                    break;

                case WXK_DELETE :
                    if(! deletedSelection)
                    {
                        m_llist->DeleteWord();
                        SetDirty();
                    }
                    break;

                case 'd':
                    if(! deletedSelection) // already done
                    {
                        m_llist->Delete(1);
                        SetDirty();
                    }
                    break;

                case 'y':
                    m_llist->DeleteLines(1);
                    SetDirty();
                    break;

                case 'h': // like backspace
                    if(m_llist->MoveCursorHorizontally(-1))
                    {
                        m_llist->Delete(1);
                        SetDirty();
                    }
                    break;

                case 's': // search
                    Find(wxEmptyString);
                    break;

                case 't': // search again
                    FindAgain();
                    break;

                case 'u':
                    m_llist->DeleteToBeginOfLine();
                    SetDirty();
                    break;

                case 'k':
                    m_llist->DeleteToEndOfLine();
                    SetDirty();
                    break;

                case 'c':
                    Copy(true, true);
                    break;

                case 'v':
                    Paste(true);
                    break;

                case 'x':
                    Cut();
                    break;

                case 'w':
                    if(m_WrapMargin > 0)
                        m_llist->WrapLine(m_WrapMargin);
                    break;

                case 'q':
                    if(m_WrapMargin > 0)
                        m_llist->WrapAll(m_WrapMargin);
                    break;

#ifdef WXLAYOUT_DEBUG
                case WXK_F1:
                    m_llist->SetFont(-1,-1,-1,-1,true);  // underlined
                    break;

                case 'l':
                    Refresh(true);
                    break;
#endif

                default:
                    // we don't handle it, maybe an accelerator?
                    event.Skip();
                }
            }
            // ALT only:
            else if( event.AltDown() && ! event.ControlDown() )
            {
                switch(keyCode)
                {
                case WXK_DELETE:
                case 'd':
                    m_llist->DeleteWord();
                    SetDirty();
                    break;

                default:
                    // we don't handle it, maybe an accelerator?
                    event.Skip();
                }
            }
            // no control keys:
            else if ( ! event.AltDown() && ! event.ControlDown())
            {
                switch(keyCode)
                {
                case WXK_INSERT:
                    if(event.ShiftDown())
                        Paste();
                    break;

                case WXK_DELETE :
                    if(event.ShiftDown())
                    {
                        Cut();
                    }
                    else if(! deletedSelection)
                    {
                        m_llist->Delete(1);
                        SetDirty();
                    }
                    break;

                case WXK_BACK: // backspace
                    if(! deletedSelection)
                    {
                        if(m_llist->MoveCursorHorizontally(-1))
                        {
                            m_llist->Delete(1);
                            SetDirty();
                        }
                    }
                    break;

                case WXK_RETURN:
                    if (m_DoWordWrap &&
                        m_WrapMargin > 0
                        && m_llist->GetCursorPos().x > m_WrapMargin )
                    {
                        m_llist->WrapLine(m_WrapMargin);
                    }

                    m_llist->LineBreak();
                    SetDirty();
                    break;

                case WXK_TAB:
                    if ( !event.ShiftDown() )
                    {
                        // TODO should be configurable
                        static const int tabSize = 8;

                        CoordType x = m_llist->GetCursorPos().x;
                        size_t numSpaces = tabSize - x % tabSize;
                        m_llist->Insert(wxString(' ', numSpaces));
                        SetDirty();
                    }
                    break;

                default:
                    if ( ( !(event.ControlDown() || event.AltDown()) )
                        && (keyCode < 256 && keyCode >= 32) )
                    {
                        if ( m_DoWordWrap
                            && m_WrapMargin > 0
                            && m_llist->GetCursorPos().x > m_WrapMargin
                            && isspace(keyCode) )
                        {
                            m_llist->WrapLine(m_WrapMargin);
                        }

                        m_llist->Insert((wxChar)keyCode);
                        SetDirty();
                    }
                    else
                    {
                        // we don't handle it, maybe an accelerator?
                        event.Skip();
                    }
                    break;
                }

            }
        }// if(IsEditable())
        else
        {
            // we don't handle it, maybe an accelerator?
            event.Skip();
        }
    }// first switch()

    if ( m_Selecting )
    {
        // continue selection to the current (new) cursor position
        m_llist->ContinueSelection();
    }

    ScrollToCursor();
    // refresh the screen
    RequestUpdate(m_llist->GetUpdateRect());
}
Exemplo n.º 21
0
void sTextControl::OnKey(sU32 key)
{
  sInt len;
  sU32 ckey;
  sInt i,j;
  sChar buffer[2];

// prepare...

  if(key&sKEYQ_SHIFT) key|=sKEYQ_SHIFT;
  if(key&sKEYQ_CTRL ) key|=sKEYQ_CTRL ;

  len = sGetStringLen(Text);
  if(Cursor>len)
    Cursor = len;

// normal keys

  switch(key&(0x8001ffff|sKEYQ_SHIFT|sKEYQ_CTRL))
  {
  case sKEY_BACKSPACE:
    if(SelMode)
    {
      DelSel();
    }
    else
    {
      if(Cursor==0)
        break;
      Cursor--;
      Engine(Cursor,1,0);
      Post(DoneCmd);
      SelMode = 0;
      OnCalcSize();
      ScrollToCursor();
    }
    break;
  case sKEY_DELETE:
    if(SelMode)
    {
      DelSel();
    }
    else
    {
      Engine(Cursor,1,0);
      OnCalcSize();
      Post(DoneCmd);
    }
    ScrollToCursor();
    break;
  case sKEY_ENTER:
    if(SelMode)
      DelSel();
    i = Cursor-GetCursorX();
    for(j=0;i<Cursor && Text[i]==' ';i++)
      j++;
    if(Cursor>i && Text[Cursor-1]=='{')
      j+=2;
    Engine(Cursor,1,"\n");
    Cursor++;
    for(i=0;i<j;i++)
    {
      Engine(Cursor,1," ");
      Cursor++;
    }
    OnCalcSize();
    ScrollToCursor();
    break;
  case sKEY_PAGEUP:
    len = RealY/sPainter->GetHeight(sGui->FixedFont)-8;
    if(len<1) len = 1;
    for(i=0;i<len;i++)
      OnKey(sKEY_UP);
    break;
  case sKEY_PAGEDOWN:
    len = RealY/sPainter->GetHeight(sGui->FixedFont)-8;
    if(len<1) len = 1;
    for(i=0;i<len;i++)
      OnKey(sKEY_DOWN);
    break;
  case sKEY_INSERT:
    Overwrite = !Overwrite;
    ScrollToCursor();
    break;
  case 'x'|sKEYQ_CTRL:
    OnCommand(sTCC_CUT);
    OnCalcSize();
    ScrollToCursor();
    break;
  case 'c'|sKEYQ_CTRL:
    OnCommand(sTCC_COPY);
    ScrollToCursor();
    break;
  case 'v'|sKEYQ_CTRL:
    OnCommand(sTCC_PASTE);
    OnCalcSize();
    ScrollToCursor();
    break;
  case 'b'|sKEYQ_CTRL:
    OnCommand(sTCC_BLOCK);
    ScrollToCursor();
    break;
  }

//  sDPrintF("key %08x\n",key);
  ckey = key&~(sKEYQ_SHIFT|sKEYQ_ALTGR|sKEYQ_REPEAT);
  if((ckey>=0x20 && ckey<=0x7e) || (ckey>=0xa0 && ckey<=0xff))
  {
    DelSel();
    buffer[0] = ckey;
    buffer[1] = 0;
    if(Overwrite && Cursor<len)
    {
      Engine(Cursor,1,0);
      Engine(Cursor,1,buffer);
      Cursor++;
      Post(DoneCmd);
    }
    else
    {
      Engine(Cursor,1,buffer);
      Cursor++;
      Post(DoneCmd);
    } 
    OnCalcSize();
    ScrollToCursor();
  }
  else
  {
    Parent->OnKey(key);
  }

// cursor movement and shift-block-marking

  switch(key&0x8001ffff)
  {
  case sKEY_LEFT:
  case sKEY_RIGHT:
  case sKEY_UP:
  case sKEY_DOWN:
  case sKEY_HOME:
  case sKEY_END:
    if(SelMode==0 && (key&sKEYQ_SHIFT))
    {
      SelMode = 1;
      SelPos = Cursor;
    }
    if(SelMode==1 && !(key&sKEYQ_SHIFT))
    {
      SelMode = 0;
    }
    break;
  }

  switch(key&0x8001ffff)
  {
  case sKEY_LEFT:
    if(Cursor>0)
      Cursor--;
    ScrollToCursor();
    break;
  case sKEY_RIGHT:
    if(Cursor<len)
      Cursor++;
    ScrollToCursor();
    break;
  case sKEY_UP:
    j = i = CursorWish;
    if(Text[Cursor]=='\n' && Cursor>0)
      Cursor--;
    while(Text[Cursor]!='\n' && Cursor>0)
      Cursor--;
    while(Text[Cursor-1]!='\n' && Cursor>0)
      Cursor--;
    while(i>0 && Text[Cursor]!='\n' && Text[Cursor]!=0)
    {
      Cursor++;
      i--;
    }
    ScrollToCursor();
    CursorWish = j;
    break;
  case sKEY_DOWN:
    j = i = CursorWish;
    while(Text[Cursor]!='\n' && Text[Cursor]!=0)
      Cursor++;
    if(Text[Cursor]=='\n')
    {
      Cursor++;
      while(i>0 && Text[Cursor]!='\n' && Text[Cursor]!=0)
      {
        Cursor++;
        i--;
      }
    }
    ScrollToCursor();
    CursorWish = j;
    break;
  case sKEY_HOME:
    while(Cursor>0 && Text[Cursor-1]!='\n')
      Cursor--;
    ScrollToCursor();
    break;
  case sKEY_END:
    while(Text[Cursor]!='\n' && Text[Cursor]!=0)
      Cursor++;
    ScrollToCursor();
    break;
  }

}