Author Topic: ProvideX Linux 64 IUP  (Read 38452 times)

Support

  • Administrator
  • *****
  • Posts: 1
    • View Profile
ProvideX Linux 64 IUP
« on: June 11, 2015, 06:00:34 am »
Here is an example of an online dictionary program written in ProvideX (PxBasic) for Ubuntu 64 bit and using the IUP (Portable User Interface) with an interface shared object I wrote.

Update: I included a screen shot of the Windows version of ProvideX and IUP. Theming isn't working but the goal was to show the same PVX code running native GUI on Linux and Windows.

! Online Dictionary - Px* + IUP

BEGIN

lib = DLL(ADDR "/home/jrs/pxbasic/pxbiup.so")

DIM servers$[0]
servers$[0]="dict.org"

about$ = "ProvideX IUP Binding"

! Initialize IUP
ok = DLL(lib, "IupOpen")

! Create main window

win = DLL(lib, "IupCreate", "dialog"+$00$)
  ok = DLL(lib, "IupSetAttributes", win, "TITLE="+QUO+"Online Dictionary - ProvideX/IUP"+QUO+", SIZE=500x300"+$00$)
  ok = DLL(lib, "PxBSetCallback", win,"CLOSE_CB"+$00$)

! Create container to house ALL GUI objects

vbox = DLL(lib, "IupCreate", "vbox"+$00$)
  ok = DLL(lib, "IupSetAttributes", vbox, "MARGIN=10x10"+$00$)

! Create server panel

topBox = DLL(lib, "IupCreate", "hbox"+$00$)
  ok = DLL(lib, "IupSetAttributes", topBox, "GAP=10"+$00$)
  ok = DLL(lib, "IupAppend", vbox, topBox)
serverFrame = DLL(lib, "IupCreate", "frame"+$00$)
  ok = DLL(lib, "IupSetAttributes", serverFrame, "TITLE=Servers, EXPAND=YES"+$00$)
  ok = DLL(lib, "IupAppend", topBox, serverFrame)
serverBox = DLL(lib, "IupCreate", "hbox"+$00$)
  ok = DLL(lib, "IupSetAttributes", serverBox, "GAP=5"+$00$)
  ok = DLL(lib, "IupAppend", serverFrame, serverBox)
serverCombo = DLL(lib, "IupCreate", "list"+$00$)
  ok = DLL(lib, "IupSetAttributes", serverCombo, "DROPDOWN=YES, SIZE=120x, EXPAND=HORIZONTAL, VALUE=1"+$00$)
  ok = DLL(lib, "IupAppend", serverBox, serverCombo)
  ok = DLL(lib, "PxBSetCallback", serverCombo, "ACTION"+$00$)
btnFetch = DLL(lib, "IupCreate", "button"+$00$)
  ok = DLL(lib, "IupSetAttributes", btnFetch, "TITLE=Fetch, SIZE = 50x"+$00$)
  ok = DLL(lib, "IupAppend", serverBox, btnFetch)
  ok = DLL(lib, "PxBSetCallback", btnFetch, "ACTION"+$00$)

! Create control panel

controlFrame = DLL(lib, "IupCreate", "frame"+$00$)
  ok = DLL(lib, "IupSetAttributes", controlFrame, "TITLE=Controls"+$00$)
  ok = DLL(lib, "IupAppend", topBox, controlFrame)
controlBox = DLL(lib, "IupCreate", "hbox"+$00$)
  ok = DLL(lib, "IupSetAttributes", controlBox, "GAP=5"+$00$)
  ok = DLL(lib, "IupAppend", controlFrame, controlBox)
btnAbout = DLL(lib, "IupCreate", "button"+$00$)
  ok = DLL(lib, "IupSetAttributes", btnAbout, "TITLE=About, SIZE = 50x"+$00$)
  ok = DLL(lib, "IupAppend", controlBox, btnAbout)
  ok = DLL(lib, "PxBSetCallback", btnAbout, "ACTION"+$00$)
btnClear = DLL(lib, "IupCreate", "button"+$00$)
  ok = DLL(lib, "IupSetAttributes", btnClear, "TITLE=Clear, SIZE = 50x"+$00$)
  ok = DLL(lib, "IupAppend", controlBox, btnClear)
  ok = DLL(lib, "PxBSetCallback", btnClear, "ACTION"+$00$)
btnExit = DLL(lib, "IupCreate", "button"+$00$)
  ok = DLL(lib, "IupSetAttributes", btnExit, "TITLE=Exit, SIZE = 50x"+$00$)
  ok = DLL(lib, "IupAppend", controlBox, btnExit)
  ok = DLL(lib, "PxBSetCallback", btnExit,"ACTION"+$00$)

