348 lines
11 KiB
Elixir
348 lines
11 KiB
Elixir
|
|
----------------------------------------------------------------------------------
|
|
--# 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 = `
|
|
<b><u>TextView</u></b> for viewing/editing 'rich text'. Does not <i><u>print</u></i> 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 <span font='Courier bold'>font</span> for selected text")
|
|
set(btn[5],"tooltip markup","Change selected text <span color='red'>color</span>")
|
|
set(btn[6],"tooltip markup","<s>Strikethrough</s> selected text")
|
|
set(btn[7],"tooltip markup","<u>Underline</u> selected text")
|
|
set(btn[8],"tooltip markup","<b>Boldface</b> selected text")
|
|
set(btn[9],"tooltip markup","<i>Italicize</i> selected text")
|
|
set(btn[10],"tooltip markup","Remove <i>all</i> 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
|
|
|
|
|
|
|