45 #include "RConfigure.h"
48 static const char *gFiletypes[] = {
"All files",
"*",
49 "Text files",
"*.txt",
52 static char *gPrinter = 0;
53 static char *gPrintCommand = 0;
56 TGGC *TGTextEdit::fgCursor0GC;
57 TGGC *TGTextEdit::fgCursor1GC;
61 class TGTextEditHist :
public TList {
65 virtual ~TGTextEditHist() { Delete(); }
68 TObject *obj = Last();
69 if (!obj)
return kFALSE;
79 class TGTextEditCommand :
public TObject {
85 TGTextEditCommand(TGTextEdit *te) : fEdit(te) {
86 fPos = fEdit->GetCurrentPos();
87 fEdit->GetHistory()->Add(
this);
89 void SetPos(TGLongPosition pos) { fPos = pos; }
93 class TInsCharCom :
public TGTextEditCommand {
96 TInsCharCom(TGTextEdit *te,
char ch) : TGTextEditCommand(te) {
100 fEdit->SetCurrent(fPos);
108 class TDelCharCom :
public TGTextEditCommand {
114 TDelCharCom(TGTextEdit *te) : TGTextEditCommand(te) {
116 fChar = fEdit->GetText()->GetChar(fPos);
121 fEdit->SetCurrent(fPos);
122 fEdit->InsChar(fChar);
132 class TBreakLineCom :
public TGTextEditCommand {
135 TBreakLineCom(TGTextEdit *te) : TGTextEditCommand(te) {
142 fEdit->SetCurrent(fPos);
149 class TInsTextCom :
public TGTextEditCommand {
151 TGLongPosition fEndPos;
156 TInsTextCom(TGTextEdit *te) : TGTextEditCommand(te), fChar(0) {
159 void SetEndPos(TGLongPosition end) {
164 fEdit->GetText()->DelText(fPos, fEndPos);
167 fEdit->GetText()->InsChar(fPos, fChar);
168 }
else if (fPos.fY != fEndPos.fY) {
169 fEdit->GetText()->BreakLine(fPos);
171 fEdit->SetCurrent(fPos);
178 class TDelTextCom :
public TGTextEditCommand {
182 TGLongPosition fEndPos;
186 TDelTextCom(TGTextEdit *te, TGText *txt) : TGTextEditCommand(te) {
187 fText =
new TGText(txt);
190 TDelTextCom(
const TDelTextCom &dtc) : TGTextEditCommand(dtc) {
191 fText =
new TGText(dtc.fText);
192 fBreakLine = dtc.fBreakLine;
194 virtual ~TDelTextCom() {
delete fText; }
196 TDelTextCom &operator=(
const TDelTextCom &dtc) {
198 if (fText)
delete fText;
199 fText =
new TGText(dtc.fText);
200 fBreakLine = dtc.fBreakLine;
205 void SetEndPos(TGLongPosition end) {
209 void SetBreakLine(Bool_t on) { fBreakLine = on; }
212 TGLongPosition start_src, end_src;
213 start_src.fX = start_src.fY = 0;
214 end_src.fY = fText->RowCount() - 1;
215 end_src.fX = fText->GetLineLength(end_src.fY) - 1;
217 fEdit->GetText()->InsText(fPos, fText, start_src, end_src);
221 fEdit->GetText()->BreakLine(fEndPos);
222 fEndPos.fX = fEdit->GetText()->GetLineLength(fEndPos.fY);
227 fEdit->SetCurrent(fEndPos);
234 ClassImp(TGTextEdit);
240 TGTextEdit::TGTextEdit(
const TGWindow *parent, UInt_t w, UInt_t h, Int_t
id,
241 UInt_t sboptions, ULong_t back) :
242 TGTextView(parent, w, h, id, sboptions, back)
250 TGTextEdit::TGTextEdit(
const TGWindow *parent, UInt_t w, UInt_t h, TGText *text,
251 Int_t
id, UInt_t sboptions, ULong_t back) :
252 TGTextView(parent, w, h, text, id, sboptions, back)
260 TGTextEdit::TGTextEdit(
const TGWindow *parent, UInt_t w, UInt_t h,
261 const char *
string, Int_t
id, UInt_t sboptions,
263 TGTextView(parent, w, h, string, id, sboptions, back)
271 TGTextEdit::~TGTextEdit()
273 if (TGSearchDialog::SearchDialog()) {
274 TQObject::Disconnect(TGSearchDialog::SearchDialog(), 0,
this);
284 void TGTextEdit::Init()
286 fCursor0GC = GetCursor0GC()();
287 fCursor1GC = GetCursor1GC()();
289 fCurrent.fY = fCurrent.fX = 0;
290 fInsertMode = kInsert;
294 fEnableCursorWithoutFocus = kTRUE;
296 gVirtualX->SetCursor(fCanvas->GetId(), fClient->GetResourcePool()->GetTextCursor());
299 fMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
300 fMenu->AddEntry(
"New", kM_FILE_NEW);
301 fMenu->AddEntry(
"Open...", kM_FILE_OPEN);
302 fMenu->AddSeparator();
303 fMenu->AddEntry(
"Close", kM_FILE_CLOSE);
304 fMenu->AddEntry(
"Save", kM_FILE_SAVE);
305 fMenu->AddEntry(
"Save As...", kM_FILE_SAVEAS);
306 fMenu->AddSeparator();
307 fMenu->AddEntry(
"Print...", kM_FILE_PRINT);
308 fMenu->AddSeparator();
309 fMenu->AddEntry(
"Cut", kM_EDIT_CUT);
310 fMenu->AddEntry(
"Copy", kM_EDIT_COPY);
311 fMenu->AddEntry(
"Paste", kM_EDIT_PASTE);
312 fMenu->AddEntry(
"Select All", kM_EDIT_SELECTALL);
313 fMenu->AddSeparator();
314 fMenu->AddEntry(
"Find...", kM_SEARCH_FIND);
315 fMenu->AddEntry(
"Find Again", kM_SEARCH_FINDAGAIN);
316 fMenu->AddEntry(
"Goto...", kM_SEARCH_GOTO);
318 fMenu->Associate(
this);
320 fHistory =
new TGTextEditHist();
326 void TGTextEdit::SetMenuState()
328 if (fText->RowCount() == 1 && fText->GetLineLength(0) <= 0) {
329 fMenu->DisableEntry(kM_FILE_CLOSE);
330 fMenu->DisableEntry(kM_FILE_SAVE);
331 fMenu->DisableEntry(kM_FILE_SAVEAS);
332 fMenu->DisableEntry(kM_FILE_PRINT);
333 fMenu->DisableEntry(kM_EDIT_SELECTALL);
334 fMenu->DisableEntry(kM_SEARCH_FIND);
335 fMenu->DisableEntry(kM_SEARCH_FINDAGAIN);
336 fMenu->DisableEntry(kM_SEARCH_GOTO);
338 fMenu->EnableEntry(kM_FILE_CLOSE);
339 fMenu->EnableEntry(kM_FILE_SAVE);
340 fMenu->EnableEntry(kM_FILE_SAVEAS);
341 fMenu->EnableEntry(kM_FILE_PRINT);
342 fMenu->EnableEntry(kM_EDIT_SELECTALL);
343 fMenu->EnableEntry(kM_SEARCH_FIND);
344 fMenu->EnableEntry(kM_SEARCH_FINDAGAIN);
345 fMenu->EnableEntry(kM_SEARCH_GOTO);
349 fMenu->DisableEntry(kM_FILE_SAVE);
351 fMenu->EnableEntry(kM_FILE_SAVE);
354 fMenu->EnableEntry(kM_EDIT_CUT);
355 fMenu->EnableEntry(kM_EDIT_COPY);
357 fMenu->DisableEntry(kM_EDIT_CUT);
358 fMenu->DisableEntry(kM_EDIT_COPY);
365 Long_t TGTextEdit::ReturnLongestLineWidth()
367 Long_t linewidth = TGTextView::ReturnLongestLineWidth();
368 linewidth += 3*fScrollVal.fX;
375 void TGTextEdit::Clear(Option_t *)
378 fCurrent.fY = fCurrent.fX = 0;
387 Bool_t TGTextEdit::SaveFile(
const char *filename, Bool_t saveas)
390 Bool_t untitled = !strlen(fText->GetFileName()) ? kTRUE : kFALSE;
391 if (untitled || saveas) {
392 static TString dir(
".");
393 static Bool_t overwr = kFALSE;
395 fi.fFileTypes = gFiletypes;
396 fi.fIniDir = StrDup(dir);
397 fi.fOverwrite = overwr;
398 new TGFileDialog(fClient->GetDefaultRoot(),
this, kFDSave, &fi);
399 overwr = fi.fOverwrite;
400 if (fi.fFilename && strlen(fi.fFilename)) {
402 return fText->Save(fi.fFilename);
406 return fText->Save(fText->GetFileName());
409 return fText->Save(filename);
415 Bool_t TGTextEdit::Copy()
417 if (!fIsMarked || ((fMarkedStart.fX == fMarkedEnd.fX) &&
418 (fMarkedStart.fY == fMarkedEnd.fY))) {
424 Bool_t del = !fCurrent.fX && (fCurrent.fY == fMarkedEnd.fY) && !fMarkedEnd.fX;
425 del = del || (!fMarkedEnd.fX && (fCurrent.fY != fMarkedEnd.fY));
426 del = del && fClipText->AsString().Length() > 0;
430 pos.fY = fClipText->RowCount();
432 fClipText->InsText(pos, 0);
441 Bool_t TGTextEdit::Cut()
454 Bool_t TGTextEdit::Paste()
461 TString sav = fClipText->AsString();
465 fClipText->LoadBuffer(sav.Data());
468 gVirtualX->ConvertPrimarySelection(fId, fClipboard, 0);
476 void TGTextEdit::Print(Option_t *)
const
480 msg.Form(
"%s -P%s\n", gPrintCommand, gPrinter);
481 FILE *p = gSystem->OpenPipe(msg.Data(),
"w");
489 while (pos.fY < fText->RowCount()) {
490 len = fText->GetLineLength(pos.fY);
491 if (len < 0) len = 0;
492 buf1 = fText->GetLine(pos, len);
493 buf2 =
new char[len + 2];
494 strncpy(buf2, buf1, (UInt_t)len);
497 while (buf2[i] !=
'\0') {
498 if (buf2[i] ==
'\t') {
500 while (buf2[j] == 16)
503 strcpy(buf2+i+1, buf2+j);
507 fwrite(buf2,
sizeof(
char), strlen(buf2)+1, p);
513 gSystem->ClosePipe(p);
515 Bool_t untitled = !strlen(fText->GetFileName()) ? kTRUE : kFALSE;
516 msg.Form(
"Printed: %s\nLines: %ld\nUsing: %s -P%s",
517 untitled ?
"Untitled" : fText->GetFileName(),
518 fText->RowCount() - 1, gPrintCommand, gPrinter);
519 new TGMsgBox(fClient->GetDefaultRoot(),
this,
"Editor", msg.Data(),
520 kMBIconAsterisk, kMBOk, 0);
522 msg.Form(
"Could not execute: %s -P%s\n", gPrintCommand, gPrinter);
523 new TGMsgBox(fClient->GetDefaultRoot(),
this,
"Editor", msg.Data(),
524 kMBIconExclamation, kMBOk, 0);
531 void TGTextEdit::Delete(Option_t *)
533 if (!fIsMarked || fReadOnly) {
537 if (fMarkedStart.fX == fMarkedEnd.fX &&
538 fMarkedStart.fY == fMarkedEnd.fY) {
539 Long_t len = fText->GetLineLength(fCurrent.fY);
541 if (fCurrent.fY == fText->RowCount()-1 && fCurrent.fX == len) {
546 new TDelCharCom(
this);
550 TGLongPosition pos, endPos;
551 Bool_t delast = kFALSE;
553 endPos.fX = fMarkedEnd.fX - 1;
554 endPos.fY = fMarkedEnd.fY;
556 if (endPos.fX == -1) {
564 endPos.fX = fText->GetLineLength(endPos.fY);
572 TDelTextCom *dcom =
new TDelTextCom(
this, fClipText);
573 dcom->SetPos(fMarkedStart);
574 dcom->SetEndPos(endPos);
576 if (delast || ((fText->GetLineLength(endPos.fY) == endPos.fX+1) &&
577 (fClipText->RowCount() > 1))) {
578 TGLongPosition p = endPos;
583 dcom->SetBreakLine(kTRUE);
586 fText->DelText(fMarkedStart, endPos);
588 pos.fY = ToObjYCoord(fVisible.fY);
590 if (fMarkedStart.fY < pos.fY) {
591 pos.fY = fMarkedStart.fY;
593 pos.fX = ToObjXCoord(fVisible.fX, pos.fY);
594 if (fMarkedStart.fX < pos.fX) {
595 pos.fX = fMarkedStart.fX;
598 Int_t th = (Int_t)ToScrYCoord(fText->RowCount());
599 Int_t ys = (Int_t)ToScrYCoord(fMarkedStart.fY);
600 th = th < 0 ? 0 : th;
601 ys = ys < 0 ? 0 : ys;
604 if ((th < 0) || (th < (Int_t)fCanvas->GetHeight())) {
605 gVirtualX->ClearArea(fCanvas->GetId(), 0, ys,
606 fCanvas->GetWidth(), fCanvas->GetHeight() - ys);
609 UpdateRegion(0, ys, fCanvas->GetWidth(), UInt_t(fCanvas->GetHeight() - ys));
611 SetVsbPosition((ToScrYCoord(pos.fY) + fVisible.fY)/fScrollVal.fY);
612 SetHsbPosition((ToScrXCoord(pos.fX, pos.fY) + fVisible.fX)/fScrollVal.fX);
613 SetSBRange(kHorizontal);
614 SetSBRange(kVertical);
615 SetCurrent(fMarkedStart);
617 SendMessage(fMsgWindow, MK_MSG(kC_TEXTVIEW, kTXT_ISMARKED), fWidgetId, kFALSE);
622 if (fText->RowCount() == 1 && fText->GetLineLength(0) == 0) {
624 fText =
new TGText();
633 Bool_t TGTextEdit::Search(
const char *
string, Bool_t direction,
634 Bool_t caseSensitive)
636 if (!IsMapped())
return kFALSE;
638 if (gTQSender && (gTQSender == TGSearchDialog::SearchDialog())) {
639 caseSensitive = TGSearchDialog::SearchDialog()->GetType()->fCaseSensitive;
640 direction = TGSearchDialog::SearchDialog()->GetType()->fDirection;
641 fSearch = TGSearchDialog::SearchDialog()->GetType();
645 if (!fText->Search(&pos, fCurrent,
string, direction, caseSensitive)) {
649 if (!fText->Search(&pos, fCurrent,
string, direction, caseSensitive)) {
651 msg.Form(
"Couldn't find \"%s\"",
string);
653 new TGMsgBox(fClient->GetDefaultRoot(), fCanvas,
"TextEdit",
654 msg.Data(), kMBIconExclamation, kMBOk, 0);
661 fMarkedStart.fY = fMarkedEnd.fY = pos.fY;
662 fMarkedStart.fX = pos.fX;
663 fMarkedEnd.fX = fMarkedStart.fX + strlen(
string);
666 SetCurrent(fMarkedEnd);
668 SetCurrent(fMarkedStart);
671 pos.fY = ToObjYCoord(fVisible.fY);
672 if (fCurrent.fY < pos.fY ||
673 ToScrYCoord(fCurrent.fY) >= (Int_t)fCanvas->GetHeight()) {
674 pos.fY = fMarkedStart.fY;
676 pos.fX = ToObjXCoord(fVisible.fX, pos.fY);
678 if (fCurrent.fX < pos.fX ||
679 ToScrXCoord(fCurrent.fX, pos.fY) >= (Int_t)fCanvas->GetWidth()) {
680 pos.fX = fMarkedStart.fX;
683 SetVsbPosition((ToScrYCoord(pos.fY)+fVisible.fY)/fScrollVal.fY);
684 SetHsbPosition((ToScrXCoord(pos.fX, pos.fY)+fVisible.fX)/fScrollVal.fX);
686 UpdateRegion(0, (Int_t)ToScrYCoord(fMarkedStart.fY), fCanvas->GetWidth(),
687 UInt_t(ToScrYCoord(fMarkedEnd.fY+1)-ToScrYCoord(fMarkedEnd.fY)));
695 Bool_t TGTextEdit::Replace(TGLongPosition textPos,
const char *oldText,
696 const char *newText, Bool_t direction, Bool_t caseSensitive)
699 if (!fText->Replace(textPos, oldText, newText, direction, caseSensitive)) {
704 fMarkedStart.fY = fMarkedEnd.fY = textPos.fY;
705 fMarkedStart.fX = textPos.fX;
706 fMarkedEnd.fX = fMarkedStart.fX + strlen(newText);
709 SetCurrent(fMarkedEnd);
711 SetCurrent(fMarkedStart);
714 pos.fY = ToObjYCoord(fVisible.fY);
715 if (fCurrent.fY < pos.fY ||
716 ToScrYCoord(fCurrent.fY) >= (Int_t)fCanvas->GetHeight()) {
717 pos.fY = fMarkedStart.fY;
719 pos.fX = ToObjXCoord(fVisible.fX, pos.fY);
720 if (fCurrent.fX < pos.fX ||
721 ToScrXCoord(fCurrent.fX, pos.fY) >= (Int_t)fCanvas->GetWidth()) {
722 pos.fX = fMarkedStart.fX;
725 SetVsbPosition((ToScrYCoord(pos.fY)+fVisible.fY)/fScrollVal.fY);
726 SetHsbPosition((ToScrXCoord(pos.fX, pos.fY)+fVisible.fX)/fScrollVal.fX);
728 UpdateRegion(0, (Int_t)ToScrYCoord(fMarkedStart.fY), fCanvas->GetWidth(),
729 UInt_t(ToScrYCoord(fMarkedEnd.fY+1)-ToScrYCoord(fMarkedEnd.fY)));
737 Bool_t TGTextEdit::Goto(Long_t line, Long_t column)
741 if (line >= fText->RowCount())
742 line = fText->RowCount() - 1;
745 if (column > fText->GetLineLength(line))
746 column = fText->GetLineLength(line);
748 TGLongPosition gotopos, pos;
753 pos.fY = ToObjYCoord(fVisible.fY);
754 if (fCurrent.fY < pos.fY ||
755 ToScrYCoord(fCurrent.fY) >= (Int_t)fCanvas->GetHeight())
758 SetVsbPosition((ToScrYCoord(pos.fY)+fVisible.fY)/fScrollVal.fY);
763 fMarkedStart.fY = fMarkedEnd.fY = line;
765 fMarkedEnd.fX = fCanvas->GetWidth();
773 void TGTextEdit::SetInsertMode(EInsertMode mode)
775 if (fInsertMode == mode)
return;
783 void TGTextEdit::CursorOff()
785 if (fCursorState == 1) {
794 void TGTextEdit::CursorOn()
807 void TGTextEdit::SetCurrent(TGLongPosition new_coord)
811 fCurrent.fY = new_coord.fY;
812 fCurrent.fX = new_coord.fX;
816 SendMessage(fMsgWindow, MK_MSG(kC_TEXTVIEW, kTXT_DATACHANGE), fWidgetId, 0);
823 void TGTextEdit::DrawCursor(Int_t mode)
827 if (fCurrent.fY >= fText->RowCount() || fCurrent.fX > fText->GetLineLength(fCurrent.fY) || fReadOnly) {
831 if (fCurrent.fY >= ToObjYCoord(fVisible.fY) &&
832 fCurrent.fY <= ToObjYCoord(fVisible.fY+fCanvas->GetHeight()) &&
833 fCurrent.fX >= ToObjXCoord(fVisible.fX, fCurrent.fY) &&
834 fCurrent.fX <= ToObjXCoord(fVisible.fX+fCanvas->GetWidth(),fCurrent.fY)) {
835 if (fCurrent.fY < fText->RowCount()) {
836 count = fText->GetChar(fCurrent);
838 if (count == -1 || count ==
'\t') {
845 if (fIsMarked && count != -1) {
846 if ((fCurrent.fY > fMarkedStart.fY && fCurrent.fY < fMarkedEnd.fY) ||
847 (fCurrent.fY == fMarkedStart.fY && fCurrent.fX >= fMarkedStart.fX &&
848 fCurrent.fY < fMarkedEnd.fY) ||
849 (fCurrent.fY == fMarkedEnd.fY && fCurrent.fX < fMarkedEnd.fX &&
850 fCurrent.fY > fMarkedStart.fY) ||
851 (fCurrent.fY == fMarkedStart.fY && fCurrent.fY == fMarkedEnd.fY &&
852 fCurrent.fX >= fMarkedStart.fX && fCurrent.fX < fMarkedEnd.fX &&
853 fMarkedStart.fX != fMarkedEnd.fX)) {
855 gVirtualX->FillRectangle(fCanvas->GetId(), fSelbackGC(),
856 Int_t(ToScrXCoord(fCurrent.fX, fCurrent.fY)),
857 Int_t(ToScrYCoord(fCurrent.fY)),
858 UInt_t(ToScrXCoord(fCurrent.fX+1, fCurrent.fY) -
859 ToScrXCoord(fCurrent.fX, fCurrent.fY)),
860 UInt_t(ToScrYCoord(fCurrent.fY+1)-ToScrYCoord(fCurrent.fY)));
862 gVirtualX->DrawString(fCanvas->GetId(), fSelGC(), (Int_t)ToScrXCoord(fCurrent.fX,fCurrent.fY),
863 Int_t(ToScrYCoord(fCurrent.fY+1) - fMaxDescent), &cursor, 1);
865 gVirtualX->ClearArea(fCanvas->GetId(),
866 Int_t(ToScrXCoord(fCurrent.fX, fCurrent.fY)),
867 Int_t(ToScrYCoord(fCurrent.fY)),
868 UInt_t(ToScrXCoord(fCurrent.fX+1, fCurrent.fY) -
869 ToScrXCoord(fCurrent.fX, fCurrent.fY)),
870 UInt_t(ToScrYCoord(fCurrent.fY+1)-ToScrYCoord(fCurrent.fY)));
872 gVirtualX->DrawString(fCanvas->GetId(), fNormGC(), (Int_t)ToScrXCoord(fCurrent.fX,fCurrent.fY),
873 Int_t(ToScrYCoord(fCurrent.fY+1) - fMaxDescent), &cursor, 1);
876 gVirtualX->ClearArea(fCanvas->GetId(),
877 Int_t(ToScrXCoord(fCurrent.fX, fCurrent.fY)),
878 Int_t(ToScrYCoord(fCurrent.fY)),
879 UInt_t(ToScrXCoord(fCurrent.fX+1, fCurrent.fY) -
880 ToScrXCoord(fCurrent.fX, fCurrent.fY)),
881 UInt_t(ToScrYCoord(fCurrent.fY+1)-ToScrYCoord(fCurrent.fY)));
882 gVirtualX->DrawString(fCanvas->GetId(), fNormGC(), (Int_t)ToScrXCoord(fCurrent.fX,fCurrent.fY),
883 Int_t(ToScrYCoord(fCurrent.fY+1) - fMaxDescent), &cursor, 1);
887 gVirtualX->FillRectangle(fCanvas->GetId(), fCursor1GC,
888 Int_t(ToScrXCoord(fCurrent.fX, fCurrent.fY)),
889 Int_t(ToScrYCoord(fCurrent.fY)),
891 UInt_t(ToScrYCoord(fCurrent.fY+1)-ToScrYCoord(fCurrent.fY)));
900 void TGTextEdit::AdjustPos()
903 pos.fY = fCurrent.fY;
904 pos.fX = fCurrent.fX;
906 if (pos.fY < ToObjYCoord(fVisible.fY)) {
907 pos.fY = ToObjYCoord(fVisible.fY);
908 }
else if (ToScrYCoord(pos.fY+1) >= (Int_t) fCanvas->GetHeight()) {
909 pos.fY = ToObjYCoord(fVisible.fY + fCanvas->GetHeight())-1;
911 if (pos.fX < ToObjXCoord(fVisible.fX, pos.fY)) {
912 pos.fX = ToObjXCoord(fVisible.fX, pos.fY);
913 }
else if (ToScrXCoord(pos.fX, pos.fY) >= (Int_t) fCanvas->GetWidth()) {
914 pos.fX = ToObjXCoord(fVisible.fX + fCanvas->GetWidth(), pos.fY)-1;
916 if (pos.fY != fCurrent.fY || pos.fX != fCurrent.fX) {
924 Bool_t TGTextEdit::HandleTimer(TTimer *t)
926 if (t != fCurBlink) {
927 TGTextView::HandleTimer(t);
931 if (fCursorState == 1) {
937 DrawCursor(fCursorState);
945 Bool_t TGTextEdit::HandleSelection(Event_t *event)
950 gVirtualX->GetPasteBuffer((Window_t)event->fUser[0], (Atom_t)event->fUser[3],
951 data, nchar, kFALSE);
953 if (!nchar)
return kTRUE;
957 fClipText =
new TGText;
958 fClipText->LoadBuffer(data.Data());
960 TGLongPosition start_src, end_src, pos;
963 start_src.fY = start_src.fX = 0;
964 end_src.fY = fClipText->RowCount()-1;
965 end_src.fX = fClipText->GetLineLength(end_src.fY)-1;
967 if (end_src.fX < 0) {
972 TInsTextCom *icom =
new TInsTextCom(
this);
973 icom->fChar = fText->GetChar(fCurrent);
974 fText->InsText(fCurrent, fClipText, start_src, end_src);
978 fExposedRegion.fX = 0;
979 fExposedRegion.fY = ToScrYCoord(fCurrent.fY);
981 pos.fY = fCurrent.fY + fClipText->RowCount()-1;
982 pos.fX = fClipText->GetLineLength(fClipText->RowCount()-1);
984 if (start_src.fY == end_src.fY) {
985 pos.fX = pos.fX + fCurrent.fX;
988 icom->SetEndPos(pos);
991 fExposedRegion.fW = fCanvas->GetWidth();
992 fExposedRegion.fH = fCanvas->GetHeight() - fExposedRegion.fY;
996 if (ToScrYCoord(pos.fY) >= (Int_t)fCanvas->GetHeight()) {
997 pos.fY = ToScrYCoord(pos.fY) + fVisible.fY - fCanvas->GetHeight()/2;
998 fExposedRegion.fX = fExposedRegion.fY = 0;
999 fExposedRegion.fH = fCanvas->GetHeight();
1001 pos.fY = fVisible.fY;
1003 if (ToScrXCoord(pos.fX, fCurrent.fY) >= (Int_t) fCanvas->GetWidth()) {
1004 pos.fX = ToScrXCoord(pos.fX, fCurrent.fY) + fVisible.fX + fCanvas->GetWidth()/2;
1005 }
else if (ToScrXCoord(pos.fX, fCurrent.fY < 0) && pos.fX != 0) {
1006 if (fVisible.fX - (Int_t)fCanvas->GetWidth()/2 > 0) {
1007 pos.fX = fVisible.fX - fCanvas->GetWidth()/2;
1012 pos.fX = fVisible.fX;
1015 SetSBRange(kHorizontal);
1016 SetSBRange(kVertical);
1017 SetVsbPosition(pos.fY/fScrollVal.fY);
1018 SetHsbPosition(pos.fX/fScrollVal.fX);
1020 fClient->NeedRedraw(
this);
1025 static Bool_t gDbl_clk = kFALSE;
1026 static Bool_t gTrpl_clk = kFALSE;
1031 Bool_t TGTextEdit::HandleButton(Event_t *event)
1033 if (event->fWindow != fCanvas->GetId()) {
1039 TGTextView::HandleButton(event);
1041 if (event->fType == kButtonPress) {
1045 if (event->fCode == kButton1 || event->fCode == kButton2) {
1046 pos.fY = ToObjYCoord(fVisible.fY + event->fY);
1047 if (pos.fY >= fText->RowCount()) {
1048 pos.fY = fText->RowCount()-1;
1050 pos.fX = ToObjXCoord(fVisible.fX+event->fX, pos.fY);
1051 if (pos.fX >= fText->GetLineLength(pos.fY)) {
1052 pos.fX = fText->GetLineLength(pos.fY);
1054 while (fText->GetChar(pos) == 16) {
1060 TGTextLine *line = fText->GetCurrentLine();
1061 char *word = line->GetWord(pos.fX);
1062 Clicked((
const char*)word);
1065 if (event->fCode == kButton2) {
1066 if (gVirtualX->GetPrimarySelectionOwner() != kNone) {
1067 gVirtualX->ConvertPrimarySelection(fId, fClipboard, event->fTime);
1072 if (event->fCode == kButton3) {
1074 if (fClient->IsEditable() || !fEnableMenu) {
1078 fMenu->PlaceMenu(event->fXRoot, event->fYRoot, kTRUE, kTRUE);
1090 Bool_t TGTextEdit::HandleDoubleClick(Event_t *event)
1092 if (event->fWindow != fCanvas->GetId()) {
1096 if (event->fCode != kButton1) {
1099 if (!fText->GetCurrentLine()->GetText()) {
1105 pos.fY = ToObjYCoord(fVisible.fY + event->fY);
1107 if (gDbl_clk && (event->fTime - fgLastClick < 350)) {
1108 fgLastClick =
event->fTime;
1111 fMarkedStart.fY = fMarkedEnd.fY = pos.fY;
1113 fMarkedStart.fX = 0;
1114 fMarkedEnd.fX = strlen(fText->GetCurrentLine()->GetText());
1116 UpdateRegion(0, (Int_t)ToScrYCoord(fMarkedStart.fY), fCanvas->GetWidth(),
1117 UInt_t(ToScrYCoord(fMarkedEnd.fY + 1) - ToScrYCoord(fMarkedStart.fY)));
1121 if (gTrpl_clk && (event->fTime - fgLastClick < 350)) {
1122 fgLastClick =
event->fTime;
1125 fMarkedStart.fY = 0;
1126 fMarkedStart.fX = 0;
1127 fMarkedEnd.fY = fText->RowCount()-1;
1128 fMarkedEnd.fX = fText->GetLineLength(fMarkedEnd.fY);
1129 if (fMarkedEnd.fX < 0) {
1132 UpdateRegion(0, 0, fCanvas->GetWidth(), fCanvas->GetHeight());
1139 if (pos.fY >= fText->RowCount()) {
1140 pos.fY = fText->RowCount() - 1;
1142 pos.fX = ToObjXCoord(fVisible.fX + event->fX, pos.fY);
1144 if (pos.fX >= fText->GetLineLength(pos.fY)) {
1145 pos.fX = fText->GetLineLength(pos.fY);
1147 while (fText->GetChar(pos) == 16) {
1153 fMarkedStart.fY = fMarkedEnd.fY = pos.fY;
1154 char *line = fText->GetCurrentLine()->GetText();
1155 UInt_t len = (UInt_t)fText->GetCurrentLine()->GetLineLength();
1156 Int_t start = pos.fX;
1160 if (line[i] ==
' ' || line[i] ==
'\t') {
1161 while (start >= 0) {
1162 if (line[start] ==
' ' || line[start] ==
'\t') --start;
1166 while (end < (Int_t)len) {
1167 if (line[end] ==
' ' || line[end] ==
'\t') ++end;
1170 }
else if (isalnum(line[i])) {
1171 while (start >= 0) {
1172 if (isalnum(line[start])) --start;
1176 while (end < (Int_t)len) {
1177 if (isalnum(line[end])) ++end;
1181 while (start >= 0) {
1182 if (isalnum(line[start]) || line[start] ==
' ' || line[start] ==
'\t') {
1189 while (end < (Int_t)len) {
1190 if (isalnum(line[end]) || line[end] ==
' ' || line[end] ==
'\t') {
1198 fMarkedStart.fX = start;
1200 fMarkedEnd.fX = end;
1204 char *word =
new char[len + 1];
1206 strncpy(word, line+start, (UInt_t)len);
1207 DoubleClicked((
const char *)word);
1212 UpdateRegion(0, (Int_t)ToScrYCoord(fMarkedStart.fY), fCanvas->GetWidth(),
1213 UInt_t(ToScrYCoord(fMarkedEnd.fY + 1) - ToScrYCoord(fMarkedStart.fY)));
1221 Bool_t TGTextEdit::HandleMotion(Event_t *event)
1224 if (event->fWindow != fCanvas->GetId()) {
1228 if (fScrolling == -1) {
1229 pos.fY = ToObjYCoord(fVisible.fY+event->fY);
1230 if (pos.fY >= fText->RowCount()) {
1231 pos.fY = fText->RowCount()-1;
1233 pos.fX = ToObjXCoord(fVisible.fX+event->fX, pos.fY);
1234 if (pos.fX > fText->GetLineLength(pos.fY)) {
1235 pos.fX = fText->GetLineLength(pos.fY);
1237 if (fText->GetChar(pos) == 16) {
1238 if (pos.fX < fCurrent.fX) {
1239 pos.fX = fCurrent.fX;
1241 if (pos.fX > fCurrent.fX) {
1244 }
while (fText->GetChar(pos) == 16);
1247 event->fY = (Int_t)ToScrYCoord(pos.fY);
1248 event->fX = (Int_t)ToScrXCoord(pos.fX, pos.fY);
1249 if (pos.fY != fCurrent.fY || pos.fX != fCurrent.fX) {
1250 TGTextView::HandleMotion(event);
1261 Bool_t TGTextEdit::HandleKey(Event_t *event)
1263 Bool_t mark_ok = kFALSE;
1268 if (event->fType == kGKeyPress) {
1269 gVirtualX->LookupString(event, input,
sizeof(input), keysym);
1274 switch ((EKeySym)keysym) {
1281 case kKey_ScrollLock:
1286 if (event->fState & kKeyControlMask) {
1287 switch((EKeySym)keysym & ~0x20) {
1302 Long_t len = fText->GetLineLength(fCurrent.fY);
1303 if (fCurrent.fY == fText->RowCount()-1 && fCurrent.fX == len) {
1308 new TDelCharCom(
this);
1316 if (fCurrent.fX || fCurrent.fY)
new TDelCharCom(
this);
1317 else gVirtualX->Bell(0);
1322 Mark(fCurrent.fX, fCurrent.fY);
1328 fMarkedStart.fY = fMarkedEnd.fY = fCurrent.fY;
1329 fMarkedStart.fX = fMarkedEnd.fX = fCurrent.fX;
1332 Mark(fCurrent.fX, fCurrent.fY);
1350 Long_t ret = fCurrent.fY+1;
1351 new TGGotoDialog(fClient->GetDefaultRoot(),
this, 400, 150, &ret);
1371 pos.fY = fText->RowCount()-1;
1372 pos.fX = fText->GetLineLength(pos.fY);
1373 if (fVsb && fVsb->IsMapped())
1374 SetVsbPosition((ToScrYCoord(pos.fY)+fVisible.fY)/fScrollVal.fY);
1382 if (n && keysym >= 32 && keysym < 127 &&
1383 !(event->fState & kKeyControlMask) &&
1384 (EKeySym)keysym != kKey_Delete &&
1385 (EKeySym)keysym != kKey_Backspace) {
1390 new TInsCharCom(
this, input[0]);
1394 switch ((EKeySym)keysym) {
1397 SendMessage(fMsgWindow, MK_MSG(kC_TEXTVIEW, kTXT_F3), fWidgetId,
1400 if (fMenu->IsEntryEnabled(kM_SEARCH_FINDAGAIN)) {
1401 SendMessage(
this, MK_MSG(kC_COMMAND, kCM_MENU),
1402 kM_SEARCH_FINDAGAIN, 0);
1410 Long_t len = fText->GetLineLength(fCurrent.fY);
1411 if (fCurrent.fY == fText->RowCount()-1 && fCurrent.fX == len) {
1416 new TDelCharCom(
this);
1421 new TBreakLineCom(
this);
1424 new TInsCharCom(
this,
'\t');
1426 case kKey_Backspace:
1430 if (fCurrent.fX || fCurrent.fY) {
1431 new TDelCharCom(
this);
1470 SetInsertMode(GetInsertMode() == kInsert ? kReplace : kInsert);
1476 if ((event->fState & kKeyShiftMask) && mark_ok) {
1478 Mark(fCurrent.fX, fCurrent.fY);
1480 SendMessage(fMsgWindow, MK_MSG(kC_TEXTVIEW, kTXT_ISMARKED), fWidgetId,
1485 SendMessage(fMsgWindow, MK_MSG(kC_TEXTVIEW, kTXT_ISMARKED),
1487 fMarkedStart.fY = fMarkedEnd.fY = fCurrent.fY;
1488 fMarkedStart.fX = fMarkedEnd.fX = fCurrent.fX;
1497 Bool_t TGTextEdit::HandleCrossing(Event_t *event)
1499 if (event->fWindow != fCanvas->GetId()) {
1502 if (gVirtualX->GetInputFocus() != fCanvas->GetId()) {
1503 if (event->fType == kEnterNotify) {
1505 fCurBlink =
new TViewTimer(
this, 500);
1508 gSystem->AddTimer(fCurBlink);
1510 if (fCurBlink) fCurBlink->Remove();
1511 if (!fEnableCursorWithoutFocus && (fCursorState == 1)) {
1514 }
else if (fCursorState == 2) {
1521 TGTextView::HandleCrossing(event);
1529 Bool_t TGTextEdit::HandleFocusChange(Event_t *event)
1531 if (event->fWindow != fCanvas->GetId()) {
1536 if ((event->fCode == kNotifyNormal) && (
event->fState != kNotifyPointer)) {
1537 if (event->fType == kFocusIn) {
1539 fCurBlink =
new TViewTimer(
this, 500);
1542 gSystem->AddTimer(fCurBlink);
1544 if (fCurBlink) fCurBlink->Remove();
1545 if (fCursorState == 2) {
1550 fClient->NeedRedraw(
this);
1558 void TGTextEdit::Search(Bool_t close)
1560 static TGSearchType *srch = 0;
1563 if (!srch) srch =
new TGSearchType;
1564 srch->fClose = close;
1567 if (!TGSearchDialog::SearchDialog()) {
1568 TGSearchDialog::SearchDialog() =
new TGSearchDialog(fClient->GetDefaultRoot(),
1569 fCanvas, 400, 150, srch, &ret);
1571 TGSearchDialog::SearchDialog()->Connect(
"TextEntered(char *)",
"TGTextEdit",
1572 this,
"Search(char *,Bool_t,Bool_t)");
1573 TGSearchDialog::SearchDialog()->MapRaised();
1575 new TGSearchDialog(fClient->GetDefaultRoot(), fCanvas, 400, 150, srch, &ret);
1577 Search(srch->fBuffer);
1585 Bool_t TGTextEdit::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
1588 TGTextView::ProcessMessage(msg, parm1, parm2);
1590 switch(GET_MSG(msg)) {
1592 switch(GET_SUBMSG(msg)) {
1600 Bool_t untitled = !strlen(fText->GetFileName()) ? kTRUE : kFALSE;
1602 msg2.Form(
"Save \"%s\"?",
1603 untitled ?
"Untitled" : fText->GetFileName());
1604 new TGMsgBox(fClient->GetDefaultRoot(),
this,
"Editor",
1605 msg2.Data(), kMBIconExclamation,
1606 kMBYes | kMBNo | kMBCancel, &retval);
1608 if (retval == kMBCancel)
1610 if (retval == kMBYes)
1615 if (parm1 == kM_FILE_CLOSE) {
1616 SendMessage(fMsgWindow, MK_MSG(kC_TEXTVIEW, kTXT_CLOSE),
1620 if (parm1 == kM_FILE_OPEN) {
1622 fi.fFileTypes = gFiletypes;
1623 new TGFileDialog(fClient->GetDefaultRoot(),
this, kFDOpen, &fi);
1624 if (fi.fFilename && strlen(fi.fFilename)) {
1625 LoadFile(fi.fFilename);
1626 SendMessage(fMsgWindow, MK_MSG(kC_TEXTVIEW, kTXT_OPEN),
1634 SendMessage(fMsgWindow, MK_MSG(kC_TEXTVIEW, kTXT_SAVE),
1639 case kM_FILE_SAVEAS:
1640 if (SaveFile(0, kTRUE)) {
1641 SendMessage(fMsgWindow, MK_MSG(kC_TEXTVIEW, kTXT_SAVE),
1650 gPrinter = StrDup(
"892_2_cor");
1651 gPrintCommand = StrDup(
"xprint");
1653 new TGPrintDialog(fClient->GetDefaultRoot(),
this, 400, 150,
1654 &gPrinter, &gPrintCommand, &ret);
1668 case kM_EDIT_SELECTALL:
1671 case kM_SEARCH_FIND:
1676 case kM_SEARCH_FINDAGAIN:
1678 SendMessage(
this, MK_MSG(kC_COMMAND, kCM_MENU),
1682 if (!Search(fSearch->fBuffer, fSearch->fDirection,
1683 fSearch->fCaseSensitive)) {
1684 msg2.Form(
"Couldn't find \"%s\"", fSearch->fBuffer);
1685 new TGMsgBox(fClient->GetDefaultRoot(),
this,
"Editor",
1686 msg2.Data(), kMBIconExclamation, kMBOk, 0);
1689 case kM_SEARCH_GOTO:
1691 Long_t ret = fCurrent.fY+1;
1692 new TGGotoDialog(fClient->GetDefaultRoot(),
this, 400, 150, &ret);
1700 printf(
"No action implemented for menu id %ld\n", parm1);
1717 void TGTextEdit::InsChar(
char character)
1719 if (fReadOnly)
return;
1721 char *charstring = 0;
1724 if (character ==
'\t') {
1725 pos.fX = fCurrent.fX;
1726 pos.fY = fCurrent.fY;
1727 fText->InsChar(pos,
'\t');
1729 while (pos.fX & 0x7) {
1732 fText->ReTab(pos.fY);
1733 UpdateRegion(0, (Int_t)ToScrYCoord(pos.fY), fCanvas->GetWidth(),
1734 UInt_t(ToScrYCoord(pos.fY+1) - ToScrYCoord(pos.fY)));
1735 SetSBRange(kHorizontal);
1736 if (ToScrXCoord(pos.fX, pos.fY) >= (Int_t)fCanvas->GetWidth()) {
1737 if (pos.fX != fText->GetLineLength(fCurrent.fY)) {
1738 SetHsbPosition((fVisible.fX+fCanvas->GetWidth()/2)/fScrollVal.fX);
1740 SetHsbPosition(fVisible.fX/fScrollVal.fX);
1746 if (fInsertMode == kReplace) {
1748 new TDelCharCom(
this);
1750 fText->InsChar(fCurrent, character);
1751 pos.fX = fCurrent.fX + 1;
1752 pos.fY = fCurrent.fY;
1753 charstring =
new char[2];
1754 charstring[1] =
'\0';
1755 charstring[0] = character;
1757 SetSBRange(kHorizontal);
1758 if (ToScrXCoord(pos.fX, pos.fY) >= (Int_t)fCanvas->GetWidth()) {
1759 if (pos.fX != fText->GetLineLength(fCurrent.fY)) {
1760 SetHsbPosition((fVisible.fX+fCanvas->GetWidth()/2)/fScrollVal.fX);
1762 SetHsbPosition(fVisible.fX/fScrollVal.fX+strlen(charstring));
1765 gVirtualX->DrawString(fCanvas->GetId(), fNormGC(),
1766 (Int_t)ToScrXCoord(fCurrent.fX, fCurrent.fY),
1767 Int_t(ToScrYCoord(fCurrent.fY+1) - fMaxDescent),
1768 charstring, strlen(charstring));
1772 if (TGTextLine *currentLine = fText->GetCurrentLine()) {
1773 const ULong_t lineStart = ToObjXCoord(fVisible.fX, fCurrent.fY);
1774 if (lineStart < currentLine->GetLineLength()) {
1775 const char *textToRender = currentLine->GetText(lineStart, currentLine->GetLineLength() - lineStart);
1777 gVirtualX->ClearArea(fCanvas->GetId(), Int_t(ToScrXCoord(0, fCurrent.fY)),
1778 Int_t(ToScrYCoord(fCurrent.fY)), UInt_t(ToScrXCoord(currentLine->GetLineLength(), fCurrent.fY)),
1779 UInt_t(ToScrYCoord(fCurrent.fY+1)-ToScrYCoord(fCurrent.fY)));
1780 gVirtualX->DrawString(fCanvas->GetId(), fNormGC(), Int_t(ToScrXCoord(0, fCurrent.fY)),
1781 Int_t(ToScrYCoord(fCurrent.fY + 1) - fMaxDescent),
1783 delete [] textToRender;
1787 gVirtualX->CopyArea(fCanvas->GetId(), fCanvas->GetId(), fNormGC(),
1788 (Int_t)ToScrXCoord(fCurrent.fX, fCurrent.fY),
1789 (Int_t)ToScrYCoord(fCurrent.fY), fCanvas->GetWidth(),
1790 UInt_t(ToScrYCoord(fCurrent.fY+1)-ToScrYCoord(fCurrent.fY)),
1791 (Int_t)ToScrXCoord(pos.fX, fCurrent.fY),
1792 (Int_t)ToScrYCoord(fCurrent.fY));
1793 gVirtualX->ClearArea(fCanvas->GetId(),
1794 Int_t(ToScrXCoord(fCurrent.fX, fCurrent.fY)),
1795 Int_t(ToScrYCoord(fCurrent.fY)),
1796 UInt_t(ToScrXCoord(fCurrent.fX+strlen(charstring), fCurrent.fY) -
1797 ToScrXCoord(fCurrent.fX, fCurrent.fY)),
1798 UInt_t(ToScrYCoord(fCurrent.fY+1)-ToScrYCoord(fCurrent.fY)));
1799 gVirtualX->DrawString(fCanvas->GetId(), fNormGC(),
1800 Int_t(ToScrXCoord(fCurrent.fX, fCurrent.fY)),
1801 Int_t(ToScrYCoord(fCurrent.fY+1) - fMaxDescent),
1802 charstring, strlen(charstring));
1806 delete [] charstring;
1813 void TGTextEdit::DelChar()
1820 TGLongPosition pos, pos2;
1823 pos.fY = fCurrent.fY;
1824 pos.fX = fCurrent.fX;
1827 if (fCurrent.fX > 0) {
1828 Int_t y = (Int_t)ToScrYCoord(pos.fY);
1829 h = UInt_t(ToScrYCoord(pos.fY+2) - y);
1833 if (fText->GetChar(pos) == 16) {
1836 fText->DelChar(pos);
1838 }
while (fText->GetChar(pos) !=
'\t');
1841 fText->DelChar(pos);
1843 fText->ReTab(pos.fY);
1844 UpdateRegion(0, y, fCanvas->GetWidth(), h);
1846 pos.fX = fCurrent.fX;
1847 fText->DelChar(pos);
1848 pos.fX = fCurrent.fX - 1;
1850 if (ToScrXCoord(fCurrent.fX-1, fCurrent.fY) < 0) {
1851 SetHsbPosition((fVisible.fX-fCanvas->GetWidth()/2)/fScrollVal.fX);
1853 SetSBRange(kHorizontal);
1854 UpdateRegion(0, y, fCanvas->GetWidth(), h);
1856 if (fCurrent.fY > 0) {
1857 len = fText->GetLineLength(fCurrent.fY);
1859 buffer = fText->GetLine(fCurrent, len);
1861 pos.fX = fText->GetLineLength(fCurrent.fY-1);
1862 fText->InsText(pos, buffer);
1866 pos.fX = fText->GetLineLength(fCurrent.fY-1);
1869 pos2.fY = ToScrYCoord(fCurrent.fY+1);
1870 pos.fY = fCurrent.fY - 1;
1871 fText->DelLine(fCurrent.fY);
1872 len = fText->GetLineLength(fCurrent.fY-1);
1874 if (ToScrXCoord(pos.fX, fCurrent.fY-1) >= (Int_t)fCanvas->GetWidth()) {
1875 SetHsbPosition((ToScrXCoord(pos.fX, pos.fY)+fVisible.fX-fCanvas->GetWidth()/2)/fScrollVal.fX);
1879 UpdateRegion(0, 0, fCanvas->GetWidth(), fCanvas->GetHeight());
1881 h = UInt_t(fCanvas->GetHeight() - ToScrYCoord(fCurrent.fY));
1882 gVirtualX->CopyArea(fCanvas->GetId(), fCanvas->GetId(), fNormGC(), 0,
1883 Int_t(pos2.fY), fWidth, h, 0, (Int_t)ToScrYCoord(fCurrent.fY));
1884 if (ToScrYCoord(pos.fY) < 0) {
1885 SetVsbPosition(fVisible.fY/fScrollVal.fY-1);
1887 UpdateRegion(0, (Int_t)ToScrYCoord(pos.fY), fCanvas->GetWidth(), h);
1889 SetSBRange(kVertical);
1890 SetSBRange(kHorizontal);
1900 void TGTextEdit::BreakLine()
1902 if (fReadOnly)
return;
1905 fText->BreakLine(fCurrent);
1906 if (ToScrYCoord(fCurrent.fY+2) <= (Int_t)fCanvas->GetHeight()) {
1908 UpdateRegion(0, (Int_t)ToScrYCoord(fCurrent.fY + 1), fCanvas->GetWidth(), fCanvas->GetHeight());
1910 gVirtualX->CopyArea(fCanvas->GetId(), fCanvas->GetId(), fNormGC(), 0,
1911 (Int_t)ToScrYCoord(fCurrent.fY+1), fCanvas->GetWidth(),
1912 UInt_t(fCanvas->GetHeight()-(ToScrYCoord(fCurrent.fY+2)-
1913 ToScrYCoord(fCurrent.fY))),
1914 0, (Int_t)ToScrYCoord(fCurrent.fY+2));
1915 UpdateRegion(0, (Int_t)ToScrYCoord(fCurrent.fY), fCanvas->GetWidth(),
1916 UInt_t(ToScrYCoord(fCurrent.fY+2) - ToScrYCoord(fCurrent.fY)));
1918 if (fVisible.fX != 0) {
1921 SetSBRange(kHorizontal);
1922 SetSBRange(kVertical);
1924 SetSBRange(kHorizontal);
1925 SetSBRange(kVertical);
1926 SetVsbPosition(fVisible.fY/fScrollVal.fY + 1);
1927 UpdateRegion(0, (Int_t)ToScrYCoord(fCurrent.fY), fCanvas->GetWidth(),
1928 UInt_t(ToScrYCoord(fCurrent.fY+1) - ToScrYCoord(fCurrent.fY)));
1930 pos.fY = fCurrent.fY+1;
1938 void TGTextEdit::ScrollCanvas(Int_t new_top, Int_t direction)
1942 TGTextView::ScrollCanvas(new_top, direction);
1950 void TGTextEdit::DrawRegion(Int_t x, Int_t y, UInt_t width, UInt_t height)
1954 TGTextView::DrawRegion(x, y, width, height);
1962 void TGTextEdit::PrevChar()
1964 if (fCurrent.fY == 0 && fCurrent.fX == 0) {
1972 pos.fY = fCurrent.fY;
1973 pos.fX = fCurrent.fX;
1974 if (fCurrent.fX > 0) {
1976 while (fText->GetChar(pos) == 16) {
1980 if (ToScrXCoord(pos.fX, pos.fY) < 0) {
1981 if (fVisible.fX-(Int_t)fCanvas->GetWidth()/2 >= 0) {
1982 SetHsbPosition((fVisible.fX-fCanvas->GetWidth()/2)/fScrollVal.fX);
1988 if (fCurrent.fY > 0) {
1989 pos.fY = fCurrent.fY - 1;
1990 len = fText->GetLineLength(pos.fY);
1991 if (ToScrYCoord(fCurrent.fY) <= 0) {
1992 SetVsbPosition(fVisible.fY/fScrollVal.fY-1);
1994 if (ToScrXCoord(len, pos.fY) >= (Int_t)fCanvas->GetWidth()) {
1995 SetHsbPosition((ToScrXCoord(len, pos.fY)+fVisible.fX -
1996 fCanvas->GetWidth()/2)/fScrollVal.fX);
2007 void TGTextEdit::NextChar()
2009 Long_t len = fText->GetLineLength(fCurrent.fY);
2011 if (fCurrent.fY == fText->RowCount()-1 && fCurrent.fX == len) {
2017 pos.fY = fCurrent.fY;
2018 if (fCurrent.fX < len) {
2019 if (fText->GetChar(fCurrent) ==
'\t') {
2020 pos.fX = fCurrent.fX + 8 - (fCurrent.fX & 0x7);
2022 pos.fX = fCurrent.fX + 1;
2025 if (ToScrXCoord(pos.fX, pos.fY) >= (Int_t)fCanvas->GetWidth()) {
2026 SetHsbPosition(fVisible.fX/fScrollVal.fX+(fCanvas->GetWidth()/2)/fScrollVal.fX);
2029 if (fCurrent.fY < fText->RowCount()-1) {
2030 pos.fY = fCurrent.fY + 1;
2031 if (ToScrYCoord(pos.fY+1) >= (Int_t)fCanvas->GetHeight()) {
2032 SetVsbPosition(fVisible.fY/fScrollVal.fY+1);
2044 void TGTextEdit::LineUp()
2048 if (fCurrent.fY > 0) {
2049 pos.fY = fCurrent.fY - 1;
2050 if (ToScrYCoord(fCurrent.fY) <= 0) {
2051 SetVsbPosition(fVisible.fY/fScrollVal.fY-1);
2053 len = fText->GetLineLength(fCurrent.fY-1);
2054 if (fCurrent.fX > len) {
2055 if (ToScrXCoord(len, pos.fY) <= 0) {
2056 if (ToScrXCoord(len, pos.fY) < 0) {
2057 SetHsbPosition(ToScrXCoord(len, pos.fY)+
2058 (fVisible.fX-fCanvas->GetWidth()/2)/fScrollVal.fX);
2065 pos.fX = ToObjXCoord(ToScrXCoord(fCurrent.fX, fCurrent.fY)+fVisible.fX, pos.fY);
2068 while (fText->GetChar(pos) == 16) {
2078 void TGTextEdit::LineDown()
2082 if (fCurrent.fY < fText->RowCount()-1) {
2083 len = fText->GetLineLength(fCurrent.fY+1);
2084 pos.fY = fCurrent.fY + 1;
2085 if (ToScrYCoord(pos.fY+1) > (Int_t)fCanvas->GetHeight()) {
2086 SetVsbPosition(fVisible.fY/fScrollVal.fY+1);
2088 if (fCurrent.fX > len) {
2089 if (ToScrXCoord(len, pos.fY) <= 0) {
2090 if (ToScrXCoord(len, pos.fY) < 0) {
2091 SetHsbPosition((ToScrXCoord(len, pos.fY)+fVisible.fX-fCanvas->GetWidth()/2)/fScrollVal.fX);
2098 pos.fX = ToObjXCoord(ToScrXCoord(fCurrent.fX, fCurrent.fY)+fVisible.fX, pos.fY);
2101 while (fText->GetChar(pos) == 16) {
2111 void TGTextEdit::ScreenUp()
2114 pos.fX = fCurrent.fX;
2115 pos.fY = fCurrent.fY - (ToObjYCoord(fCanvas->GetHeight())-ToObjYCoord(0))-1;
2116 if (fVisible.fY - (Int_t)fCanvas->GetHeight() >= 0) {
2117 SetVsbPosition((fVisible.fY - fCanvas->GetHeight())/fScrollVal.fY);
2122 while (fText->GetChar(pos) == 16) {
2131 void TGTextEdit::ScreenDown()
2134 pos.fX = fCurrent.fX;
2135 pos.fY = fCurrent.fY + (ToObjYCoord(fCanvas->GetHeight()) - ToObjYCoord(0));
2136 Long_t count = fText->RowCount()-1;
2137 if ((Int_t)fCanvas->GetHeight() < ToScrYCoord(count)) {
2138 SetVsbPosition((fVisible.fY+fCanvas->GetHeight())/fScrollVal.fY);
2142 while (fText->GetChar(pos) == 16) {
2151 void TGTextEdit::Home()
2154 pos.fY = fCurrent.fY;
2163 void TGTextEdit::End()
2166 pos.fY = fCurrent.fY;
2167 pos.fX = fText->GetLineLength(pos.fY);
2168 if (ToScrXCoord(pos.fX, pos.fY) >= (Int_t)fCanvas->GetWidth()) {
2169 SetHsbPosition((ToScrXCoord(pos.fX, pos.fY) + fVisible.fX - fCanvas->GetWidth()/2)/fScrollVal.fX);
2177 const TGGC &TGTextEdit::GetCursor0GC()
2180 fgCursor0GC =
new TGGC(GetDefaultSelectedGC());
2181 fgCursor0GC->SetFunction(kGXxor);
2183 return *fgCursor0GC;
2189 const TGGC &TGTextEdit::GetCursor1GC()
2192 fgCursor1GC =
new TGGC(GetDefaultGC());
2193 fgCursor1GC->SetFunction(kGXand);
2195 return *fgCursor1GC;
2201 void TGTextEdit::SavePrimitive(std::ostream &out, Option_t *option )
2204 out <<
" TGTextEdit *";
2205 out << GetName() <<
" = new TGTextEdit(" << fParent->GetName()
2206 <<
"," << GetWidth() <<
"," << GetHeight()
2207 <<
");"<< std::endl;
2208 if (option && strstr(option,
"keep_names"))
2209 out <<
" " << GetName() <<
"->SetName(\"" << GetName() <<
"\");" << std::endl;
2212 out <<
" " << GetName() <<
"->SetReadOnly(kTRUE);" << std::endl;
2215 if (!IsMenuEnabled()) {
2216 out <<
" " << GetName() <<
"->EnableMenu(kFALSE);" << std::endl;
2219 if (fCanvas->GetBackground() != TGFrame::fgWhitePixel) {
2220 out <<
" " << GetName() <<
"->ChangeBackground(" << fCanvas->GetBackground() <<
");" << std::endl;
2223 TGText *txt = GetText();
2224 Bool_t fromfile = strlen(txt->GetFileName()) ? kTRUE : kFALSE;
2228 const char *filename = txt->GetFileName();
2229 fn = gSystem->ExpandPathName(gSystem->UnixPathName(filename));
2231 fn = TString::Format(
"Txt%s", GetName()+5);
2232 txt->Save(fn.Data());
2234 out <<
" " << GetName() <<
"->LoadFile(" << quote << fn.Data() << quote <<
");" << std::endl;