---------------------------------------------------------------------------------- --# GtkTextView 'rich text' format ---------------------------------------------------------------------------------- -- There seems to be little need for this sort of widget, since it's easy to use -- html to create basic 'styled' text in a universally understood format, -- and tools such as LibreOffice are much better for creating more complex -- documents. Also, GtkSourceView widget offers automatic color-coding for -- most programming languages with no effort at all. ---------------------------------------------------------------------------------- include GtkEngine.e include GtkPrinter.e include std/wildcard.e include euphoria/keywords.e object txt = read_file(locate_file("test25.ex")) constant fontlist = {"Courier","Arial","Sans","Serif","URW Chancery L","Purisa"} object current_font = "Courier 12" object range = 0 constant docs = ` TextView for viewing/editing 'rich text'. Does not print styled text. ` -- create two special toolbuttons; constant tux = create(GdkPixbuf,"thumbnails/BabyTux.png",20,20) constant img1 = create(GtkImage,tux) constant clown = create(GdkPixbuf,"thumbnails/clown.png",20,20) constant img2 = create(GtkImage,clown) constant win = create(GtkWindow, "size=300x500,border_width=10,position=1,icon_name=gtk-edit,$destroy=Quit") constant panel = create(GtkBox,VERTICAL) add(win,panel) constant lbl = create(GtkLabel) set(lbl,"markup",docs) pack(panel,lbl) constant scrolwin = create(GtkScrolledWindow) pack(panel,scrolwin,1,1) constant scroller = create(GtkViewport) add(scrolwin,scroller) constant tv = create(GtkTextView,{ {"wrap mode",GTK_WRAP_WORD_CHAR}, {"font",current_font}, {"left margin",10}, {"right margin",10}, {"border window size",GTK_TEXT_WINDOW_TOP,10}, {"border window size",GTK_TEXT_WINDOW_BOTTOM,10}, {"connect","button-release-event",_("SaveSelection")}}) add(scroller,tv) constant buffer = get(tv,"buffer") set(buffer,"text",txt) constant tag_tbl = get(buffer,"tag table") -- add a few generic tags that most any editing program would likely use; constant tag_strike = create(GtkTextTag,"strike") set(tag_strike,"strikethrough=TRUE") add(tag_tbl,tag_strike) constant tag_ul = create(GtkTextTag,"underline") set(tag_ul,"underline=TRUE") add(tag_tbl,tag_ul) constant tag_bold = create(GtkTextTag,"bold") set(tag_bold,"weight",PANGO_WEIGHT_BOLD) add(tag_tbl,tag_bold) constant tag_ital = create(GtkTextTag,"italic") set(tag_ital,"style",PANGO_STYLE_ITALIC) add(tag_tbl,tag_ital) constant tag_bi = create(GtkTextTag,"builtin") set(tag_bi,"foreground","green") set(tag_bi,"weight",PANGO_WEIGHT_BOLD) add(tag_tbl,tag_bi) constant tag_kw = create(GtkTextTag,"keyword") set(tag_kw,"foreground","blue") set(tag_kw,"weight",PANGO_WEIGHT_BOLD) add(tag_tbl,tag_kw) constant tag_gtk = create(GtkTextTag,"gtk") set(tag_gtk,"foreground","tomato") set(tag_gtk,"weight",PANGO_WEIGHT_BOLD) add(tag_tbl,tag_gtk) constant tag_widget = create(GtkTextTag,"widget") set(tag_widget,"style",PANGO_STYLE_ITALIC) set(tag_widget,"weight",PANGO_WEIGHT_BOLD) add(tag_tbl,tag_widget) constant tag_str = create(GtkTextTag,"string") set(tag_str,"foreground=lightgreen,background=black") add(tag_tbl,tag_str) constant tag_dlg = create(GtkTextTag,"dialog") set(tag_dlg,"foreground=yellow,background=black,underline=TRUE") set(tag_dlg,"weight",PANGO_WEIGHT_BOLD) add(tag_tbl,tag_dlg) constant tag_comment = create(GtkTextTag,"comment") set(tag_comment,"foreground=red") set(tag_comment,"weight",PANGO_WEIGHT_BOLD) add(tag_tbl,tag_comment) atom getiter = define_proc("gtk_text_buffer_get_iter_at_offset",{P,P,I}), mrk = define_func("gtk_text_mark_new",{S,B},P), amrk = define_proc("gtk_text_buffer_add_mark",{P,P,P}), fwdsrch = define_func("gtk_text_iter_forward_search",{P,S,I,P,P,P},B), fwdct = define_func("gtk_text_iter_forward_chars",{P,I},B), fwdline = define_func("gtk_text_iter_forward_line",{P},B), startsword = define_func("gtk_text_iter_starts_word",{P},B), offset = define_func("gtk_text_iter_get_offset",{P},I), getchar = define_func("gtk_text_iter_get_char",{P},P) object widgetnames = {"GtkEngine.e","GtkPrinter.e","GtkFileSelector.e","GtkFontSelector.e"} for i = 1 to length(widget) do if not atom(widget[i]) then widgetnames = append(widgetnames,widget[i][$]) end if end for Remark() global function Remark() markup(buffer,builtins,tag_bi) markup(buffer,{"create","set","get","add","connect","pack","show","show_all","main"},tag_gtk) markup(buffer,{"Info","Warn","Question","Error"},tag_dlg) markup(buffer,widgetnames,tag_widget) markup(buffer,{"--"},tag_comment) markup(buffer,keywords,tag_kw) markup(buffer,{"constant","boolean"},tag_dlg) return 1 end function procedure markup(atom buffer,object words,object tag) -- apply some basic eu keyword formatting; atom a = allocate(128,1), b = allocate(128,1), c = allocate(128,1) atom iter = allocate(128,1) atom werd atom mk integer firstchar, nextchar integer comment = FALSE for n = 1 to length(words) do comment = equal("--",words[n]) werd = allocate_string(words[n]) c_proc(getiter,{buffer,iter,0}) while c_func(fwdsrch,{iter,werd,0,a,b,0}) = 1 do firstchar = c_func(getchar,{a}) nextchar = c_func(getchar,{b}) mk = c_func(mrk,{0,0}) c_proc(amrk,{buffer,mk,a}) iter = b c = b if comment then c_func(fwdline,{c}) else c_func(fwdct,{c,0}) end if if comment then set(buffer,"apply tag",tag,a,c) end if if find(nextchar," {}()[].,/\n") and c_func(startsword,{a}) then set(buffer,"apply tag",tag,a,c) end if end while end for end procedure constant btnbox1 = create(GtkButtonBox,{ {"layout",GTK_BUTTONBOX_CENTER}, {"homogeneous",FALSE}}) pack(panel,btnbox1) constant btn = { create(GtkToolButton,img2,"Clown"), create(GtkToolButton,"gtk-cut",0,"DeleteText"), create(GtkToolButton,"gtk-print",0,"PrintSelectedText"), create(GtkFontButton,current_font,"SelectFont"), create(GtkToolButton,"gtk-select-color",0,"SelectColor"), create(GtkToolButton,"gtk-strikethrough",0,"ApplyTag",tag_strike), create(GtkToolButton,"gtk-underline",0,"ApplyTag",tag_ul), create(GtkToolButton,"gtk-bold",0,"ApplyTag",tag_bold), create(GtkToolButton,"gtk-italic",0,"ApplyTag",tag_ital), create(GtkToolButton,"gtk-clear",0,"RemoveTags"), create(GtkToolButton,img1,"Tux") } set(btn[1],"tooltip text","Insert a Clown at the cursor") set(btn[2],"tooltip text","Delete selected text") set(btn[3],"tooltip text","Print selected text") set(btn[4],"use font",TRUE) set(btn[4],"filter func",_("FontFilter")) set(btn[4],"tooltip markup","Change font for selected text") set(btn[5],"tooltip markup","Change selected text color") set(btn[6],"tooltip markup","Strikethrough selected text") set(btn[7],"tooltip markup","Underline selected text") set(btn[8],"tooltip markup","Boldface selected text") set(btn[9],"tooltip markup","Italicize selected text") set(btn[10],"tooltip markup","Remove all tags for selected text") set(btn[11],"tooltip text","Insert a Tux at the cursor") connect(btn[1],"clicked","InsertImage",clown) connect(btn[11],"clicked","InsertImage",tux) add(btnbox1,btn) constant dlg = create(GtkColorSelectionDialog,"Choose a color") constant selection = get(dlg,"color selection") connect(buffer,"changed","Remark") show_all(win) main() ------------------------------------------------------------------------ global function SaveSelection() ------------------------------------------------------------------------ range = get(buffer,"selection bounds") return 0 end function ------------------------------------------------------------------------ global function ApplyTag(atom ctl, atom data) ------------------------------------------------------------------------ if sequence(range) then set(buffer,"apply tag",data,range[1],range[2]) end if return 1 end function ------------------------------------------------------------------------ global function RemoveTags(atom ctl) ------------------------------------------------------------------------ if sequence(range) then set(buffer,"remove all tags",range[1],range[2]) end if return 1 end function ------------------------------------------------------------------------ global function FontFilter(atom family, atom face, atom data) ------------------------------------------------------------------------ object name = gtk_str_func("pango_font_family_get_name",{P},{family}) return find(name,fontlist) end function ------------------------------------------------------------------------ global function ApplyFont() ------------------------------------------------------------------------ if sequence(range) then atom anon = create(GtkTextTag) set(tag_tbl,"add",anon) set(anon,"font",current_font) set(buffer,"apply tag",anon,range[1],range[2]) end if range = 0 return 1 end function ------------------------------------------------------------------------ global function SelectFont(atom ctl) ------------------------------------------------------------------------ current_font = get(ctl,"font name") ApplyFont() return 1 end function ------------------------------------------------------------------------ global function SelectColor(atom ctl) ------------------------------------------------------------------------ if sequence(range) then if get(dlg,"run") = MB_OK then object color = get(selection,"current rgba") set(dlg,"hide") atom anon = create(GtkTextTag) set(tag_tbl,"add",anon) set(anon,"foreground",color) ApplyTag(buffer,anon) end if end if return 1 end function ------------------------------------------------------------------------ global function InsertImage(atom ctl, atom img) ------------------------------------------------------------------------ if sequence(range) then set(buffer,"insert pixbuf",range[1],img) end if return 1 end function ------------------------------------------------------------------------ global function DeleteText() ------------------------------------------------------------------------ if sequence(range) then set(buffer,"delete",range[1],range[2]) end if return 1 end function ------------------------------------------------------------------------ global function PrintSelectedText() ------------------------------------------------------------------------ object text = "" if sequence(range) and range[1]!=range[2] then printer:sourcecode = FALSE printer:use_line_numbers = FALSE text = get(buffer,"slice",range[1],range[2]) printer:PrintText("Selected text",text) else text = get(buffer,"text") if length(text) > 0 then printer:PrintText("Text",text) end if end if return 1 end function