! Create dictionary panel

dictFrame = DLL(lib, "IupCreate", "frame"+$00$)
  ok = DLL(lib, "IupSetAttributes", dictFrame, "TITLE=Dictionaries"+$00$)
  ok = DLL(lib, "IupAppend", vbox, dictFrame)
serverList = DLL(lib, "IupCreate", "list"+$00$)
  ok = DLL(lib, "IupSetAttributes", serverList, "EXPAND=YES, VISIBLELINES=1"+$00$)
  ok = DLL(lib, "IupAppend", dictFrame, serverList)
  ok = DLL(lib, "PxBSetCallback", serverList, "ACTION"+$00$)

! Create text part

transFrame = DLL(lib, "IupCreate", "frame"+$00$)
  ok = DLL(lib, "IupSetAttributes", transFrame, "TITLE=Translation"+$00$)
  ok = DLL(lib, "IupAppend", vbox, transFrame)
text = DLL(lib, "IupCreate", "text"+$00$)
  ok = DLL(lib, "IupSetAttributes", text, "MULTILINE=YES, EXPAND=YES"+$00$)
  ok = DLL(lib, "IupAppend", transFrame, text)

! Create entry and search button

bottomBox = DLL(lib, "IupCreate", "hbox"+$00$)
  ok = DLL(lib, "IupSetAttributes", bottomBox, "GAP=10"+$00$)
  ok = DLL(lib, "IupAppend", vbox, bottomBox)
label = DLL(lib, "IupCreate", "label"+$00$)
  ok = DLL(lib, "IupSetAttributes", label, "TITLE="+QUO+"Enter Word to Search For:"+QUO+", SIZE=x12"+$00$)
  ok = DLL(lib, "IupAppend", bottomBox, label)
entry = DLL(lib, "IupCreate", "text"+$00$)
  ok = DLL(lib, "IupSetAttributes", entry, "EXPAND=HORIZONTAL"+$00$)
  ok = DLL(lib, "IupAppend", bottomBox, entry)
btnSearch = DLL(lib, "IupCreate", "button"+$00$)
  ok = DLL(lib, "IupSetAttributes", btnSearch, "TITLE=Search, SIZE=50x"+$00$)
  ok = DLL(lib, "IupAppend", bottomBox, btnSearch)
  ok = DLL(lib, "PxBSetCallback", btnSearch, "ACTION"+$00$)
chkAll = DLL(lib, "IupCreate","toggle"+$00$)
  ok = DLL(lib, "IupSetAttributes", chkAll, "TITLE=ALL, SIZE=x12"+$00$)
  ok = DLL(lib, "IupAppend", bottomBox, chkAll)
chkUTF = DLL(lib, "IupCreate", "toggle"+$00$)
  ok = DLL(lib, "IupSetAttributes", chkUTF, "TITLE=UTF-8, SIZE=x12"+$00$)
  ok = DLL(lib, "IupAppend", bottomBox, chkUTF)

! Add the main GUI container to the Window

ok = DLL(lib, "IupAppend", win, vbox)

! Setup dialog defaults

ok = DLL(lib, "IupShow", win)
ok = DLL(lib, "IupSetFocus", btnFetch)
FOR i = 0 TO DIM(READ MAX(servers$))
  ok = DLL(lib, "IupSetAttribute", serverCombo, "APPENDITEM"+$00$, servers$[i]+$00$)
NEXT
ok = DLL(lib, "IupSetAttribute", serverCombo, "VALUE"+$00$, "1"+$00$)
ok = DLL(lib, "IupUpdate", serverCombo)
server_selection$ = servers$[0]

! Main processing loop

REPEAT
  WAIT: ok = DLL(lib, "IupLoopStepWait")
  this_event = DLL(lib, "GetEvent")
  IF NOT(this_event) THEN GOTO WAIT
  SWITCH this_event
    CASE serverCombo
      GOSUB serverCombo_selected
      BREAK
    CASE btnFetch
      GOSUB btnFetch_clicked
      BREAK
    CASE btnAbout
      GOSUB btnAbout_clicked
      BREAK
    CASE btnClear
      GOSUB btnClear_clicked
      BREAK
    CASE serverList
      GOSUB serverList_selected
      BREAK
    CASE btnSearch
      GOSUB btnSearch_clicked
      BREAK
  END SWITCH
UNTIL this_event = win OR this_event = btnExit
ok = DLL(lib, "IupClose")
ok = DLL(DROP lib)
END

