25
#include "TextViewInternal.h"
28
#include "HScrollBar.h"
29
#include "VScrollBar.h"
34
#include "TimerProc.h"
39
// Constructor for TextView class
41
TextView::TextView(HWND hwnd)
42
: m_BlinkTimerFunctor(0)
43
, m_BlinkTimerHandler(0)
46
m_TextFontRenderer = new FontRenderer(*GetThreadGraphicsContext());
49
m_TextVertexBuffer0.resize(m_VBSize0);
50
m_TextVertexBuffer1.resize(m_VBSize1);
51
m_ColorQuadBuffer0.resize(m_VBSize0);
52
m_ColorQuadBuffer1.resize(m_VBSize1);
56
m_NumVBColorQuad0 = 0;
57
m_NumVBColorQuad1 = 0;
59
b_RenderToVertexBuffer = false;
61
m_ShaderProg = GetThreadGLDeviceFactory()->CreateShaderProgram();
62
m_ShaderProg->LoadIShaderFile(INL_FINDRESOURCELOCATION(TEXT("Data/Shaders/TextViewShader.glsl")));
65
m_CgColor = m_ShaderProg->GetAttributeLocation(TEXT("iColor"));
66
m_CgPosition = m_ShaderProg->GetAttributeLocation(TEXT("iPosition"));
67
m_CgTexUV = m_ShaderProg->GetAttributeLocation(TEXT("iTexUV"));
69
m_CgFontTexture = m_ShaderProg->GetUniformLocationARB(TEXT("FontTexture"));
70
m_ViewProjectionMatrix0 = m_ShaderProg->GetUniformLocationARB(TEXT("ViewProjectionMatrix"));
72
m_ColorQuadShaderProg = GetThreadGLDeviceFactory()->CreateShaderProgram();
73
m_ColorQuadShaderProg->LoadIShaderFile(INL_FINDRESOURCELOCATION(TEXT("Shaders//TextViewColorQuadShader.glsl")));
74
m_ColorQuadShaderProg->Link();
76
m_CgQuadPosition = m_ColorQuadShaderProg->GetAttributeLocation(TEXT("iPosition"));
77
m_CgQuadColor = m_ColorQuadShaderProg->GetAttributeLocation(TEXT("iColor"));
78
m_ViewProjectionMatrix1 = m_ColorQuadShaderProg->GetUniformLocationARB(TEXT("ViewProjectionMatrix"));
93
// Scrollbar related data
99
// Display-related data
100
m_nTabWidthChars = 4;
103
m_nLongLineLimit = 80;
104
m_nLineInfoCount = 0;
105
m_nCRLFMode = TXL_ALL;
107
m_nCaretWidth = 1; // texttodo: SystemParametersInfo(SPI_GETCARETWIDTH, 0, &m_nCaretWidth, 0);
109
if(m_nCaretWidth == 0)
112
// Default display colours
113
m_rgbColourList[TXC_FOREGROUND] = 0xFFFFFFFF; // SYSCOL(COLOR_WINDOWTEXT);
114
m_rgbColourList[TXC_BACKGROUND] = 0xFF4D4D4D; // SYSCOL(COLOR_WINDOW);
115
m_rgbColourList[TXC_HIGHLIGHTTEXT] = 0xFF000000; // SYSCOL(COLOR_HIGHLIGHTTEXT);
116
m_rgbColourList[TXC_HIGHLIGHT] = 0xFFbebebe; // SYSCOL(COLOR_HIGHLIGHT);
117
m_rgbColourList[TXC_HIGHLIGHTTEXT2] = 0xFFf4f4f4; // SYSCOL(COLOR_INACTIVECAPTIONTEXT);
118
m_rgbColourList[TXC_HIGHLIGHT2] = 0xFF747474; // SYSCOL(COLOR_INACTIVECAPTION);
119
m_rgbColourList[TXC_SELMARGIN1] = 0xFFe2e2e2; // SYSCOL(COLOR_3DFACE);
120
m_rgbColourList[TXC_SELMARGIN2] = 0xFFffffff; // SYSCOL(COLOR_3DHIGHLIGHT);
121
m_rgbColourList[TXC_LINENUMBERTEXT] = 0xFFb4b4b4; // SYSCOL(COLOR_3DSHADOW);
122
m_rgbColourList[TXC_LINENUMBER] = 0xFFe2e2e2; // SYSCOL(COLOR_3DFACE);
123
m_rgbColourList[TXC_LONGLINETEXT] = 0xFFb4b4b4; // SYSCOL(COLOR_3DSHADOW);
124
m_rgbColourList[TXC_LONGLINE] = 0xFFe2e2e2; // SYSCOL(COLOR_3DFACE);
125
m_rgbColourList[TXC_CURRENTLINETEXT] = 0xFF000000; // SYSCOL(COLOR_WINDOWTEXT);
126
m_rgbColourList[TXC_CURRENTLINE] = 0xFFfff0e6; // RGB(230,240,255);
129
m_nSelectionMode = SEL_NONE;
131
m_fHideCaret = false;
132
m_fTransparent = true;
135
m_nSelectionStart = 0;
141
m_CharacterAtCursor = 0;
142
m_CursorCharacterPosition = 0;
148
m_RedrawCaret = true;
150
m_pTextDoc = new TextDocument();
152
m_hMarginCursor = CreateCursor(GetModuleHandle(0), 21, 5, 32, 32, XORMask, ANDMask);
155
// The TextView state must be fully initialized before we
156
// start calling member-functions
159
hscrollbar->OnScrollLeft.connect( sigc::mem_fun(this, &TextView::ScrollLeft));
160
hscrollbar->OnScrollRight.connect( sigc::mem_fun(this, &TextView::ScrollRight));
161
vscrollbar->OnScrollUp.connect( sigc::mem_fun(this, &TextView::ScrollUp));
162
vscrollbar->OnScrollDown.connect( sigc::mem_fun(this, &TextView::ScrollDown));
164
OnMouseDown.connect(sigc::mem_fun(this, &TextView::OnLButtonDown));
165
OnMouseUp.connect(sigc::mem_fun(this, &TextView::OnLButtonUp));
166
OnMouseMove.connect(sigc::mem_fun(this, &TextView::RecvMouseMove));
167
OnMouseDrag.connect(sigc::mem_fun(this, &TextView::RecvMouseMove));
168
OnMouseEnter.connect(sigc::mem_fun(this, &TextView::RecvMouseEnter));
169
OnMouseLeave.connect(sigc::mem_fun(this, &TextView::RecvMouseLeave));
171
OnMouseWheel.connect(sigc::mem_fun(this, &TextView::RecvMouseWheel));
172
OnKeyEvent.connect(sigc::mem_fun(this, &TextView::RecvKeyEvent));
174
OnStartFocus.connect(sigc::mem_fun(this, &TextView::RecvStartFocus));
175
OnEndFocus.connect(sigc::mem_fun(this, &TextView::RecvEndFocus));
177
MouseAutoScrollTimer = new TimerFunctor;
178
MouseAutoScrollTimer->OnTimerExpired.connect(sigc::mem_fun(this, &TextView::RecvTimer));
179
MouseAutoScrollHandle = 0;
181
SetTextColor(Color(m_rgbColourList[TXC_FOREGROUND]));
182
SetTextBkColor(Color(m_rgbColourList[TXC_BACKGROUND]));
186
OpenFile(TEXT("C:\\Development\\Inalogic\\DIGITAL.txt"));
187
SetStyle(0, TXS_SELMARGIN);
188
SetStyle(0, TXS_LINENUMBERS);
190
m_BlinkTimerFunctor = new TimerFunctor();
191
m_BlinkTimerFunctor->OnTimerExpired.connect(sigc::mem_fun(this, &TextView::BlinkCursorTimerInterrupt));
195
// Destructor for TextView class
197
TextView::~TextView()
202
DestroyCursor(m_hMarginCursor);
206
void TextView::SetTextBkColor(const Color& color)
208
m_TextBkColor = color;
211
const Color& TextView::GetTextBkColor()
213
return m_TextBkColor;
217
VOID TextView::UpdateMetrics()
219
OnSize(0, m_ViewWidth, m_ViewHeight);
225
LONG TextView::OnSetFocus(HWND hwndOld)
230
LONG TextView::OnKillFocus(HWND hwndNew)
235
t_u32 TextView::SetStyle(t_u32 uMask, t_u32 uStyles)
237
t_u32 oldstyle = m_uStyleFlags;
239
m_uStyleFlags = (m_uStyleFlags & ~uMask) | uStyles;
241
// update display here
248
t_u32 TextView::SetVar(t_u32 nVar, t_u32 nValue)
253
t_u32 TextView::GetVar(t_u32 nVar)
258
t_u32 TextView::GetStyleMask(t_u32 uMask)
260
return m_uStyleFlags & uMask;
263
bool TextView::CheckStyle(t_u32 uMask)
265
return (m_uStyleFlags & uMask) ? true : false;
268
int TextView::SetCaretWidth(int nWidth)
270
int oldwidth = m_nCaretWidth;
271
m_nCaretWidth = nWidth;
276
BOOL TextView::SetImageList(HIMAGELIST hImgList)
278
m_hImageList = hImgList;
282
LONG TextView::SetLongLine(int nLength)
284
int oldlen = m_nLongLineLimit;
285
m_nLongLineLimit = nLength;
289
int CompareLineInfo(LINEINFO *elem1, LINEINFO *elem2)
291
if(elem1->nLineNo < elem2->nLineNo)
293
if(elem1->nLineNo > elem2->nLineNo)
299
int TextView::SetLineImage(t_u32 nLineNo, t_u32 nImageIdx)
301
LINEINFO *linfo = GetLineInfo(nLineNo);
303
// if already a line with an image
306
linfo->nImageIdx = nImageIdx;
310
linfo = &m_LineInfo[m_nLineInfoCount++];
311
linfo->nLineNo = nLineNo;
312
linfo->nImageIdx = nImageIdx;
319
(COMPAREPROC)CompareLineInfo
326
LINEINFO* TextView::GetLineInfo(t_u32 nLineNo)
328
LINEINFO key = { nLineNo, 0 };
330
// perform the binary search
331
return (LINEINFO *) bsearch(
336
(COMPAREPROC)CompareLineInfo
342
// Public memberfunction
344
LONG WINAPI TextView::WndProc(UINT msg, WPARAM wParam, LPARAM lParam)
349
return OnSize(wParam, LOWORD(lParam), HIWORD(lParam));
352
return OnVScroll(LOWORD(wParam), HIWORD(wParam));
355
return OnHScroll(LOWORD(wParam), HIWORD(wParam));
357
case WM_MOUSEACTIVATE:
358
return OnMouseActivate((HWND)wParam, LOWORD(lParam), HIWORD(lParam));
361
return OnMouseWheelFunc((short)HIWORD(wParam));
364
return OnSetFocus((HWND)wParam);
367
return OnKillFocus((HWND)wParam);
370
if(LOWORD(lParam) == HTCLIENT)
376
return OpenFile((TCHAR *)lParam);
384
return DefWindowProc(m_hWnd, msg, wParam, lParam);
387
long TextView::ProcessEvent(IEvent &ievent, long TraverseInfo, long ProcessEventInfo)
389
long ret = TraverseInfo;
391
ret = vscrollbar->ProcessEvent(ievent, ret, ProcessEventInfo);
392
ret = hscrollbar->ProcessEvent(ievent, ret, ProcessEventInfo);
394
ret = GetCompositionLayout()->ProcessEvent(ievent, ret, ProcessEventInfo);
396
// PostProcessEvent2 must always have its last parameter set to 0
397
// because the m_BackgroundArea is the real physical limit of the window.
398
// So the previous test about IsPointInside do not prevail over m_BackgroundArea
399
// testing the event by itself.
400
ret = PostProcessEvent2(ievent, ret, 0);
402
if(ievent.e_event == INL_WINDOW_ENTER_FOCUS)
405
StopBlinkCursor(false);
406
StartBlinkCursor(false);
408
if(ievent.e_event == INL_WINDOW_EXIT_FOCUS)
411
StopBlinkCursor(false);
417
void TextView::Draw(GraphicsContext& GfxContext, bool force_draw)
419
GfxContext.PushClippingRectangle(GetGeometry());
421
b_RenderToVertexBuffer = true;
424
m_NumVBColorQuad0 = 0;
425
m_NumVBColorQuad1 = 0;
429
if(b_RenderToVertexBuffer)
431
GetThreadGraphicsContext()->GetRenderStates().SetBlend(TRUE, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
432
GetThreadGraphicsContext()->GetRenderStates().SetColorMask(TRUE, TRUE, TRUE, FALSE); // Do not write the alpha of characters
434
GfxContext.EnableTextureMode(GL_TEXTURE0, GL_TEXTURE_RECTANGLE_ARB);
435
TRefGL< NGLRectangleTexture > glTexture = GfxContext.ResourceCache.GetCachedResource(m_TextFont->TextureArray[0]);
436
GetThreadGraphicsContext()->SetTexture(GL_TEXTURE0, glTexture->m_Texture);
438
/////////////////////////////////////////////////////////////////////////////////////////////////////
439
m_ColorQuadShaderProg->Begin();
441
Matrix4 Quadmat = GetThreadGraphicsContext()->GetModelViewProjectionMatrix();
442
if(m_ViewProjectionMatrix1 != -1)
443
m_ColorQuadShaderProg->SetUniformLocMatrix4fv(m_ViewProjectionMatrix1, 1, false, (float*)&Quadmat);
445
// Draw Line Number quad background
447
Geometry rect = GetTextAreaGeometry();
448
rect.SetWidth(LeftMarginWidth());
449
GfxContext.PushClippingRectangle(rect);
450
if(m_CgQuadPosition != -1)
452
CHECKGL( glEnableVertexAttribArrayARB(m_CgQuadPosition) );
453
CHECKGL( glVertexAttribPointerARB(m_CgQuadPosition, 4, GL_FLOAT, GL_FALSE, 32, &m_ColorQuadBuffer1[0]) );
455
if(m_CgQuadColor != -1)
457
CHECKGL( glEnableVertexAttribArrayARB(m_CgQuadColor) );
458
CHECKGL( glVertexAttribPointerARB(m_CgQuadColor, 4, GL_FLOAT, GL_FALSE, 32, &m_ColorQuadBuffer1[0]+4) );
461
CHECKGL( glDrawArrays( GL_QUADS, 0, m_NumVBColorQuad1*4 ) );
463
if(m_CgQuadPosition != -1)
464
CHECKGL( glDisableVertexAttribArrayARB(m_CgQuadPosition) );
465
if(m_CgQuadColor != -1)
466
CHECKGL( glDisableVertexAttribArrayARB(m_CgQuadColor) );
467
GfxContext.PopClippingRectangle();
470
// Draw Text quad background
472
Geometry rect = GetTextAreaGeometry();
473
rect.OffsetPosition(LeftMarginWidth(), 0);
474
rect.OffsetSize(-LeftMarginWidth(), 0);
475
GfxContext.PushClippingRectangle(rect);
476
if(m_CgQuadPosition != -1)
478
CHECKGL( glEnableVertexAttribArrayARB(m_CgQuadPosition) );
479
CHECKGL( glVertexAttribPointerARB(m_CgQuadPosition, 4, GL_FLOAT, GL_FALSE, 32, &m_ColorQuadBuffer0[0]) );
481
if(m_CgQuadColor != -1)
483
CHECKGL( glEnableVertexAttribArrayARB(m_CgQuadColor) );
484
CHECKGL( glVertexAttribPointerARB(m_CgQuadColor, 4, GL_FLOAT, GL_FALSE, 32, &m_ColorQuadBuffer0[0]+4) );
487
CHECKGL( glDrawArrays( GL_QUADS, 0, m_NumVBColorQuad0*4 ) );
489
if(m_CgQuadPosition != -1)
490
CHECKGL( glDisableVertexAttribArrayARB(m_CgQuadPosition) );
491
if(m_CgQuadColor != -1)
492
CHECKGL( glDisableVertexAttribArrayARB(m_CgQuadColor) );
493
GfxContext.PopClippingRectangle();
495
m_ColorQuadShaderProg->End();
498
m_ShaderProg->Begin();
500
Quadmat = GetThreadGraphicsContext()->GetModelViewProjectionMatrix();
501
if(m_ViewProjectionMatrix0 != -1)
502
m_ShaderProg->SetUniformLocMatrix4fv(m_ViewProjectionMatrix0, 1, false, (float*)&Quadmat);
504
if(m_CgFontTexture != -1)
506
CHECKGL( glUniform1iARB(m_CgFontTexture, 0) );
511
Geometry rect = GetTextAreaGeometry();
512
rect.SetWidth(LeftMarginWidth());
513
GfxContext.PushClippingRectangle(rect);
515
if(m_CgPosition != -1)
517
CHECKGL( glEnableVertexAttribArrayARB(m_CgPosition) );
518
CHECKGL( glVertexAttribPointerARB(m_CgPosition, 4, GL_FLOAT, GL_FALSE, 48, &m_TextVertexBuffer1[0]) );
523
CHECKGL( glEnableVertexAttribArrayARB(m_CgTexUV) );
524
CHECKGL( glVertexAttribPointerARB(m_CgTexUV, 4, GL_FLOAT, GL_FALSE, 48, &m_TextVertexBuffer1[0]+4) );
529
CHECKGL( glEnableVertexAttribArrayARB(m_CgColor) );
530
CHECKGL( glVertexAttribPointerARB(m_CgColor, 4, GL_FLOAT, GL_FALSE, 48, &m_TextVertexBuffer1[0]+8) );
533
CHECKGL( glDrawArrays( GL_QUADS, 0, m_NumVBQuad1*4 ) );
535
if(m_CgPosition != -1)
536
CHECKGL( glDisableVertexAttribArrayARB(m_CgPosition) );
538
CHECKGL( glDisableVertexAttribArrayARB(m_CgTexUV) );
540
CHECKGL( glDisableVertexAttribArrayARB(m_CgColor) );
541
GfxContext.PopClippingRectangle();
546
Geometry rect = GetTextAreaGeometry();
547
rect.OffsetPosition(LeftMarginWidth(), 0);
548
rect.OffsetSize(-LeftMarginWidth(), 0);
549
GfxContext.PushClippingRectangle(rect);
551
if(m_CgPosition != -1)
553
CHECKGL( glEnableVertexAttribArrayARB(m_CgPosition) );
554
CHECKGL( glVertexAttribPointerARB(m_CgPosition, 4, GL_FLOAT, GL_FALSE, 48, &m_TextVertexBuffer0[0]) );
559
CHECKGL( glEnableVertexAttribArrayARB(m_CgTexUV) );
560
CHECKGL( glVertexAttribPointerARB(m_CgTexUV, 4, GL_FLOAT, GL_FALSE, 48, &m_TextVertexBuffer0[0]+4) );
565
CHECKGL( glEnableVertexAttribArrayARB(m_CgColor) );
566
CHECKGL( glVertexAttribPointerARB(m_CgColor, 4, GL_FLOAT, GL_FALSE, 48, &m_TextVertexBuffer0[0]+8) );
569
CHECKGL( glDrawArrays( GL_QUADS, 0, m_NumVBQuad0*4 ) );
571
if(m_CgPosition != -1)
572
CHECKGL( glDisableVertexAttribArrayARB(m_CgPosition) );
574
CHECKGL( glDisableVertexAttribArrayARB(m_CgTexUV) );
576
CHECKGL( glDisableVertexAttribArrayARB(m_CgColor) );
578
GfxContext.PopClippingRectangle();
583
GetThreadGraphicsContext()->GetRenderStates().SetColorMask(TRUE, TRUE, TRUE, TRUE);
584
GetThreadGraphicsContext()->GetRenderStates().SetBlend(FALSE);
586
CHECKGL( glDisable(GL_TEXTURE_RECTANGLE_ARB) );
589
b_RenderToVertexBuffer = false;
591
if(m_vertical_scrollbar_enable)
593
vscrollbar->ProcessDraw(GfxContext, force_draw);
595
if(m_horizontal_scrollbar_enable)
597
hscrollbar->ProcessDraw(GfxContext, force_draw);
600
GfxContext.PopClippingRectangle();
603
void TextView::DrawContent(GraphicsContext& GfxContext, bool force_draw)
606
if(m_vertical_scrollbar_enable)
608
vscrollbar->ProcessDraw(GfxContext, force_draw);
610
if(m_horizontal_scrollbar_enable)
612
hscrollbar->ProcessDraw(GfxContext, force_draw);
615
std::vector<int>::iterator it;
616
int NumDirtyLines = m_DirtyLines.size();
617
for(it = m_DirtyLines.begin(); it != m_DirtyLines.end(); it++)
619
int LineNumber = *(it);
620
OnPaintLine(GfxContext, LineNumber);
621
//nuxDebugMsg(TEXT("Paint line (%d): %d"), n, LineNumber);
627
if((!m_fHideCaret) && m_HasFocus)
629
GfxContext.PushClippingRectangle(Geometry(m_ViewX /*+ LeftMarginWidth()*/, m_ViewY, m_ViewWidth /*- LeftMarginWidth()*/, m_ViewHeight));
630
//gPainter.Draw2DLine(GfxContext, m_CaretPosition.x, m_CaretPosition.y, m_CaretPosition.x, m_CaretPosition.y + m_nLineHeight, Color(0xFFAA0000));
632
gPainter.Paint2DQuadColor(GfxContext, m_CaretPosition.x, m_CaretPosition.y, 2, m_nLineHeight, Color(0xFFAA0000));
634
GfxContext.PopClippingRectangle();
635
m_DirtyLines.clear();
637
m_RedrawCaret = false;
641
void TextView::PreLayoutManagement()
643
TextViewWidget::PreLayoutManagement();
646
long TextView::PostLayoutManagement(long LayoutResult)
648
long ret = TextViewWidget::PostLayoutManagement(LayoutResult);
655
void TextView::PositionChildLayout(float offsetX, float offsetY)
657
TextViewWidget::PositionChildLayout(offsetX, offsetY);
660
Geometry TextView::GetTextAreaGeometry() const
663
int vscrollbarwidth = 0;
664
int hscrollbarheight = 0;
665
if(m_vertical_scrollbar_enable)
666
vscrollbarwidth = vscrollbar->GetBaseWidth();
667
if(m_horizontal_scrollbar_enable)
668
hscrollbarheight = hscrollbar->GetBaseHeight();
670
rect = GetGeometry();
671
rect.OffsetPosition(getBorder() + GetViewContentLeftMargin(), getTopBorder() + GetViewContentTopMargin());
672
rect.OffsetSize(-(2*getBorder() + GetViewContentLeftMargin() + GetViewContentRightMargin() + vscrollbarwidth),
673
-(getTopBorder() + getBorder() + GetViewContentTopMargin() + GetViewContentBottomMargin() + hscrollbarheight));
678
void TextView::ScrollLeft(float stepx, int mousedx)
681
m_ContentOffsetX += (float)stepx * (float)mousedx;;
682
if(m_ContentOffsetX > 0)
685
m_ContentOffsetX = 0;
689
m_nHScrollPos = Abs(m_ContentOffsetX/m_nFontWidth);
692
//nuxDebugMsg(TEXT("HScrollPos = %d"), m_nHScrollPos);
693
hscrollbar->SetContentOffset(m_ContentOffsetX, m_ContentOffsetY);
695
hscrollbar->NeedRedraw();
700
void TextView::ScrollRight(float stepx, int mousedx)
703
m_ContentOffsetX -= (float)stepx * (float)mousedx;
704
if((m_ViewX + m_ContentOffsetX + (m_nLongestLine*m_nFontWidth) < m_ViewX - LeftMarginWidth() + m_ViewWidth) && (m_ContentOffsetX < 0))
706
m_ContentOffsetX = -((m_nLongestLine*m_nFontWidth) > m_ViewWidth - LeftMarginWidth() ? (m_nLongestLine*m_nFontWidth) - m_ViewWidth + LeftMarginWidth() : 0);
707
m_nHScrollPos = Abs(m_ContentOffsetX/m_nFontWidth) + 1;
711
m_nHScrollPos = Abs((m_ContentOffsetX)/m_nFontWidth);
714
//nuxDebugMsg(TEXT("HScrollPos = %d"), m_nHScrollPos);
715
hscrollbar->SetContentOffset(m_ContentOffsetX, m_ContentOffsetY);
717
hscrollbar->NeedRedraw();
722
void TextView::ScrollUp(float stepy, int mousedy)
725
m_ContentOffsetY += stepy * (float)mousedy;
726
if(m_ContentOffsetY > 0)
729
m_ContentOffsetY = 0;
733
m_nVScrollPos = Abs(m_ContentOffsetY / m_nLineHeight);
736
//nuxDebugMsg(TEXT("VScrollPos = %d"), m_nVScrollPos);
737
vscrollbar->SetContentOffset(m_ContentOffsetX, m_ContentOffsetY);
739
vscrollbar->NeedRedraw();
744
void TextView::ScrollDown(float stepy, int mousedy)
747
m_ContentOffsetY -= (float)stepy * (float)mousedy;
748
if((m_ViewY + m_ContentOffsetY + (m_nLineHeight*m_nLineCount) < m_ViewY + m_ViewHeight) && (m_ContentOffsetY<0))
750
m_ContentOffsetY = -((m_nLineHeight*m_nLineCount) > m_ViewHeight ? (m_nLineHeight*m_nLineCount) - m_ViewHeight : 0);
751
m_nVScrollPos = Abs(m_ContentOffsetY / m_nLineHeight);
755
m_nVScrollPos = Abs(m_ContentOffsetY / m_nLineHeight);
758
//nuxDebugMsg(TEXT("VScrollPos = %d"), m_nVScrollPos);
759
vscrollbar->SetContentOffset(m_ContentOffsetX, m_ContentOffsetY);
761
vscrollbar->NeedRedraw();
766
void TextView::RecvMouseWheel(int x, int y, int delta, t_u32 button_flags, t_u32 key_flags)
768
m_MouseWheelAcc += delta;
769
int scrollunit = m_MouseWheelAcc / INL_WIN32_MOUSEWHEEL_DELTA;
770
m_MouseWheelAcc = m_MouseWheelAcc % INL_WIN32_MOUSEWHEEL_DELTA;
775
if(m_nVScrollPos > 0)
777
m_ContentOffsetY += scrollunit* m_nLineHeight;
778
if(m_ContentOffsetY > 0)
779
m_ContentOffsetY = 0;
782
vscrollbar->NeedRedraw();
790
if(m_nVScrollPos < m_nLineCount)
792
m_ContentOffsetY += scrollunit* m_nLineHeight;
793
if(m_ContentOffsetY < -m_nLineCount*m_nLineHeight)
794
m_ContentOffsetY = -m_nLineCount*m_nLineHeight;
799
vscrollbar->NeedRedraw();
805
void TextView::RecvKeyEvent(
806
GraphicsContext& GfxContext , /*Graphics Context for text operation*/
807
t_u32 eventType , /*event type*/
808
t_u32 keysym , /*event keysym*/
809
t_u32 state , /*event state*/
810
const char* character , /*character*/
811
bool isRepeated , /*true if the key is repeated more than once*/
812
unsigned short keyCount /*key repeat count*/
815
if(keyCount && ((keysym == INL_VK_PAGE_UP) || (keysym == INL_KP_PAGE_UP)))
817
m_ContentOffsetY += m_nWindowLines* m_nLineHeight;
818
if(m_ContentOffsetY > 0)
819
m_ContentOffsetY = 0;
822
vscrollbar->NeedRedraw();
826
if(keyCount && ((keysym == INL_VK_PAGE_DOWN) || (keysym == INL_KP_PAGE_DOWN)))
828
m_ContentOffsetY -= m_nWindowLines* m_nLineHeight;
829
if(m_ContentOffsetY < -m_nLineCount*m_nLineHeight)
830
m_ContentOffsetY = -m_nLineCount*m_nLineHeight;
833
vscrollbar->NeedRedraw();
839
void TextView::RecvStartFocus()
843
StartBlinkCursor(true);
847
void TextView::RecvEndFocus()
849
// if we are making a selection when we lost focus then
850
// stop the selection logic
851
if(m_nSelectionMode != SEL_NONE)
853
OnLButtonUp(0, 0, 0, 0);
856
StopBlinkCursor(false);
860
bool TextView::IsKeyPressed(t_u32 virtualkey)
862
return GetThreadGLWindow()->GetCurrentEvent().GetVirtualKeyState(virtualkey);
865
void TextView::BlinkCursorTimerInterrupt(void* v)
867
GetThreadTimer().RemoveTimerHandler(m_BlinkTimerHandler);
868
m_BlinkTimerHandler = GetThreadTimer().AddTimerHandler(500, m_BlinkTimerFunctor, this);
869
BlinkCursor = !BlinkCursor;
870
AddDirtyLine(m_nCurrentLine);
874
void TextView::StopBlinkCursor(bool BlinkState)
876
GetThreadTimer().RemoveTimerHandler(m_BlinkTimerHandler);
877
m_BlinkTimerHandler = 0;
878
BlinkCursor = BlinkState;
879
AddDirtyLine(m_nCurrentLine);
883
void TextView::StartBlinkCursor(bool BlinkState)
885
m_BlinkTimerHandler = GetThreadTimer().AddTimerHandler(500, m_BlinkTimerFunctor, this);
886
BlinkCursor = BlinkState;
887
AddDirtyLine(m_nCurrentLine);
25
#include "TextViewInternal.h"
28
#include "HScrollBar.h"
29
#include "VScrollBar.h"
34
#include "TimerProc.h"
39
// Constructor for TextView class
41
TextView::TextView(HWND hwnd)
42
: m_BlinkTimerFunctor(0)
43
, m_BlinkTimerHandler(0)
46
m_TextFontRenderer = new FontRenderer(*GetThreadGraphicsContext());
49
m_TextVertexBuffer0.resize(m_VBSize0);
50
m_TextVertexBuffer1.resize(m_VBSize1);
51
m_ColorQuadBuffer0.resize(m_VBSize0);
52
m_ColorQuadBuffer1.resize(m_VBSize1);
56
m_NumVBColorQuad0 = 0;
57
m_NumVBColorQuad1 = 0;
59
b_RenderToVertexBuffer = false;
61
m_ShaderProg = GetThreadGLDeviceFactory()->CreateShaderProgram();
62
m_ShaderProg->LoadIShaderFile(INL_FINDRESOURCELOCATION(TEXT("Data/Shaders/TextViewShader.glsl")));
65
m_CgColor = m_ShaderProg->GetAttributeLocation(TEXT("iColor"));
66
m_CgPosition = m_ShaderProg->GetAttributeLocation(TEXT("iPosition"));
67
m_CgTexUV = m_ShaderProg->GetAttributeLocation(TEXT("iTexUV"));
69
m_CgFontTexture = m_ShaderProg->GetUniformLocationARB(TEXT("FontTexture"));
70
m_ViewProjectionMatrix0 = m_ShaderProg->GetUniformLocationARB(TEXT("ViewProjectionMatrix"));
72
m_ColorQuadShaderProg = GetThreadGLDeviceFactory()->CreateShaderProgram();
73
m_ColorQuadShaderProg->LoadIShaderFile(INL_FINDRESOURCELOCATION(TEXT("Shaders//TextViewColorQuadShader.glsl")));
74
m_ColorQuadShaderProg->Link();
76
m_CgQuadPosition = m_ColorQuadShaderProg->GetAttributeLocation(TEXT("iPosition"));
77
m_CgQuadColor = m_ColorQuadShaderProg->GetAttributeLocation(TEXT("iColor"));
78
m_ViewProjectionMatrix1 = m_ColorQuadShaderProg->GetUniformLocationARB(TEXT("ViewProjectionMatrix"));
93
// Scrollbar related data
99
// Display-related data
100
m_nTabWidthChars = 4;
103
m_nLongLineLimit = 80;
104
m_nLineInfoCount = 0;
105
m_nCRLFMode = TXL_ALL;
107
m_nCaretWidth = 1; // texttodo: SystemParametersInfo(SPI_GETCARETWIDTH, 0, &m_nCaretWidth, 0);
109
if(m_nCaretWidth == 0)
112
// Default display colours
113
m_rgbColourList[TXC_FOREGROUND] = 0xFFFFFFFF; // SYSCOL(COLOR_WINDOWTEXT);
114
m_rgbColourList[TXC_BACKGROUND] = 0xFF4D4D4D; // SYSCOL(COLOR_WINDOW);
115
m_rgbColourList[TXC_HIGHLIGHTTEXT] = 0xFF000000; // SYSCOL(COLOR_HIGHLIGHTTEXT);
116
m_rgbColourList[TXC_HIGHLIGHT] = 0xFFbebebe; // SYSCOL(COLOR_HIGHLIGHT);
117
m_rgbColourList[TXC_HIGHLIGHTTEXT2] = 0xFFf4f4f4; // SYSCOL(COLOR_INACTIVECAPTIONTEXT);
118
m_rgbColourList[TXC_HIGHLIGHT2] = 0xFF747474; // SYSCOL(COLOR_INACTIVECAPTION);
119
m_rgbColourList[TXC_SELMARGIN1] = 0xFFe2e2e2; // SYSCOL(COLOR_3DFACE);
120
m_rgbColourList[TXC_SELMARGIN2] = 0xFFffffff; // SYSCOL(COLOR_3DHIGHLIGHT);
121
m_rgbColourList[TXC_LINENUMBERTEXT] = 0xFFb4b4b4; // SYSCOL(COLOR_3DSHADOW);
122
m_rgbColourList[TXC_LINENUMBER] = 0xFFe2e2e2; // SYSCOL(COLOR_3DFACE);
123
m_rgbColourList[TXC_LONGLINETEXT] = 0xFFb4b4b4; // SYSCOL(COLOR_3DSHADOW);
124
m_rgbColourList[TXC_LONGLINE] = 0xFFe2e2e2; // SYSCOL(COLOR_3DFACE);
125
m_rgbColourList[TXC_CURRENTLINETEXT] = 0xFF000000; // SYSCOL(COLOR_WINDOWTEXT);
126
m_rgbColourList[TXC_CURRENTLINE] = 0xFFfff0e6; // RGB(230,240,255);
129
m_nSelectionMode = SEL_NONE;
131
m_fHideCaret = false;
132
m_fTransparent = true;
135
m_nSelectionStart = 0;
141
m_CharacterAtCursor = 0;
142
m_CursorCharacterPosition = 0;
148
m_RedrawCaret = true;
150
m_pTextDoc = new TextDocument();
152
m_hMarginCursor = CreateCursor(GetModuleHandle(0), 21, 5, 32, 32, XORMask, ANDMask);
155
// The TextView state must be fully initialized before we
156
// start calling member-functions
159
hscrollbar->OnScrollLeft.connect( sigc::mem_fun(this, &TextView::ScrollLeft));
160
hscrollbar->OnScrollRight.connect( sigc::mem_fun(this, &TextView::ScrollRight));
161
vscrollbar->OnScrollUp.connect( sigc::mem_fun(this, &TextView::ScrollUp));
162
vscrollbar->OnScrollDown.connect( sigc::mem_fun(this, &TextView::ScrollDown));
164
OnMouseDown.connect(sigc::mem_fun(this, &TextView::OnLButtonDown));
165
OnMouseUp.connect(sigc::mem_fun(this, &TextView::OnLButtonUp));
166
OnMouseMove.connect(sigc::mem_fun(this, &TextView::RecvMouseMove));
167
OnMouseDrag.connect(sigc::mem_fun(this, &TextView::RecvMouseMove));
168
OnMouseEnter.connect(sigc::mem_fun(this, &TextView::RecvMouseEnter));
169
OnMouseLeave.connect(sigc::mem_fun(this, &TextView::RecvMouseLeave));
171
OnMouseWheel.connect(sigc::mem_fun(this, &TextView::RecvMouseWheel));
172
OnKeyEvent.connect(sigc::mem_fun(this, &TextView::RecvKeyEvent));
174
OnStartFocus.connect(sigc::mem_fun(this, &TextView::RecvStartFocus));
175
OnEndFocus.connect(sigc::mem_fun(this, &TextView::RecvEndFocus));
177
MouseAutoScrollTimer = new TimerFunctor;
178
MouseAutoScrollTimer->OnTimerExpired.connect(sigc::mem_fun(this, &TextView::RecvTimer));
179
MouseAutoScrollHandle = 0;
181
SetTextColor(Color(m_rgbColourList[TXC_FOREGROUND]));
182
SetTextBkColor(Color(m_rgbColourList[TXC_BACKGROUND]));
186
OpenFile(TEXT("C:\\Development\\Inalogic\\DIGITAL.txt"));
187
SetStyle(0, TXS_SELMARGIN);
188
SetStyle(0, TXS_LINENUMBERS);
190
m_BlinkTimerFunctor = new TimerFunctor();
191
m_BlinkTimerFunctor->OnTimerExpired.connect(sigc::mem_fun(this, &TextView::BlinkCursorTimerInterrupt));
195
// Destructor for TextView class
197
TextView::~TextView()
202
DestroyCursor(m_hMarginCursor);
206
void TextView::SetTextBkColor(const Color& color)
208
m_TextBkColor = color;
211
const Color& TextView::GetTextBkColor()
213
return m_TextBkColor;
217
VOID TextView::UpdateMetrics()
219
OnSize(0, m_ViewWidth, m_ViewHeight);
225
LONG TextView::OnSetFocus(HWND hwndOld)
230
LONG TextView::OnKillFocus(HWND hwndNew)
235
t_u32 TextView::SetStyle(t_u32 uMask, t_u32 uStyles)
237
t_u32 oldstyle = m_uStyleFlags;
239
m_uStyleFlags = (m_uStyleFlags & ~uMask) | uStyles;
241
// update display here
248
t_u32 TextView::SetVar(t_u32 nVar, t_u32 nValue)
253
t_u32 TextView::GetVar(t_u32 nVar)
258
t_u32 TextView::GetStyleMask(t_u32 uMask)
260
return m_uStyleFlags & uMask;
263
bool TextView::CheckStyle(t_u32 uMask)
265
return (m_uStyleFlags & uMask) ? true : false;
268
int TextView::SetCaretWidth(int nWidth)
270
int oldwidth = m_nCaretWidth;
271
m_nCaretWidth = nWidth;
276
BOOL TextView::SetImageList(HIMAGELIST hImgList)
278
m_hImageList = hImgList;
282
LONG TextView::SetLongLine(int nLength)
284
int oldlen = m_nLongLineLimit;
285
m_nLongLineLimit = nLength;
289
int CompareLineInfo(LINEINFO *elem1, LINEINFO *elem2)
291
if(elem1->nLineNo < elem2->nLineNo)
293
if(elem1->nLineNo > elem2->nLineNo)
299
int TextView::SetLineImage(t_u32 nLineNo, t_u32 nImageIdx)
301
LINEINFO *linfo = GetLineInfo(nLineNo);
303
// if already a line with an image
306
linfo->nImageIdx = nImageIdx;
310
linfo = &m_LineInfo[m_nLineInfoCount++];
311
linfo->nLineNo = nLineNo;
312
linfo->nImageIdx = nImageIdx;
319
(COMPAREPROC)CompareLineInfo
326
LINEINFO* TextView::GetLineInfo(t_u32 nLineNo)
328
LINEINFO key = { nLineNo, 0 };
330
// perform the binary search
331
return (LINEINFO *) bsearch(
336
(COMPAREPROC)CompareLineInfo
342
// Public memberfunction
344
LONG WINAPI TextView::WndProc(UINT msg, WPARAM wParam, LPARAM lParam)
349
return OnSize(wParam, LOWORD(lParam), HIWORD(lParam));
352
return OnVScroll(LOWORD(wParam), HIWORD(wParam));
355
return OnHScroll(LOWORD(wParam), HIWORD(wParam));
357
case WM_MOUSEACTIVATE:
358
return OnMouseActivate((HWND)wParam, LOWORD(lParam), HIWORD(lParam));
361
return OnMouseWheelFunc((short)HIWORD(wParam));
364
return OnSetFocus((HWND)wParam);
367
return OnKillFocus((HWND)wParam);
370
if(LOWORD(lParam) == HTCLIENT)
376
return OpenFile((TCHAR *)lParam);
384
return DefWindowProc(m_hWnd, msg, wParam, lParam);
387
long TextView::ProcessEvent(IEvent &ievent, long TraverseInfo, long ProcessEventInfo)
389
long ret = TraverseInfo;
391
ret = vscrollbar->ProcessEvent(ievent, ret, ProcessEventInfo);
392
ret = hscrollbar->ProcessEvent(ievent, ret, ProcessEventInfo);
394
ret = GetCompositionLayout()->ProcessEvent(ievent, ret, ProcessEventInfo);
396
// PostProcessEvent2 must always have its last parameter set to 0
397
// because the m_BackgroundArea is the real physical limit of the window.
398
// So the previous test about IsPointInside do not prevail over m_BackgroundArea
399
// testing the event by itself.
400
ret = PostProcessEvent2(ievent, ret, 0);
402
if(ievent.e_event == INL_WINDOW_ENTER_FOCUS)
405
StopBlinkCursor(false);
406
StartBlinkCursor(false);
408
if(ievent.e_event == INL_WINDOW_EXIT_FOCUS)
411
StopBlinkCursor(false);
417
void TextView::Draw(GraphicsContext& GfxContext, bool force_draw)
419
GfxContext.PushClippingRectangle(GetGeometry());
421
b_RenderToVertexBuffer = true;
424
m_NumVBColorQuad0 = 0;
425
m_NumVBColorQuad1 = 0;
429
if(b_RenderToVertexBuffer)
431
GetThreadGraphicsContext()->GetRenderStates().SetBlend(TRUE, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
432
GetThreadGraphicsContext()->GetRenderStates().SetColorMask(TRUE, TRUE, TRUE, FALSE); // Do not write the alpha of characters
434
GfxContext.EnableTextureMode(GL_TEXTURE0, GL_TEXTURE_RECTANGLE_ARB);
435
TRefGL< NGLRectangleTexture > glTexture = GfxContext.ResourceCache.GetCachedResource(m_TextFont->TextureArray[0]);
436
GetThreadGraphicsContext()->SetTexture(GL_TEXTURE0, glTexture->m_Texture);
438
/////////////////////////////////////////////////////////////////////////////////////////////////////
439
m_ColorQuadShaderProg->Begin();
441
Matrix4 Quadmat = GetThreadGraphicsContext()->GetModelViewProjectionMatrix();
442
if(m_ViewProjectionMatrix1 != -1)
443
m_ColorQuadShaderProg->SetUniformLocMatrix4fv(m_ViewProjectionMatrix1, 1, false, (float*)&Quadmat);
445
// Draw Line Number quad background
447
Geometry rect = GetTextAreaGeometry();
448
rect.SetWidth(LeftMarginWidth());
449
GfxContext.PushClippingRectangle(rect);
450
if(m_CgQuadPosition != -1)
452
CHECKGL( glEnableVertexAttribArrayARB(m_CgQuadPosition) );
453
CHECKGL( glVertexAttribPointerARB(m_CgQuadPosition, 4, GL_FLOAT, GL_FALSE, 32, &m_ColorQuadBuffer1[0]) );
455
if(m_CgQuadColor != -1)
457
CHECKGL( glEnableVertexAttribArrayARB(m_CgQuadColor) );
458
CHECKGL( glVertexAttribPointerARB(m_CgQuadColor, 4, GL_FLOAT, GL_FALSE, 32, &m_ColorQuadBuffer1[0]+4) );
461
CHECKGL( glDrawArrays( GL_QUADS, 0, m_NumVBColorQuad1*4 ) );
463
if(m_CgQuadPosition != -1)
464
CHECKGL( glDisableVertexAttribArrayARB(m_CgQuadPosition) );
465
if(m_CgQuadColor != -1)
466
CHECKGL( glDisableVertexAttribArrayARB(m_CgQuadColor) );
467
GfxContext.PopClippingRectangle();
470
// Draw Text quad background
472
Geometry rect = GetTextAreaGeometry();
473
rect.OffsetPosition(LeftMarginWidth(), 0);
474
rect.OffsetSize(-LeftMarginWidth(), 0);
475
GfxContext.PushClippingRectangle(rect);
476
if(m_CgQuadPosition != -1)
478
CHECKGL( glEnableVertexAttribArrayARB(m_CgQuadPosition) );
479
CHECKGL( glVertexAttribPointerARB(m_CgQuadPosition, 4, GL_FLOAT, GL_FALSE, 32, &m_ColorQuadBuffer0[0]) );
481
if(m_CgQuadColor != -1)
483
CHECKGL( glEnableVertexAttribArrayARB(m_CgQuadColor) );
484
CHECKGL( glVertexAttribPointerARB(m_CgQuadColor, 4, GL_FLOAT, GL_FALSE, 32, &m_ColorQuadBuffer0[0]+4) );
487
CHECKGL( glDrawArrays( GL_QUADS, 0, m_NumVBColorQuad0*4 ) );
489
if(m_CgQuadPosition != -1)
490
CHECKGL( glDisableVertexAttribArrayARB(m_CgQuadPosition) );
491
if(m_CgQuadColor != -1)
492
CHECKGL( glDisableVertexAttribArrayARB(m_CgQuadColor) );
493
GfxContext.PopClippingRectangle();
495
m_ColorQuadShaderProg->End();
498
m_ShaderProg->Begin();
500
Quadmat = GetThreadGraphicsContext()->GetModelViewProjectionMatrix();
501
if(m_ViewProjectionMatrix0 != -1)
502
m_ShaderProg->SetUniformLocMatrix4fv(m_ViewProjectionMatrix0, 1, false, (float*)&Quadmat);
504
if(m_CgFontTexture != -1)
506
CHECKGL( glUniform1iARB(m_CgFontTexture, 0) );
511
Geometry rect = GetTextAreaGeometry();
512
rect.SetWidth(LeftMarginWidth());
513
GfxContext.PushClippingRectangle(rect);
515
if(m_CgPosition != -1)
517
CHECKGL( glEnableVertexAttribArrayARB(m_CgPosition) );
518
CHECKGL( glVertexAttribPointerARB(m_CgPosition, 4, GL_FLOAT, GL_FALSE, 48, &m_TextVertexBuffer1[0]) );
523
CHECKGL( glEnableVertexAttribArrayARB(m_CgTexUV) );
524
CHECKGL( glVertexAttribPointerARB(m_CgTexUV, 4, GL_FLOAT, GL_FALSE, 48, &m_TextVertexBuffer1[0]+4) );
529
CHECKGL( glEnableVertexAttribArrayARB(m_CgColor) );
530
CHECKGL( glVertexAttribPointerARB(m_CgColor, 4, GL_FLOAT, GL_FALSE, 48, &m_TextVertexBuffer1[0]+8) );
533
CHECKGL( glDrawArrays( GL_QUADS, 0, m_NumVBQuad1*4 ) );
535
if(m_CgPosition != -1)
536
CHECKGL( glDisableVertexAttribArrayARB(m_CgPosition) );
538
CHECKGL( glDisableVertexAttribArrayARB(m_CgTexUV) );
540
CHECKGL( glDisableVertexAttribArrayARB(m_CgColor) );
541
GfxContext.PopClippingRectangle();
546
Geometry rect = GetTextAreaGeometry();
547
rect.OffsetPosition(LeftMarginWidth(), 0);
548
rect.OffsetSize(-LeftMarginWidth(), 0);
549
GfxContext.PushClippingRectangle(rect);
551
if(m_CgPosition != -1)
553
CHECKGL( glEnableVertexAttribArrayARB(m_CgPosition) );
554
CHECKGL( glVertexAttribPointerARB(m_CgPosition, 4, GL_FLOAT, GL_FALSE, 48, &m_TextVertexBuffer0[0]) );
559
CHECKGL( glEnableVertexAttribArrayARB(m_CgTexUV) );
560
CHECKGL( glVertexAttribPointerARB(m_CgTexUV, 4, GL_FLOAT, GL_FALSE, 48, &m_TextVertexBuffer0[0]+4) );
565
CHECKGL( glEnableVertexAttribArrayARB(m_CgColor) );
566
CHECKGL( glVertexAttribPointerARB(m_CgColor, 4, GL_FLOAT, GL_FALSE, 48, &m_TextVertexBuffer0[0]+8) );
569
CHECKGL( glDrawArrays( GL_QUADS, 0, m_NumVBQuad0*4 ) );
571
if(m_CgPosition != -1)
572
CHECKGL( glDisableVertexAttribArrayARB(m_CgPosition) );
574
CHECKGL( glDisableVertexAttribArrayARB(m_CgTexUV) );
576
CHECKGL( glDisableVertexAttribArrayARB(m_CgColor) );
578
GfxContext.PopClippingRectangle();
583
GetThreadGraphicsContext()->GetRenderStates().SetColorMask(TRUE, TRUE, TRUE, TRUE);
584
GetThreadGraphicsContext()->GetRenderStates().SetBlend(FALSE);
586
CHECKGL( glDisable(GL_TEXTURE_RECTANGLE_ARB) );
589
b_RenderToVertexBuffer = false;
591
if(m_vertical_scrollbar_enable)
593
vscrollbar->ProcessDraw(GfxContext, force_draw);
595
if(m_horizontal_scrollbar_enable)
597
hscrollbar->ProcessDraw(GfxContext, force_draw);
600
GfxContext.PopClippingRectangle();
603
void TextView::DrawContent(GraphicsContext& GfxContext, bool force_draw)
606
if(m_vertical_scrollbar_enable)
608
vscrollbar->ProcessDraw(GfxContext, force_draw);
610
if(m_horizontal_scrollbar_enable)
612
hscrollbar->ProcessDraw(GfxContext, force_draw);
615
std::vector<int>::iterator it;
616
int NumDirtyLines = m_DirtyLines.size();
617
for(it = m_DirtyLines.begin(); it != m_DirtyLines.end(); it++)
619
int LineNumber = *(it);
620
OnPaintLine(GfxContext, LineNumber);
621
//nuxDebugMsg(TEXT("Paint line (%d): %d"), n, LineNumber);
627
if((!m_fHideCaret) && m_HasFocus)
629
GfxContext.PushClippingRectangle(Geometry(m_ViewX /*+ LeftMarginWidth()*/, m_ViewY, m_ViewWidth /*- LeftMarginWidth()*/, m_ViewHeight));
630
//gPainter.Draw2DLine(GfxContext, m_CaretPosition.x, m_CaretPosition.y, m_CaretPosition.x, m_CaretPosition.y + m_nLineHeight, Color(0xFFAA0000));
632
gPainter.Paint2DQuadColor(GfxContext, m_CaretPosition.x, m_CaretPosition.y, 2, m_nLineHeight, Color(0xFFAA0000));
634
GfxContext.PopClippingRectangle();
635
m_DirtyLines.clear();
637
m_RedrawCaret = false;
641
void TextView::PreLayoutManagement()
643
TextViewWidget::PreLayoutManagement();
646
long TextView::PostLayoutManagement(long LayoutResult)
648
long ret = TextViewWidget::PostLayoutManagement(LayoutResult);
655
void TextView::PositionChildLayout(float offsetX, float offsetY)
657
TextViewWidget::PositionChildLayout(offsetX, offsetY);
660
Geometry TextView::GetTextAreaGeometry() const
663
int vscrollbarwidth = 0;
664
int hscrollbarheight = 0;
665
if(m_vertical_scrollbar_enable)
666
vscrollbarwidth = vscrollbar->GetBaseWidth();
667
if(m_horizontal_scrollbar_enable)
668
hscrollbarheight = hscrollbar->GetBaseHeight();
670
rect = GetGeometry();
671
rect.OffsetPosition(getBorder() + GetViewContentLeftMargin(), getTopBorder() + GetViewContentTopMargin());
672
rect.OffsetSize(-(2*getBorder() + GetViewContentLeftMargin() + GetViewContentRightMargin() + vscrollbarwidth),
673
-(getTopBorder() + getBorder() + GetViewContentTopMargin() + GetViewContentBottomMargin() + hscrollbarheight));
678
void TextView::ScrollLeft(float stepx, int mousedx)
681
m_ContentOffsetX += (float)stepx * (float)mousedx;;
682
if(m_ContentOffsetX > 0)
685
m_ContentOffsetX = 0;
689
m_nHScrollPos = Abs(m_ContentOffsetX/m_nFontWidth);
692
//nuxDebugMsg(TEXT("HScrollPos = %d"), m_nHScrollPos);
693
hscrollbar->SetContentOffset(m_ContentOffsetX, m_ContentOffsetY);
695
hscrollbar->NeedRedraw();
700
void TextView::ScrollRight(float stepx, int mousedx)
703
m_ContentOffsetX -= (float)stepx * (float)mousedx;
704
if((m_ViewX + m_ContentOffsetX + (m_nLongestLine*m_nFontWidth) < m_ViewX - LeftMarginWidth() + m_ViewWidth) && (m_ContentOffsetX < 0))
706
m_ContentOffsetX = -((m_nLongestLine*m_nFontWidth) > m_ViewWidth - LeftMarginWidth() ? (m_nLongestLine*m_nFontWidth) - m_ViewWidth + LeftMarginWidth() : 0);
707
m_nHScrollPos = Abs(m_ContentOffsetX/m_nFontWidth) + 1;
711
m_nHScrollPos = Abs((m_ContentOffsetX)/m_nFontWidth);
714
//nuxDebugMsg(TEXT("HScrollPos = %d"), m_nHScrollPos);
715
hscrollbar->SetContentOffset(m_ContentOffsetX, m_ContentOffsetY);
717
hscrollbar->NeedRedraw();
722
void TextView::ScrollUp(float stepy, int mousedy)
725
m_ContentOffsetY += stepy * (float)mousedy;
726
if(m_ContentOffsetY > 0)
729
m_ContentOffsetY = 0;
733
m_nVScrollPos = Abs(m_ContentOffsetY / m_nLineHeight);
736
//nuxDebugMsg(TEXT("VScrollPos = %d"), m_nVScrollPos);
737
vscrollbar->SetContentOffset(m_ContentOffsetX, m_ContentOffsetY);
739
vscrollbar->NeedRedraw();
744
void TextView::ScrollDown(float stepy, int mousedy)
747
m_ContentOffsetY -= (float)stepy * (float)mousedy;
748
if((m_ViewY + m_ContentOffsetY + (m_nLineHeight*m_nLineCount) < m_ViewY + m_ViewHeight) && (m_ContentOffsetY<0))
750
m_ContentOffsetY = -((m_nLineHeight*m_nLineCount) > m_ViewHeight ? (m_nLineHeight*m_nLineCount) - m_ViewHeight : 0);
751
m_nVScrollPos = Abs(m_ContentOffsetY / m_nLineHeight);
755
m_nVScrollPos = Abs(m_ContentOffsetY / m_nLineHeight);
758
//nuxDebugMsg(TEXT("VScrollPos = %d"), m_nVScrollPos);
759
vscrollbar->SetContentOffset(m_ContentOffsetX, m_ContentOffsetY);
761
vscrollbar->NeedRedraw();
766
void TextView::RecvMouseWheel(int x, int y, int delta, t_u32 button_flags, t_u32 key_flags)
768
m_MouseWheelAcc += delta;
769
int scrollunit = m_MouseWheelAcc / INL_WIN32_MOUSEWHEEL_DELTA;
770
m_MouseWheelAcc = m_MouseWheelAcc % INL_WIN32_MOUSEWHEEL_DELTA;
775
if(m_nVScrollPos > 0)
777
m_ContentOffsetY += scrollunit* m_nLineHeight;
778
if(m_ContentOffsetY > 0)
779
m_ContentOffsetY = 0;
782
vscrollbar->NeedRedraw();
790
if(m_nVScrollPos < m_nLineCount)
792
m_ContentOffsetY += scrollunit* m_nLineHeight;
793
if(m_ContentOffsetY < -m_nLineCount*m_nLineHeight)
794
m_ContentOffsetY = -m_nLineCount*m_nLineHeight;
799
vscrollbar->NeedRedraw();
805
void TextView::RecvKeyEvent(
806
GraphicsContext& GfxContext , /*Graphics Context for text operation*/
807
t_u32 eventType , /*event type*/
808
t_u32 keysym , /*event keysym*/
809
t_u32 state , /*event state*/
810
const char* character , /*character*/
811
bool isRepeated , /*true if the key is repeated more than once*/
812
unsigned short keyCount /*key repeat count*/
815
if(keyCount && ((keysym == INL_VK_PAGE_UP) || (keysym == INL_KP_PAGE_UP)))
817
m_ContentOffsetY += m_nWindowLines* m_nLineHeight;
818
if(m_ContentOffsetY > 0)
819
m_ContentOffsetY = 0;
822
vscrollbar->NeedRedraw();
826
if(keyCount && ((keysym == INL_VK_PAGE_DOWN) || (keysym == INL_KP_PAGE_DOWN)))
828
m_ContentOffsetY -= m_nWindowLines* m_nLineHeight;
829
if(m_ContentOffsetY < -m_nLineCount*m_nLineHeight)
830
m_ContentOffsetY = -m_nLineCount*m_nLineHeight;
833
vscrollbar->NeedRedraw();
839
void TextView::RecvStartFocus()
843
StartBlinkCursor(true);
847
void TextView::RecvEndFocus()
849
// if we are making a selection when we lost focus then
850
// stop the selection logic
851
if(m_nSelectionMode != SEL_NONE)
853
OnLButtonUp(0, 0, 0, 0);
856
StopBlinkCursor(false);
860
bool TextView::IsKeyPressed(t_u32 virtualkey)
862
return GetThreadGLWindow()->GetCurrentEvent().GetVirtualKeyState(virtualkey);
865
void TextView::BlinkCursorTimerInterrupt(void* v)
867
GetThreadTimer().RemoveTimerHandler(m_BlinkTimerHandler);
868
m_BlinkTimerHandler = GetThreadTimer().AddTimerHandler(500, m_BlinkTimerFunctor, this);
869
BlinkCursor = !BlinkCursor;
870
AddDirtyLine(m_nCurrentLine);
874
void TextView::StopBlinkCursor(bool BlinkState)
876
GetThreadTimer().RemoveTimerHandler(m_BlinkTimerHandler);
877
m_BlinkTimerHandler = 0;
878
BlinkCursor = BlinkState;
879
AddDirtyLine(m_nCurrentLine);
883
void TextView::StartBlinkCursor(bool BlinkState)
885
m_BlinkTimerHandler = GetThreadTimer().AddTimerHandler(500, m_BlinkTimerFunctor, this);
886
BlinkCursor = BlinkState;
887
AddDirtyLine(m_nCurrentLine);