#!/usr/bin/scriba
REM ************************************************************************
REM
REM DICT client to lookup words
REM Using the HTML widgets of the Scriptbasic wrapper
REM
REM Expand the GTK namespace if you feel necessary!
REM (c) Peter van Eerten
REM
REM ************************************************************************
REM Import GTK definition first
IMPORT gtk.bas
GLOBAL CONST nl = "\n"
GLOBAL CONST title = "Thesaurus!"
REM Create main window
mainwin = GTK::window(title, 500, 450)
REM Create droplist part
frame1 = GTK::frame(" Servers ", 255, 65)
GTK::attach(frame1, mainwin, 10, 10)
servers[0] = "dict.org"
servers[1] = "dict.aioe.org"
servers[2] = "dict.tugraz.at"
servers[3] = "mova.org"
servers[4] = "dict.tu-chemnitz.de"
servers[5] = "test.dict.org"
servers[6] = "dict.trit.org"
servers[7] = "dict.die.net"
servers[8] = "www.lojban.org"
servers[9] = "dict.arabeyes.org"
servers[10] = "muktaka.dyndns.org"
servers[11] = "dict.saugus.net"
servers[12] = "dictionary.bishopston.net"
servers[13] = "la-sorciere.de"
servers[14] = "es.dict.org"
servers[15] = "lividict.org"
servers[16] = "mali.geekcorps.org"
servers[17] = "dione.zcu.cz"
servers[18] = "dict.kurtwerks.com"
servers[19] = "madison.onespeeddave.com"
drop = GTK::droplist(servers, 165, 35)
GTK::attach(drop, mainwin, 20, 30)
fetch = GTK::button("Fetch", 60, 35)
GTK::attach(fetch, mainwin, 195, 30)
REM Create control panel
frame2 = GTK::frame(" Control ", 210, 65)
GTK::attach(frame2, mainwin, 275, 10)
about = GTK::button("About", 60, 35)
GTK::attach(about, mainwin, 285, 30)
clear = GTK::button("Clear", 60, 35)
GTK::attach(clear, mainwin, 350, 30)
exbut = GTK::button("Exit", 60, 35)
GTK::attach(exbut, mainwin, 415, 30)
REM Create dictionary panel
frame3 = GTK::frame(" Dictionaries ", 480, 125)
GTK::attach(frame3, mainwin, 10, 85)
dat[0] = ""
list = GTK::list(dat, 460, 90)
GTK::attach(list, mainwin, 20, 110)
GTK::bg_color(list, 49152, 49152, 49152)
REM Create text part
frame4 = GTK::frame(" Translation ", 480, 190)
GTK::attach(frame4, mainwin, 10, 220)
text = GTK::text(460, 155)
GTK::attach(text, mainwin, 20, 245)
GTK::disable(text)
GTK::bg_color(text, 49152, 49152, 49152)
REM Create entry and lookup button
entry = GTK::entry(360, 25)
GTK::attach(entry, mainwin, 10, 420)
utf8 = GTK::check("UTF-8", 60, 30)
GTK::attach(utf8, mainwin, 430, 415)
dflt = GTK::check("All", 40, 30)
GTK::attach(dflt, mainwin, 380, 415)
REM Create about window
aboutwin = GTK::window("About", 300, 120)
GTK::hide(aboutwin)
label1 = GTK::label("Demo program with the GTK module.", 280, 20)
GTK::attach(label1, aboutwin, 10, 5)
GTK::fg_color(label1, 32768, 0, 0)
label2 = GTK::label("Using " & GTK::version() & " with Scriptbasic.", 280, 20)
GTK::attach(label2, aboutwin, 10, 25)
GTK::fg_color(label2, 0, 0, 32768)
label3 = GTK::label("(C) Peter van Eerten - February 6, 2006", 280, 20)
GTK::attach(label3, aboutwin, 10, 45)
GTK::fg_color(label3, 0, 32768, 0)
okbut = GTK::button("OK", 60, 35)
GTK::attach(okbut, aboutwin, 120, 80)
REM Mainloop
REPEAT
REM Put focus to entry
GTK::focus(entry)
REM Wait for event
action = GTK::event()
REM Get all dictionaries of server
IF action = fetch THEN CALL Get_Dicts
REM Get meaning of word
IF action = entry THEN CALL Lookup_Word
REM Clear all widgets
IF action = clear THEN CALL Clear_All
REM Show about window
IF action = about THEN GTK::show(aboutwin)
REM Hide about window
IF action = okbut OR action = aboutwin THEN GTK::hide(aboutwin)
UNTIL action = mainwin OR action = exbut
END
REM ************************************************************************
SUB Get_Dicts
LOCAL dat$, total, count
ON ERROR GOTO G_NetError
OPEN GTK::get_text(drop) & ":2628" FOR SOCKET AS 1
PRINT#1,"SHOW DB\n"
LINE INPUT#1, dat$
LINE INPUT#1, dat$
count = 0
WHILE LEFT(dat$, 1) <> "."
LINE INPUT#1, dat$
dat$ = REPLACE(dat$, CHR$(34), CHR$(92) & CHR$(34))
IF LEFT(dat$, 1) <> "." THEN total[count] = TRIM(dat$)
count+=1
WEND
PRINT#1,"QUIT\n"
CLOSE 1
GTK::fg_color(list, 0, 0, 65535)
GTK::set_text(list, total)
EXIT SUB
G_NetError:
dat$[0] = "Server not available!"
GTK::fg_color(list, 65535, 0, 0)
GTK::set_text(list, dat$)
END SUB
REM ************************************************************************
SUB Lookup_Word
LOCAL dict$, dat$, total$, info$
GTK::set_text(mainwin, title & " - \\\"" & GTK::get_text(entry) & "\\\"")
GTK::fg_color(text, 0, 32768, 0)
GTK::set_text(text, "Fetching....")
GTK::async()
ON ERROR GOTO L_NetError
dict$ = LEFT(GTK::get_text(list), INSTR(GTK::get_text(list), " "))
OPEN GTK::get_text(drop) & ":2628" FOR SOCKET AS 1
IF GTK::get_value(dflt) THEN
PRINT#1,"DEFINE * " & GTK::get_text(entry) & "\n"
ELSE
PRINT#1,"DEFINE " & dict$ & " " & GTK::get_text(entry) & "\n"
END IF
REPEAT
LINE INPUT#1, dat$
dat$ = REPLACE(dat$, CHR$(34), CHR$(92) & CHR$(34))
IF LEFT(dat$, 3) = "151" THEN
total$ &= "------------------------------\n"
total$ &= RIGHT(dat$, LEN(dat$) - LEN(GTK::get_text(entry)) - 9)
total$ &= "------------------------------\n"
REPEAT
LINE INPUT#1, info$
info$ = REPLACE(info$, CHR$(34), CHR$(92) & CHR$(34))
IF LEFT(info$, 1) <> "." THEN total$ &= TRIM(info$) & nl
UNTIL LEFT(info$, 1) = "."
total$ &= "\n"
END IF
UNTIL LEFT(dat$, 3) = "250" OR VAL(LEFT(dat$, 3)) > 499
PRINT#1,"QUIT\n"
CLOSE 1
IF LEFT(dat$, 3) = "552" THEN
total$ = "No match found."
GTK::fg_color(text, 65535, 0, 0)
ELSE IF LEFT(dat$, 3) = "501" THEN
total$ = "Select a dictionary first!"
GTK::fg_color(text, 65535, 0, 0)
ELSE IF LEFT(dat$, 3) = "550" THEN
total$ = "Invalid database!"
GTK::fg_color(text, 65535, 0, 0)
ELSE
GTK::fg_color(text, 0, 0, 49152)
END IF
IF GTK::get_value(utf8) THEN
GTK::set_text(text, GTK::UTF8(total$))
ELSE
GTK::set_text(text, total$)
END IF
GTK::set_value(text, 0)
EXIT SUB
L_NetError:
dat$[0] = "Could not lookup word!"
GTK::fg_color(list, 65535, 0, 0)
GTK::set_text(list, dat$)
END SUB
REM ************************************************************************
SUB Clear_All
LOCAL ar$
ar$[0] = ""
GTK::set_text(list, ar$)
GTK::set_text(text, "")
END SUB
REM ************************************************************************