368 lines
12 KiB
Elixir
Raw Permalink Normal View History

2016-11-25 00:33:18 -07:00
------------------------------------------------------------------------
--# Text View/Edit demo
-- see the ~/demos/examples/glade folder for a much smaller and
-- easier to understand version written with the help of Glade!
------------------------------------------------------------------------
object fnt = "Courier 12"
include GtkEngine.e
include GtkFileSelector.e
include GtkFontSelector.e
object current_file = current_dir()
boolean dirty = FALSE
enum NORM, INVERSE, GRNBLK
constant win = create(GtkWindow,
"title=`Simple Text Viewer`,size=600x500,position=1,$destroy=Quit")
constant group = create(GtkAccelGroup)
set(win,"add accel group",group)
constant panel = create(GtkBox,VERTICAL)
add(win,panel)
constant menu = create(GtkMenuBar)
pack(panel,menu)
------------------------------------------------------------------------
-- FILE menu items
------------------------------------------------------------------------
constant menuitem1 = create(GtkMenuItem,"folder#_File"),
filemenu = create(GtkMenu),
fileopen = create(GtkMenuItem,"gtk-open#_Open",_("FOpen"),0,{group,"<Control>o"}),
fileclose = create(GtkMenuItem,"gtk-close#_Close",_("FClose"),0,{group,"<Control>c"}),
filerun = create(GtkMenuItem,"gtk-execute#_Execute",_("FRun"),0,{group,"F5"}),
fileexit = create(GtkMenuItem,"gtk-quit#_Quit",_("Bail"),0,{group,"<Control>q"}),
sep1 = create(GtkSeparatorMenuItem),
sep2 = create(GtkSeparatorMenuItem)
set(filemenu,"append",{fileopen,fileclose,sep1,filerun,sep2,fileexit})
set(menuitem1,"submenu",filemenu)
set(menu,"append",menuitem1)
set(fileclose,"sensitive",FALSE)
set(filerun,"sensitive",FALSE)
------------------------------------------------------------------------
-- PREFS menu items (different way to create menu)
------------------------------------------------------------------------
sequence item = repeat(0,11)
constant menuitem2 = create(GtkMenuItem,"gtk-preferences#_Preferences"),
editmenu = create(GtkMenu)
item[1] = create(GtkMenuItem,"thumbnails/font.png#_Font",_("Font"),0,{group,"<Ctl><Alt>f"})
item[2] = create(GtkSeparatorMenuItem)
item[3] = create(GtkRadioMenuItem,0,"thumbnails/n.png#Normal",_("Colors"),NORM,{group,"<ctl><Alt>n"})
item[4] = create(GtkRadioMenuItem,item[3],"thumbnails/r.png#Reverse",_("Colors"),INVERSE,{group,"<ctl><Alt>r"})
item[5] = create(GtkRadioMenuItem,item[4],"thumbnails/t.png#Green/Black", _("Colors"),GRNBLK,{group,"<ctl><Alt>g"})
item[6] = create(GtkSeparatorMenuItem)
item[7] = create(GtkCheckMenuItem,"gtk-bold#Bold",_("Bold"),0,{group,"<ctl><alt>b"})
item[8] = create(GtkCheckMenuItem,"gtk-italic#Italic",_("Italic"),0,{group,"<ctl><alt>i"})
item[9] = create(GtkCheckMenuItem,"format-text-italic-symbolic#Oblique",_("Oblique"),0,{group,"<ctl><alt>o"})
item[10] = create(GtkSeparatorMenuItem)
-- following item has 2 accelerators:
item[11] = create(GtkCheckMenuItem,"view-wrapped-symbolic#Wrap",_("Wrap"),0,{group,"F6"})
set(item[11],"add accelerator",{group,"<ctl><alt>w"})
add(editmenu,item) -- add all
set(menuitem2,"submenu",editmenu)
set(menu,"append",menuitem2)
constant tips = { -- a different way to manage tooltips;
"Open font dialog",
0,-- no tip for separator lines
"<span color='black' background='white'> Normal colors </span>",
"<span color='white' background='black'> Reversed colors </span>",
"<span color='#0DF517' background='black'> Green text on black </span>",
0,
"<b>bold</b> style",
"<i>italic</i> style",
0,
"Wrap text"
}
for i = 1 to length(tips) do
set(item[i],"tooltip markup",tips[i])
end for
------------------------------------------------------------------------
-- RECENT CHOOSER needs some filtering of results
------------------------------------------------------------------------
constant eu_filter = create(GtkRecentFilter,{
{"name","*.ex"},
{"add pattern","*.e"},
{"add pattern","*.ex"}})
------------------------------------------------------------------------
-- RECENT CHOOSER menu items;
------------------------------------------------------------------------
constant menuitem3 = create(GtkMenuItem,"document-open-recent#_Recent Docs")
set(menuitem3,"tooltip text","List recently accessed documents")
constant rc_menu = create(GtkRecentChooserMenu,{
{"add filter",eu_filter},
{"sort type",GTK_RECENT_SORT_MRU},
{"show icons",TRUE},
{"local only",TRUE},
{"show numbers",TRUE},
{"show tips",TRUE},
{"show not found",FALSE},
$})
connect(rc_menu,"selection-done",_("LoadRecent"))
set(menuitem3,"submenu",rc_menu)
set(menu,"append",menuitem3)
------------------------------------------------------------------------
-- HELP menu items;
------------------------------------------------------------------------
constant show_about = call_back(routine_id("ShowAboutDialog"))
constant menuitem4 = create(GtkMenuItem,"gtk-help#_Help"),
helpmenu = create(GtkMenu),
helpabout = create(GtkMenuItem,"gtk-about#_About",show_about,0,{group,"F1"})
set(helpmenu,"append",helpabout)
set(menuitem4,"submenu",helpmenu)
set(menu,"append",menuitem4)
set(helpabout,"add accelerator",{group,"<ctl>a"})
-------------------------------------------------------------------------
-- REST of INTERFACE
------------------------------------------------------------------------
constant scrolwin = create(GtkScrolledWindow)
pack(panel,scrolwin,TRUE,TRUE)
constant tv = create(GtkTextView,{
{"override color",GTK_STATE_FLAG_SELECTED,"black"},
{"override background color",GTK_STATE_FLAG_SELECTED,"green"},
{"editable",TRUE},
{"font",fnt},
{"left margin",10},
{"right margin",10}})
add(scrolwin,tv)
constant buffer = get(tv,"buffer")
connect(buffer,"changed",_("Dirty"))
constant statbox = create(GtkButtonBox)
set(statbox,"background","black")
constant lc = create(GtkLabel)
add(statbox,lc)
pack(panel,statbox)
show_all(win)
main()
------------------------------------------------------------------------
global function FRun()
------------------------------------------------------------------------
if dirty then
write_file(current_file,get(buffer,"text"),TEXT_MODE)
dirty = FALSE
end if
system("eui " & current_file & " & ",0)
return 1
end function
------------------------------------------------------------------------
function FOpen(atom ctl)
------------------------------------------------------------------------
integer fn,len
object txt
object f = fileselector:Open(current_file)
if string(f) then
current_file = f
set(filerun,"sensitive",TRUE)
-- read the file;
fn = open(f,"r")
txt = read_file(f)
len = length(txt)
set(buffer,"text",txt,len)
-- update file info shown;
set(win,"title",format("[]",{f}))
set(fileopen,"sensitive",FALSE)
set(fileclose,"sensitive",TRUE)
dirty = FALSE
end if
return 1
end function
------------------------------------------------------------------------
function FClose()
------------------------------------------------------------------------
if dirty then
if Warn(win,,"File Modified","Save?",GTK_BUTTONS_YES_NO) = MB_YES then
write_file(current_file,get(buffer,"text"),TEXT_MODE)
end if
end if
current_file = {}
set(buffer,"text"," ",0)
set(lc,"text"," ")
set(win,"title"," ")
set(fileopen,"sensitive",TRUE)
set(fileclose,"sensitive",FALSE)
set(filerun,"sensitive",FALSE)
return 1
end function
------------------------------------------------------------------------
function LoadRecent()
------------------------------------------------------------------------
object txt, name = get(rc_menu,"current uri")
integer len, fn
ifdef UNIX then
name = name[8..$]
elsedef
name = name[9..$]
end ifdef
current_file = name
set(filerun,"sensitive",TRUE)
fn = open(name,"r")
txt = read_file(name)
set(buffer,"text",txt)
set(win,"title",name)
set(fileopen,"sensitive",FALSE)
set(fileclose,"sensitive",TRUE)
set(lc,"text",format("[,,] lines, [,,] chars",
{get(buffer,"line count"),
get(buffer,"char count")}))
dirty = FALSE
return 1
end function
------------------------------------------------------------------------
function Colors(atom ctl, atom x)
------------------------------------------------------------------------
switch x do
case NORM then
set(tv,"background=white,foreground=black")
case INVERSE then
set(tv,"background=black,foreground=white")
case GRNBLK then
set(tv,"background=black,foreground=#0DF517")
end switch
return 1
end function
------------------------------------------------------------------------
function Bold(atom ctl)
------------------------------------------------------------------------
ctl = get(ctl,"active")
atom fd = create(PangoFontDescription,fnt)
integer style = get(fd,"style")
if ctl = 1 then
set(fd,"weight",PANGO_WEIGHT_BOLD)
set(fd,"style",style)
else
set(fd,"weight",PANGO_WEIGHT_NORMAL)
set(fd,"style",style)
end if
fnt = get(fd,"to string")
set(tv,"font",fnt)
return 1
end function
------------------------------------------------------------------------
function Italic(atom ctl)
------------------------------------------------------------------------
ctl = get(ctl,"active")
atom fd = create(PangoFontDescription,fnt)
integer weight = get(fd,"weight")
if ctl = 1 then
set(fd,"style",PANGO_STYLE_ITALIC)
set(fd,"weight",weight)
else
set(fd,"style",PANGO_STYLE_NORMAL)
set(fd,"weight",weight)
end if
fnt = get(fd,"to string")
set(tv,"font",fnt)
return 1
end function
------------------------------------------------------------------------
function Oblique(atom ctl)
------------------------------------------------------------------------
ctl = get(ctl,"active")
atom fd = create(PangoFontDescription,fnt)
integer weight = get(fd,"weight")
if ctl = 1 then
set(fd,"style",PANGO_STYLE_OBLIQUE)
set(fd,"weight",weight)
else
set(fd,"style",PANGO_STYLE_NORMAL)
set(fd,"weight",weight)
end if
fnt = get(fd,"to string")
set(tv,"font",fnt)
return 1
end function
------------------------------------------------------------------------
function Wrap(atom ctl)
------------------------------------------------------------------------
set(tv,"wrap mode",get(ctl,"active")*4) -- i.e. none or word-char
return 1
end function
------------------------------------------------------------------------
function Font()
------------------------------------------------------------------------
fnt = fontselector:Select(fnt)
if string(fnt) then
set(tv,"font",fnt)
set(item[7],"active",match(" bold",lower(fnt)))
set(item[8],"active",match(" italic",lower(fnt)))
set(item[9],"active",match(" oblique",lower(fnt)))
end if
return 1
end function
------------------------------------------------------------------------
function ShowAboutDialog()
------------------------------------------------------------------------
atom dlg = create(GtkAboutDialog,{
{"logo","~/demos/thumbnails/eugtk.png"},
{"copyright",copyright},
{"license",LGPL},
{"license type",GTK_LICENSE_CUSTOM},
{"wrap license",0},
{"website","http://OpenEuphoria.org"},
{"website label","OpenEuphoria.org"},
{"authors",{"Irv Mullins"}},
{"version","A simple text editor\nwritten in Euphoria"}})
get(dlg,"run")
set(dlg,"hide")
return 1
end function
constant show_about_dialog = call_back(routine_id("ShowAboutDialog"))
------------------------------------------------------------------------
function Dirty()
------------------------------------------------------------------------
dirty = TRUE -- when contents changed, also update stats;
set(lc,"text",format("[,,] lines, [,,] chars",
{get(buffer,"line count"),
get(buffer,"char count")}))
return 1
end function
------------------------------------------------------------------------
function Bail()
------------------------------------------------------------------------
if dirty then
if Warn(win,,"File Modified","Save?",GTK_BUTTONS_YES_NO) = MB_YES then
write_file(current_file,get(buffer,"text"),TEXT_MODE)
end if
end if
return Quit()
end function