다음 이전 차례

12. 텍스트 widget

텍스트 widget은 여러 줄의 텍스트를 보여주거나 편집할 수 있게 해준다. 여러가지 색이나 글꼴을 원하는 대로 동시에 섞어서 쓸 수 있다. 또한 키입력에 바탕을 둔 많은 수의 Emacs와 호환 텍스트 편집 명령들도 지원한다.

텍스트 widget은 한 단어나 한줄 전체를 선택(select)하는 더블 클릭, 트리플 클릭을 포함해서 완전한 cut-and-paste 기능을 갖고 있다.

12.1 텍스트 상자 만들기와 설정.

텍스트 widget을 만드는 함수는 단 하나뿐이다.

GtkWidget* gtk_text_new (GtkAdjustment *hadj,
                         GtkAdjustment *vadj);

인자들은 현재 widget이 보여주고 있는 텍스트의 위치를 추적할 수 있게 해주는 Adjustment의 포인터이다. 두 인자 중 하나나 둘 모두에 NULL을 넘겨주면 gtk_text_new 함수는 자기 자신의 것을 새로이 만든다.

void gtk_text_set_adjustments (GtkText       *text,
                               GtkAdjustment *hadj,
                               GtkAdjustment *vadj);

위 함수는 아무 때나 텍스트 widget의 수직, 수평 adjustment를 바꿀 수 있게 해준다.

텍스트 위젯은 텍스트의 양이 윈도에 다 출력되기에 너무 길어도 자동적으로 스크롤 바를 만들지는 않는다. 그러므로 우리는 직접 그것들을 만들어서 출력 레이아웃에 추가하여야 한다.

  vscrollbar = gtk_vscrollbar_new (GTK_TEXT(text)->vadj);
  gtk_box_pack_start(GTK_BOX(hbox), vscrollbar, FALSE, FALSE, 0);
  gtk_widget_show (vscrollbar);

위의 코드는 수직 스크롤바를 하나 만들고 이를 텍스트 widget인 text의 수직 adjustment에 붙인다. 그리고는 정상적인 방법대로 box에 넣는다.

텍스트 widget을 사용하는 주된 두가지 길이 있다. 사용자에게 텍스트의 내용을 편집할 수 있게 하거나 또는 사용자에게 여러 줄의 텍스트를 보여주기만 할 수 있다. 이 두가지 모드 사이를 왔다갔다하기 위해서 텍스트 widget은 다음 함수를 갖고 있다.

void gtk_text_set_editable    (GtkText *text,
                               gint    editable);

인자 editable에 TRUE나 FALSE를 주어서 사용자가 텍스트 widget의 내용을 편집 가능, 또는 불가능하도록 만들 수 있다. 텍스트 widget이 편집 가능한 상태면 현재 입력 위치에 커서가 나타난다.

이 두가지 모드에서 텍스트 widget을 쓰는 것은 별다른 제한이 없다. 아무 때나 텍스트 widget의 편집 가능상태를 바꿀 수 있고 아무 때나 텍스트를 입력할 수 있다.

텍스트 widget은 출력 윈도의 한줄에 다 보여질 수 없을 만큼 긴 줄들을 wrapping하는 능력이 있다. 줄이 넘어가는 위치에 있는 단어를 양쪽으로 쪼개는 것이 기본 동작이다. 이는 다음 함수로 바꿀 수 있다.

void gtk_text_set_word_wrap (GtkText *text,
                             gint    word_wrap);

이 함수를 써서 텍스트 widget이 단어를 쪼개지 않고 wrap하도록 지정해 줄 수 있다. 인자 word_wrap는 TRUE나 FALSE의 값을 갖는다.

12.2 텍스트 다루기

텍스트 widget의 입력 포인트는 다음 함수를 이용하여 지정한다.

void gtk_text_set_point (GtkText *text,
                         guint   index);
index가 입력 포인트의 위치이다.

현재 입력 포인트를 구하는 것도 유사하다.

guint gtk_text_get_point (GtkText *text);

위의 두 함수와 같이 쓰면 좋은 함수는

guint gtk_text_get_length (GtkText *text);
이다. 이는 텍스트 widget의 길이를 돌려보낸다. 이 길이는 한 줄의 끝을 나타내는 캐리지-리턴을 포함한 텍스트 안의 모든 캐릭터 숫자이다.

현재 입력 포인트에 텍스트를 넣으려면 텍스트의 색, 바탕색, 글꼴을 지정도 하는 gtk_text_insert 함수를 사용한다.

void gtk_text_insert (GtkText    *text,
                      GdkFont    *font,
                      GdkColor   *fore,
                      GdkColor   *back,
                      const char *chars,
                      gint       length);

색, 바탕색, 글꼴을 지정하는 인자에 NULL을 넣으면 이 전에 쓰인 widget style 내의 값이 이용된다. 인자 length에 -1을 넣으면 주어진 텍스트의 전부가 다 입력된다.

텍스트 widget은 gtk_main 함수 밖에서도 스스로를 동적으로 다시 그리는(redraw) GTK 내에서 몇 안되는 존재이다. 이는 텍스트 widget의 내용을 변경하면 즉시 그 효과가 그대로 나타난다는 의미이다. 이러한 것은 텍스트의 내용을 한꺼번에 여러번 변경하는 경우 바라지 않는 일일 수도 있다. 텍스트 widget이 끊임없이 스스로를 다시 그리는 일 없이 여러번 변경하기 위해서 widget을 그러지 못하도록 임시로 고정해 버릴 수 있다. 그리고 변경이 다 완벽히 끝난 뒤에 다시 widget을 풀어주면 된다.

다음 두 함수로 고정하거나 풀어주는 일을 할 수 있다.

void gtk_text_freeze (GtkText *text);
void gtk_text_thaw   (GtkText *text);         

텍스트는 다음 함수들을 써서 현재 입력 포인트에서 앞쪽으로나 뒷쪽 방향으로 텍스트 widget에서 지워질 수 있다.

gint gtk_text_backward_delete (GtkText *text,
                               guint   nchars);
gint gtk_text_forward_delete  (GtkText *text,
                               guint   nchars);

텍스트 widget의 내용을 꺼내고 싶다면 매크로 GTK_TEXT_INDEX(t, index)가 텍스트 widget tindex 위치의 캐릭터를 꺼낼 수 있게 해준다.

더 많은 양의 텍스트를 한꺼번에 꺼낼려면 다음 함수를 쓴다.

gchar *gtk_editable_get_chars (GtkEditable *editable,
                               gint        start_pos,
                               gint        end_pos);   

이것은 텍스트 widget의 부모 클래스의 함수이다. end_pos의 값이 -1이면 이는 텍스트의 끝을 의미한다. 텍스트의 시작은 0이다.

이 함수는 꺼낼 텍스트를 위한 새로운 메모리 영역을 할당한다. 그러므로 다 이용한 뒤에는 g_free 함수를 호출하여 메모리 영역을 풀어주는 것을 잊지말라.

12.3 키보드 단축키

텍스트 widget은 편집, 이동, 선택(selection)을 위한 미리 지정된 키보드 단축키들을 갖고 있다. 이들은 Control, Alt 키와의 조합이다.

여기에 덧붙여 커서키로 이동할 때 Control를 누르고 있으면 커서가 한 문자 단위가 아니라 한 단어 단위로 움직인다. Shift를 누르고 있으면 커서가 이동한 부분이 자동적으로 선택된다.

이동 단축키

편집 단축키

Selection 단축키


다음 이전 차례