! Callback routines

btnAbout_clicked:
  ok = DLL(lib, "IupMessage", "ABOUT"+$00$, about$)
RETURN

serverCombo_selected:
  DIM server_selection$(1024)
  ok = DLL(lib, "GetListSelectedText", server_selection$)
  server_selection$ = STP(server_selection$, 2)
RETURN

serverList_selected:
  DIM whichDictionary$(1024)
  ok = DLL(lib, "GetListSelectedText", whichDictionary$)
  whichDictionary$ = STP(whichDictionary$, 2)
RETURN

btnFetch_clicked:
  dat$ = ""
  DIM _total$[*]
  count = 1
  OPEN (1,BSZ=16384)"[TCP]"+server_selection$+";2628;NoDelay;stream"
  WRITE (1)"SHOW DB"+$0D0A$
  REPEAT
    READ(1)raw_data$
    dat$ = dat$ + raw_data$
  UNTIL POS("250 ok" = raw_data$)
  WRITE(1)"QUIT"+$0D0A$
  CLOSE(1)
  REPEAT
    eol = POS($0D0A$=dat$)
    _total$[count] = dat$(1,eol - 1)
    dat$ = dat$(eol + 2)
    count += 1
  UNTIL dat$ = ""
  FOR cnt = 3 TO count - 3
    ok = DLL(lib, "IupSetAttribute", serverList, "APPENDITEM"+$00$, _total$[cnt]+$00$)
   NEXT cnt
  ok = DLL(lib, "IupSetAttribute", serverList, "APPENDITEM"+$00$, _total$[3]+$00$)
  ok = DLL(lib, "IupSetAttribute", serverList, "VALUE"+$00$, "1"+$00$)
  ok = DLL(lib, "IupUpdate", serverCombo)
  whichDictionary$ = _total$[3]
RETURN

G_NetError:
  PRINT "Server ",server_selection$," not available. (",ERROR,")"
RETURN

btnClear_clicked:
  ok = DLL(lib, "IupSetAttribute", serverList,"1"+$00$)
  ok = DLL(lib, "IupSetAttribute", text, "VALUE"+$00$, ""+$00$)
  ok = DLL(lib, "IupSetAttribute", entry, "VALUE"+$00$, ""+$00$)
RETURN

btnSearch_clicked:
  dict$ = ""
  dat$ = ""
  total$ = ""
  info$ = ""
  ok = DLL(lib, "IupSetAttribute", text, "VALUE"+$00$, "Fetching...."+$00$)
  dict$ = whichDictionary$(1, POS(" " = whichDictionary$) - 1)
  OPEN (1,BSZ=16384)"[TCP]"+server_selection$+";2628;NoDelay;stream"
  chkval$ = FNIupGetString$(DLL(lib, "IupGetAttribute", chkAll, "VALUE"+$00$))
  IF chkval$ = "ON" THEN {
    WRITE(1)"DEFINE * " + FNIupGetString$(DLL(lib, "IupGetAttribute", entry,"VALUE"+$00$)) + $0D0A$
  } ELSE {
    WRITE(1)"DEFINE " + dict$ + " " + FNIupGetString$(DLL(lib, "IupGetAttribute", entry,"VALUE"+$00$)) + $0D0A$
  }
  REPEAT
    READ(1)raw_data$
    data_str$ = data_str$ + raw_data$
  UNTIL POS("250 ok [d/m/c =" = raw_data$)
  WRITE(1)"QUIT"+$0D0A$
  CLOSE(1)
  ! Remove header
  data_str$ = data_str$(POS($0D0A$=data_str$, 1, 2) + 2)
  REPEAT
    eol = POS($0D0A$=data_str$)
    dat$ = data_str$(1,eol - 1)
    data_str$ = data_str$(eol + 2)
    IF dat$(1, 3) <> "151" THEN GOTO IT
      entstr$ = FNIupGetString$(DLL(lib, "IupGetAttribute", entry, "VALUE"+$00$))
      total$ = total$ + "------------------------------" + $0D0A$
      total$ = total$ + dat$(2 + LEN(entstr$) + LEN(dict$)) + $0D0A$
      total$ = total$ + "------------------------------"+ $0D0A$
      REPEAT
        eol = POS($0D0A$=data_str$)
        info$ = data_str$(1,eol - 1)
        data_str$ = data_str$(eol + 2)
        info$ = SUB(info$, CHR(34), CHR(92) + CHR(34))
        IF LEN(info$) AND info$(1, 1) <> "." THEN total$ += STP(info$, 2) + $0D0A$
      UNTIL info$ > "" AND info$(1, 1) = "."
      total$ += $0D0A$
    IT:
  UNTIL data_str$(1, 3) = "250" OR NUM(data_str$(1, 3)) > 499
  IF dat$(1, 3) = "552" THEN total$ = "No match found."
  IF dat$(1, 3) = "501" THEN total$ = "Select a dictionary first!"
  IF dat$(1, 3) = "550" THEN total$ = "Invalid database!"
  ok = DLL(lib, "IupSetAttribute", text, "VALUE"+$00$, total$+$00$)
RETURN

L_NetError:
  dat$ = "Could not lookup word! (" + STR(ERR) + ")"
  ok = DLL(lib, "IupSetAttribute", text, "VALUE"+$00$, dat$+$00$)
RETURN

! DLL() return string emulator

DEF FNIupGetString$(LOCAL i_ptr)
  LOCAL strlen, pxbuff$
  DIM pxbuff$(4096)
  strlen = DLL(lib, "ptr2pxbstr", i_ptr, pxbuff$)
  RETURN pxbuff$(1,strlen)
END DEF
 
« Last Edit: June 12, 2015, 04:05:22 am by support »

Support

  • Administrator
  • *****
  • Posts: 1
    • View Profile
Script BASIC IUP Windows 64 bit
« Reply #1 on: June 12, 2015, 04:10:38 am »
This is the Online Dictionary example running under Script BASIC for Windows 64 bit. I used my IUP wrapper library to make the code easier to read.

' SBx Online Dictionary

servers[0]="dict.org"
servers[1]="dict1.us.dict.org"
servers[2]="all.dict.org"

about="""This is a Demo
of the IUP GUI Binding
for Scriptbasic"
""

INCLUDE "SBx"

' Create main window
win = DIALOG()
  SETPROPERTIES win, "TITLE=\"Script BASIC/IUP 64 bit Online Dictionary\", SIZE = 500x300"
  SETEVENT win, "CLOSE_CB", ADDRESS(Win_exit())

' Create container to house ALL GUI objects
vbx = VBOX()
  SETPROPERTIES vbx, "MARGIN=10x10"

' Create server panel
topBox = HBOX()
  SETPROPERTIES topBox, "GAP=10"
  APPEND vbx, topBox
serverFrame = FRAME()
  SETPROPERTIES serverFrame, "TITLE=Servers, EXPAND=YES"
  APPEND topBox, serverFrame
serverBox = HBOX()
  SETPROPERTIES serverBox, "GAP=5"
  APPEND serverFrame, serverBox
serverCombo = LIST()
  SETPROPERTIES serverCombo, "DROPDOWN=YES, SIZE=120x, EXPAND=HORIZONTAL, VALUE=1"
  APPEND serverBox, serverCombo
  SETEVENT serverCombo, "ACTION", ADDRESS(serverCombo_selected())
btnFetch = BUTTON()
  SETPROPERTIES btnFetch, "TITLE=Fetch, SIZE = 50x"
  APPEND serverBox, btnFetch
  SETEVENT btnFetch, "ACTION", ADDRESS(btnFetch_clicked())

' Create control panel
controlFrame = FRAME()
  SETPROPERTIES controlFrame, "TITLE=Controls"
  APPEND topBox, controlFrame
controlBox = HBOX()
  SETPROPERTIES controlBox, "GAP=5"
  APPEND controlFrame, controlBox
btnAbout = BUTTON()
  SETPROPERTIES btnAbout, "TITLE=About, SIZE = 50x"
  APPEND controlBox, btnAbout
  SETEVENT btnAbout, "ACTION", ADDRESS(btnAbout_clicked())
btnClear = BUTTON()
  SETPROPERTIES btnClear, "TITLE=Clear, SIZE = 50x"
  APPEND controlBox, btnClear
  SETEVENT btnClear, "ACTION", ADDRESS(btnClear_clicked())
btnExit = BUTTON()
  SETPROPERTIES btnExit, "TITLE=Exit, SIZE = 50x"
  APPEND controlBox, btnExit
  SETEVENT btnExit,"ACTION",ADDRESS(Win_exit())

' Create dictionary panel
dictFrame = FRAME()
  SETPROPERTIES dictFrame, "TITLE=\"Dictionaries\""
  APPEND vbx, dictFrame
serverList = LIST()
  SETPROPERTIES serverList, "EXPAND=YES, VISIBLELINES=1"
  APPEND dictFrame, serverList
  SETEVENT serverList, "ACTION", ADDRESS(serverList_selected())

' Create text part
transFrame = FRAME()
  SETPROPERTIES transFrame, "TITLE=\"Translation\""
  APPEND vbx, transFrame
txt = TEXT()
  SETPROPERTIES txt, "MULTILINE=YES, EXPAND=YES"
  APPEND transFrame, txt


' Create entry and search button
bottomBox = HBOX()
  SETPROPERTIES bottomBox, "GAP=10"
  APPEND vbx, bottomBox
lbl = LABEL()
  SETPROPERTIES lbl, "TITLE=\"Enter Word to Search For:\", SIZE=x12"
  APPEND bottomBox, lbl
entry = TEXT()
  SETPROPERTIES entry, "EXPAND=HORIZONTAL"
  APPEND bottomBox, entry
btnSearch = BUTTON()
  SETPROPERTIES btnSearch,"TITLE=Search, SIZE=50x"
  APPEND bottomBox, btnSearch
  SETEVENT btnSearch, "ACTION", ADDRESS(btnSearch_clicked())
chkAll = TOGGLE()
  SETPROPERTIES chkAll, "TITLE=ALL, SIZE=x12"
  APPEND bottomBox, chkAll
chkUTF = TOGGLE()
  SETPROPERTIES chkUTF, "TITLE=UTF-8, SIZE=x12"
  APPEND bottomBox, chkUTF

' Add the main GUI container to the Window
APPEND win, vbx

' Setup dialog defaults
SHOW win
FOCUS btnFetch
FOR i = 0 TO UBOUND(servers)
  SETPROPERTY serverCombo, "APPENDITEM", servers[i]
NEXT
SETPROPERTY serverCombo, "VALUE", "1"
UPDATE serverCombo
server_selection = servers[0]
GETEVENT()
END


' Callback routines

SUB Win_exit
  Iup::ExitLoop = TRUE
END SUB

SUB btnAbout_clicked
  MESSAGE "ABOUT", about
END SUB

SUB serverCombo_selected
  server_selection = GETITEM()
END SUB

SUB serverList_selected
  whichDictionary = GETITEM()
END SUB

SUB btnFetch_clicked
  LOCAL dat, total, count
  ON ERROR GOTO G_NetError
  OPEN server_selection & ":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
    IF LEFT(dat, 1) <> "." THEN total[count] = TRIM(dat)
    count+=1
  WEND
  PRINT#1,"QUIT\n"
  CLOSE(#1)
  FOR cnt = 0 TO count - 2
    SETPROPERTY serverList, "APPENDITEM", total[cnt]
  NEXT
  SETPROPERTY serverList, "VALUE", "1"
  UPDATE serverCombo
  whichDictionary = total[0]
  EXIT SUB

  G_NetError:
  PRINT "Server ",server_selection," not available. (",ERROR,")\n"
END SUB

SUB btnClear_clicked
  CLEAR serverList
  SETPROPERTY txt, "VALUE", ""
  SETPROPERTY entry, "VALUE", ""
END SUB

SUB btnSearch_clicked
  LOCAL dict, dat, total, info
  SETPROPERTY txt, "VALUE", "Fetching...."
  ON ERROR GOTO L_NetError
  dict = LEFT(whichDictionary, INSTR(whichDictionary, " "))
  OPEN server_selection & ":2628" FOR SOCKET AS 1
  IF GETPROPERTY(chkAll, "VALUE") THEN
    PRINT#1,"DEFINE * " & GETPROPERTY(entry, "VALUE") & "\n"
  ELSE
    PRINT#1,"DEFINE " & dict & " " & GETPROPERTY(entry, "VALUE") & "\n"
  END IF
  REPEAT
    LINE INPUT#1, dat
    IF LEFT(dat, 3) = "151" THEN
      total &= "------------------------------\r\n"
      total &= RIGHT(dat, LEN(dat) - LEN(GETPROPERTY(entry, "VALUE")) - LEN(dict))
      total &= "------------------------------\r\n"
      REPEAT
        LINE INPUT#1, info
        info = REPLACE(info, CHR(34), CHR(92) & CHR(34))
        IF LEFT(info, 1) <> "." THEN total &= TRIM(info) & "\n"
      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."
  ELSE IF LEFT(dat, 3) = "501" THEN
    total = "Select a dictionary first!"
  ELSE IF LEFT(dat, 3) = "550" THEN
    total = "Invalid database!"
  END IF
  SETPROPERTY txt, "VALUE", total
EXIT SUB

L_NetError:
  dat[0] = "Could not lookup word! (" & ERROR & ")"
  SETPROPERTY txt, "VALUE", dat
END SUB