diff options
author | murphy <murphy@rubychan.de> | 2008-01-07 14:17:43 +0000 |
---|---|---|
committer | murphy <murphy@rubychan.de> | 2008-01-07 14:17:43 +0000 |
commit | bbbbc70a0b2efcd03bbcaf4e08ac139e7969e608 (patch) | |
tree | 8eb543ee3633ebedd3746b5557c77df0e8612a2a /etc/todo/example.lua | |
parent | a08d41bb16104ad52ecf612c81f75f531af87d25 (diff) | |
download | coderay-bbbbc70a0b2efcd03bbcaf4e08ac139e7969e608.tar.gz |
Added etc/todo (scanner drafts) and two TextMate project files.
Diffstat (limited to 'etc/todo/example.lua')
-rw-r--r-- | etc/todo/example.lua | 8289 |
1 files changed, 8289 insertions, 0 deletions
diff --git a/etc/todo/example.lua b/etc/todo/example.lua new file mode 100644 index 0000000..9d9a404 --- /dev/null +++ b/etc/todo/example.lua @@ -0,0 +1,8289 @@ + +------------------------------------------------------------------------------- +-- Creates a new function, with the name suffixed by "New". This new function +-- creates a new image, based on a source image, and calls the previous function +-- with this new image. + +local function OneSourceOneDest (funcname, width, height, color_space, data_type) + local func = im[funcname] + assert(func) -- see if function is really defined + + -- define function with "New" suffix + im[funcname.."New"] = function (src_image, ...) + -- create destination image + local dst_image = im.ImageCreateBased(src_image, width, height, color_space, data_type) + + -- call previous method, repassing all parameters + func(src_image, dst_image, unpack(arg)) + return dst_image + end +end + +------------------------------------------------------------------------------- +-- This function is similar to OneSourceOneDest, but it receives two source +-- images. + +local function TwoSourcesOneDest (funcname, width, height, color_space, data_type) + local func = im[funcname] + + -- see if function is really defined + assert(func, string.format("undefined function `%s'", funcname)) + + -- define function with "New" suffix + im[funcname.."New"] = function (src_image1, src_image2, ...) + -- create destination image + local dst_image = im.ImageCreateBased(src_image1, width, height, color_space, data_type) + + -- call previous method, repassing all parameters + func(src_image1, src_image2, dst_image, unpack(arg)) + return dst_image + end +end + +------------------------------------------------------------------------------- + +TwoSourcesOneDest("ProcessCrossCorrelation") +OneSourceOneDest("ProcessAutoCorrelation", nil, nil, nil, im.CFLOAT) +OneSourceOneDest("ProcessFFT") +OneSourceOneDest("ProcessIFFT") + +------------------------------------------------------------------------------- +-- Creates a new function, with the name suffixed by "New". This new function +-- creates a new image, based on a source image, and calls the previous function +-- with this new image. +-- We assume here that the functions returns only one parameter or none. + +local function OneSourceOneDest (funcname, width, height, color_space, data_type) + local func = im[funcname] + assert(func) -- see if function is really defined + + -- define function with "New" suffix + im[funcname.."New"] = function (src_image, ...) + -- create destination image + local dst_image = im.ImageCreateBased(src_image, width, height, color_space, data_type) + + -- call previous method, repassing all parameters + local ret = func(src_image, dst_image, unpack(arg)) + if (ret) then + return ret, dst_image + else + return dst_image + end + end +end + +------------------------------------------------------------------------------- +-- This function is similar to OneSourceOneDest, but it receives two source +-- images. + +local function TwoSourcesOneDest (funcname, width, height, color_space, data_type) + local func = im[funcname] + + -- see if function is really defined + assert(func, string.format("undefined function `%s'", funcname)) + + -- define function with "New" suffix + im[funcname.."New"] = function (src_image1, src_image2, ...) + -- create destination image + local dst_image = im.ImageCreateBased(src_image1, width, height, color_space, data_type) + + -- call previous method, repassing all parameters + local ret = func(src_image1, src_image2, dst_image, unpack(arg)) + if (ret) then + return ret, dst_image + else + return dst_image + end + end +end + +------------------------------------------------------------------------------- +-- This function is similar to OneSourceOneDest, but it receives three source +-- images. + +local function ThreeSourcesOneDest (funcname, width, height, color_space, data_type) + local func = im[funcname] + assert(func) -- see if function is really defined + + -- define function with "New" suffix + im[funcname.."New"] = function (src_image1, src_image2, src_image3, ...) + -- create destination image + local dst_image = im.ImageCreateBased(src_image1, width, height, color_space, data_type) + + -- call previous method, repassing all parameters + local ret = func(src_image1, src_image2, src_image3, dst_image, unpack(arg)) + if (ret) then + return ret, dst_image + else + return dst_image + end + end +end + +------------------------------------------------------------------------------- +-- This function is similar to OneSourceOneDest, but it creates two destiny +-- images. + +local function OneSourceTwoDests (funcname, width, height, color_space, data_type) + local func = im[funcname] + assert(func) -- see if function is really defined + + -- define function with "New" suffix + im[funcname.."New"] = function (src_image, ...) + -- create destination image + local dst_image1 = im.ImageCreateBased(src_image, width, height, color_space, data_type) + local dst_image2 = im.ImageCreateBased(src_image, width, height, color_space, data_type) + + -- call previous method, repassing all parameters + local ret = func(src_image, dst_image1, dst_image2, unpack(arg)) + if (ret) then + return ret, dst_image1, dst_image2 + else + return dst_image1, dst_image2 + end + end +end + +------------------------------------------------------------------------------- +-- This function is similar to OneSourceOneDest, but it creates three destiny +-- images. + +local function OneSourceThreeDests (funcname, width, height, color_space, data_type) + local func = im[funcname] + assert(func) -- see if function is really defined + + -- define function with "New" suffix + im[funcname.."New"] = function (src_image, ...) + -- create destination image + local dst_image1 = im.ImageCreateBased(src_image, width, height, color_space, data_type) + local dst_image2 = im.ImageCreateBased(src_image, width, height, color_space, data_type) + local dst_image3 = im.ImageCreateBased(src_image, width, height, color_space, data_type) + + -- call previous method, repassing all parameters + local ret = func(src_image, dst_image1, dst_image2, dst_image3, unpack(arg)) + if (ret) then + return ret, dst_image1, dst_image2, dst_image3 + else + return dst_image1, dst_image2, dst_image3 + end + end +end + +------------------------------------------------------------------------------- + +local function hough_height(image) + local function sqr(x) return x*x end + local rmax = math.sqrt(sqr(image:Width()) + sqr(image:Height())) / 2 + return 2*rmax+1 +end + +OneSourceOneDest("AnalyzeFindRegions", nil, nil, nil, im.USHORT) +OneSourceOneDest("ProcessPerimeterLine") +OneSourceOneDest("ProcessPrune") +OneSourceOneDest("ProcessFillHoles") +OneSourceOneDest("ProcessHoughLines", 180, hough_height, im.GRAY, im.INT) +OneSourceOneDest("ProcessHoughLinesDraw") +OneSourceOneDest("ProcessDistanceTransform", nil, nil, nil, im.FLOAT) +OneSourceOneDest("ProcessRegionalMaximum", nil, nil, im.BINARY, nil) + +function im.ProcessReduceNew (src_image, width, height) + local dst_image = im.ImageCreateBased(src_image, width, height) + return im.ProcessReduce(src_image, dst_image), dst_image +end + +function im.ProcessResizeNew (src_image, width, height) + local dst_image = im.ImageCreateBased(src_image, width, height) + return im.ProcessResize(src_image, dst_image), dst_image +end + +OneSourceOneDest("ProcessReduceBy4", function (image) return image:Width() / 2 end, + function (image) return image:Height() / 2 end) + +function im.ProcessCropNew (src_image, xmin, xmax, ymin, ymax) + local width = xmax - xmin + 1 + local height = xmax - ymin + 1 + local dst_image = im.ImageCreateBased(src_image, width, height) + im.ProcessCrop(src_image, dst_image, xmin, ymin) + return dst_image +end + +TwoSourcesOneDest("ProcessInsert") + +function im.ProcessAddMarginsNew (src_image, xmin, xmax, ymin, ymax) + local width = xmax - xmin + 1 + local height = xmax - ymin + 1 + local dst_image = im.ImageCreateBased(src_image, width, height) + im.ProcessAddMargins(src_image, dst_image, xmin, ymin) + return dst_image +end + +function im.ProcessRotateNew (src_image, cos0, sin0, order) + local width, height = im.ProcessCalcRotateSize(src_image:Width(), src_image:Height(), cos0, sin0) + local dst_image = im.ImageCreateBased(src_image, width, height) + return im.ProcessRotate(src_image, dst_image, cos0, sin0, order), dst_image +end + +OneSourceOneDest("ProcessRotateRef") +OneSourceOneDest("ProcessRotate90", function (image) return image:Height() end, function (image) return image:Width() end) +OneSourceOneDest("ProcessRotate180") +OneSourceOneDest("ProcessMirror") +OneSourceOneDest("ProcessFlip") +OneSourceOneDest("ProcessRadial") +OneSourceOneDest("ProcessGrayMorphConvolve") +OneSourceOneDest("ProcessGrayMorphErode") +OneSourceOneDest("ProcessGrayMorphDilate") +OneSourceOneDest("ProcessGrayMorphOpen") +OneSourceOneDest("ProcessGrayMorphClose") +OneSourceOneDest("ProcessGrayMorphTopHat") +OneSourceOneDest("ProcessGrayMorphWell") +OneSourceOneDest("ProcessGrayMorphGradient") +OneSourceOneDest("ProcessBinMorphConvolve") +OneSourceOneDest("ProcessBinMorphErode") +OneSourceOneDest("ProcessBinMorphDilate") +OneSourceOneDest("ProcessBinMorphOpen") +OneSourceOneDest("ProcessBinMorphClose") +OneSourceOneDest("ProcessBinMorphOutline") +OneSourceOneDest("ProcessBinMorphThin") +OneSourceOneDest("ProcessMedianConvolve") +OneSourceOneDest("ProcessRangeConvolve") +OneSourceOneDest("ProcessRankClosestConvolve") +OneSourceOneDest("ProcessRankMaxConvolve") +OneSourceOneDest("ProcessRankMinConvolve") +OneSourceOneDest("ProcessConvolve") +OneSourceOneDest("ProcessConvolveSep") +OneSourceOneDest("ProcessConvolveRep") +OneSourceOneDest("ProcessConvolveDual") +OneSourceOneDest("ProcessCompassConvolve") +OneSourceOneDest("ProcessMeanConvolve") +OneSourceOneDest("ProcessGaussianConvolve") +OneSourceOneDest("ProcessBarlettConvolve") +OneSourceTwoDests("ProcessInterlaceSplit", nil, function (image) if (image:Height()) then return image:Height() else return image:Height()/2 end end) + +function im.ProcessInterlaceSplitNew(src_image) + -- create destination image + local dst_height1 = src_image:Height()/2 + if math.mod(src_image:Height(), 2) then + dst_height1 = dst_height1 + 1 + end + + local dst_image1 = im.ImageCreateBased(src_image, nil, dst_height1) + local dst_image2 = im.ImageCreateBased(src_image, nil, src_image:Height()/2) + + -- call method, repassing all parameters + im.ProcessInterlaceSplit(src_image, dst_image1, dst_image2) + return dst_image1, dst_image2 +end + +local function int_datatype (image) + local data_type = image:DataType() + if data_type == im.BYTE or data_type == im.USHORT then + data_type = im.INT + end + return data_type +end + +OneSourceOneDest("ProcessDiffOfGaussianConvolve", nil, nil, nil, int_datatype) +OneSourceOneDest("ProcessLapOfGaussianConvolve", nil, nil, nil, int_datatype) +OneSourceOneDest("ProcessSobelConvolve") +OneSourceOneDest("ProcessSplineEdgeConvolve") +OneSourceOneDest("ProcessPrewittConvolve") +OneSourceOneDest("ProcessZeroCrossing") +OneSourceOneDest("ProcessCanny") +OneSourceOneDest("ProcessUnArithmeticOp") +TwoSourcesOneDest("ProcessArithmeticOp") + +function im.ProcessArithmeticConstOpNew (src_image, src_const, op) + local dst_image = im.ImageCreateBased(src_image) + im.ProcessArithmeticConstOp(src_image, src_const, dst_image, op) + return dst_image +end + +TwoSourcesOneDest("ProcessBlendConst") +ThreeSourcesOneDest("ProcessBlend") +OneSourceTwoDests("ProcessSplitComplex") +TwoSourcesOneDest("ProcessMergeComplex", nil, nil, nil, im.CFLOAT) + +function im.ProcessMultipleMeanNew (src_image_list, dst_image) + local dst_image = im.ImageCreateBased(src_image_list[1]) + im.ProcessMultipleMean(src_image_list, dst_image) + return dst_image +end + +function im.ProcessMultipleStdDevNew (src_image_list, mean_image) + local dst_image = im.ImageCreateBased(src_image_list[1]) + im.ProcessMultipleStdDev(src_image_list, mean_image, dst_image) + return dst_image +end + +TwoSourcesOneDest("ProcessAutoCovariance") +OneSourceOneDest("ProcessMultiplyConj") +OneSourceOneDest("ProcessQuantizeRGBUniform", nil, nil, im.MAP, nil) +OneSourceOneDest("ProcessQuantizeGrayUniform") +OneSourceOneDest("ProcessExpandHistogram") +OneSourceOneDest("ProcessEqualizeHistogram") + +function im.ProcessSplitYChromaNew (src_image) + local y_image = im.ImageCreateBased(src_image, nil, nil, im.GRAY, im.BYTE) + local chroma_image = im.ImageCreateBased(src_image, nil, nil, im.RGB, im.BYTE) + im.ProcessSplitYChroma(src_image, y_image, chroma_image) + return y_image, chroma_image +end + +OneSourceThreeDests("ProcessSplitHSI", nil, nil, im.GRAY, im.FLOAT) +ThreeSourcesOneDest("ProcessMergeHSI", nil, nil, im.RGB, im.BYTE) + +function im.ProcessSplitComponentsNew (src_image) + local depth = src_image:Depth() + local dst_images = {} + for i = 1, depth do + table.insert(dst_images, im.ImageCreateBased(src_image, nil, nil, im.GRAY)) + end + im.ProcessSplitComponents(src_image, dst_images) + return unpack(dst_images) +end + +function im.ProcessMergeComponentsNew (src_image_list) + local dst_image = im.ImageCreateBased(src_image_list[1], nil, nil, im.RGB) + im.ProcessMergeComponents(src_image_list, dst_image) + return dst_image +end + +OneSourceOneDest("ProcessNormalizeComponents", nil, nil, nil, im.FLOAT) +OneSourceOneDest("ProcessReplaceColor") +TwoSourcesOneDest("ProcessBitwiseOp") +OneSourceOneDest("ProcessBitwiseNot") +OneSourceOneDest("ProcessBitMask") +OneSourceOneDest("ProcessBitPlane") +OneSourceOneDest("ProcessToneGamut") +OneSourceOneDest("ProcessUnNormalize", nil, nil, nil, im.BYTE) +OneSourceOneDest("ProcessDirectConv", nil, nil, nil, im.BYTE) +OneSourceOneDest("ProcessNegative") +OneSourceOneDest("ProcessRangeContrastThreshold", nil, nil, im.BINARY, nil) +OneSourceOneDest("ProcessLocalMaxThreshold", nil, nil, im.BINARY, nil) +OneSourceOneDest("ProcessThreshold", nil, nil, im.BINARY, nil) +TwoSourcesOneDest("ProcessThresholdByDiff") +OneSourceOneDest("ProcessHysteresisThreshold", nil, nil, im.BINARY, nil) +OneSourceOneDest("ProcessUniformErrThreshold", nil, nil, im.BINARY, nil) +OneSourceOneDest("ProcessDifusionErrThreshold") +OneSourceOneDest("ProcessPercentThreshold") +OneSourceOneDest("ProcessOtsuThreshold") +OneSourceOneDest("ProcessMinMaxThreshold", nil, nil, im.BINARY, nil) +OneSourceOneDest("ProcessSliceThreshold", nil, nil, im.BINARY, nil) +OneSourceOneDest("ProcessPixelate") +OneSourceOneDest("ProcessPosterize") + +---------------------------------------------------- +-- The main porpouse of this file is to build linux gcc makefiles. +-- Must have Premake version 3 installed. +-- Original Premake was changed to remove some parameters and add others. +-- Default parameters: +-- premake3s --target gnu --os linux +-- But it can build windows gcc makefiles, and visual studio projects. +-- premake3s --target gnu --os windows +-- premake3s --target gnu --os macosx +-- premake3s --target vs6 +-- premake3s --target vs2002 +-- premake3s --target vs2003 +-- premake3s --target vs2005 +-- In Linux the generated makefiles will not correctly build libraries in 64-bits. +-- must add "-m64 -fPIC" flags +---------------------------------------------------- + +if (not options.target) then + options.target = "gnu" +end + +if (not options.os) then + if (options.target ~= "gnu") then + options.os = "windows" + else + options.os = "linux" + end +end + +function fixPackagePath(package_files) + if (options.os ~= "linux") then + for i, file in package_files do + package_files[i] = "../src/"..file + end + end +end + +---------------------------------------------------- + +project.name = "im" +project.bindir = "../bin" +project.libdir = "../lib" + +if (options.os ~= "linux") then + if (options.os == "macosx") then + project.path = "../mak.macosx" + else + project.path = "../mak."..options.target + end +end + +---------------------------------------------------- + +package = newpackage() +package.name = "im" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + matchfiles("libtiff/*.c"), + matchfiles("libjpeg/*.c"), + matchfiles("liblzf/*.c"), + matchfiles("zlib/*.c"), + "libpng/png.c", "libpng/pngget.c", "libpng/pngread.c", "libpng/pngrutil.c", "libpng/pngwtran.c", + "libpng/pngerror.c", "libpng/pngmem.c", "libpng/pngrio.c", "libpng/pngset.c", "libpng/pngwio.c", + "libpng/pngpread.c", "libpng/pngrtran.c", "libpng/pngtrans.c", "libpng/pngwrite.c", "libpng/pngwutil.c", + matchfiles("libexif/canon/*.c"), + matchfiles("libexif/olympus/*.c"), + matchfiles("libexif/pentax/*.c"), + matchfiles("libexif/*.c"), + "old_imcolor.c", "old_imresize.c", "tiff_binfile.c", "im_converttype.cpp", + "im_attrib.cpp", "im_format.cpp", "im_format_tga.cpp", "im_filebuffer.cpp", + "im_bin.cpp", "im_format_all.cpp", "im_format_tiff.cpp", "im_format_raw.cpp", + "im_binfile.cpp", "im_format_sgi.cpp", "im_datatype.cpp", "im_format_pcx.cpp", + "im_colorhsi.cpp", "im_format_bmp.cpp", "im_image.cpp", "im_rgb2map.cpp", + "im_colormode.cpp", "im_format_gif.cpp", "im_lib.cpp", "im_format_pnm.cpp", + "im_colorutil.cpp", "im_format_ico.cpp", "im_palette.cpp", "im_format_png.cpp", + "im_convertbitmap.cpp", "im_format_led.cpp", "im_counter.cpp", "im_str.cpp", + "im_convertcolor.cpp", "im_format_jpeg.cpp", "im_fileraw.cpp", "im_format_krn.cpp", + "im_file.cpp", "im_format_ras.cpp", "old_im.cpp", "im_compress.cpp", +} + +package.includepaths = { ".", "../include", "libtiff", "libjpeg", "libexif", "libpng", "zlib" } +package.defines = { "JPEG_SUPPORT", "ZIP_SUPPORT", "OJPEG_SUPPORT", "PIXARLOG_SUPPORT", "PNG_NO_STDIO", "PNG_TIME_RFC1123_SUPPORTED" } + +if (options.os == "windows") then + tinsert(package.files, {"im_sysfile_win32.cpp", "im_dib.cpp", "im_dibxbitmap.cpp"}) + + if (options.target ~= "gnu") then + -- optimize PNG lib for VC + tinsert(package.files, "libpng/pngvcrd.c") + tinsert(package.defines, "PNG_USE_PNGVCRD") + end +else + tinsert(package.files, "im_sysfile_unix.cpp") + + if (options.os == "linux") then + --package.buildoptions = { "-W -Wall -ansi -pedantic" } + + -- optimize PNG lib for Linux in x86 + tinsert(package.files, "libpng/pnggccrd.c") + tinsert(package.defines, "PNG_USE_PNGGCCRD") + end +end + +fixPackagePath(package.files) + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "im_process" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + "process/im_arithmetic_bin.cpp", "process/im_morphology_gray.cpp", "process/im_quantize.cpp", + "process/im_arithmetic_un.cpp", "process/im_geometric.cpp", "process/im_render.cpp", + "process/im_color.cpp", "process/im_histogram.cpp", "process/im_resize.cpp", + "process/im_convolve.cpp", "process/im_houghline.cpp", "process/im_statistics.cpp", + "process/im_convolve_rank.cpp", "process/im_logic.cpp", "process/im_threshold.cpp", + "process/im_effects.cpp", "process/im_morphology_bin.cpp", "process/im_tonegamut.cpp", + "process/im_canny.cpp", "process/im_distance.cpp", "process/im_analyze.cpp" +} +fixPackagePath(package.files) + +package.includepaths = { "../include" } + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "im_jp2" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + matchfiles("libjasper/base/*.c", "libjasper/jp2/*.c", "libjasper/jpc/*.c"), + "jas_binfile.c", "im_format_jp2.cpp" +} +fixPackagePath(package.files) + +package.includepaths = { "../include", "libjasper" } +package.defines = { "EXCLUDE_JPG_SUPPORT", "EXCLUDE_MIF_SUPPORT", "EXCLUDE_PNM_SUPPORT", + "EXCLUDE_BMP_SUPPORT", "EXCLUDE_PGX_SUPPORT", "EXCLUDE_RAS_SUPPORT", + "EXCLUDE_TIFF_SUPPORT", "JAS_GEO_OMIT_PRINTING_CODE" } + +tinsert(package.defines, "JAS_TYPES") + +if (options.os == "linux") then + tinsert(package.defines, "HAVE_UNISTD_H") +end + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "imlua3" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + "im_lua3.c" +} +fixPackagePath(package.files) + +package.includepaths = { "../include", "$(LUA3)/include", "$(CD)/include" } + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "im_fftw" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + matchfiles("fftw/*.c"), + "process/im_fft.cpp" +} +fixPackagePath(package.files) + +package.includepaths = { "../include", "fftw" } +package.defines = { "FFTW_ENABLE_FLOAT" } + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "im_fftw3" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + matchfiles("fftw3/api/*.c"), + matchfiles("fftw3/reodft/*.c"), + matchfiles("fftw3/kernel/*.c"), + matchfiles("fftw3/dft/*.c", "fftw3/dft/codelets/*.c", "fftw3/dft/codelets/inplace/*.c", "fftw3/dft/codelets/standard/*.c"), + matchfiles("fftw3/rdft/*.c", "fftw3/rdft/codelets/*.c", "fftw3/rdft/codelets/hc2r/*.c", "fftw3/rdft/codelets/r2hc/*.c", "fftw3/rdft/codelets/r2r/*.c"), + "process/im_fft.cpp" +} +fixPackagePath(package.files) + +package.includepaths = { "../include", "fftw3/kernel", "fftw3/dft", "fftw3/rdft", "fftw3/api", + "fftw3/reodft", "fftw3/rdft/codelets", "fftw3/dft/codelets" } +package.defines = { "USE_FFTW3" } + +if (options.os == "windows") then + if (options.target == "gnu") then + tinsert(package.defines, "HAVE_UINTPTR_T") + end +end + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "imlua51" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + "lua5/imlua.c", "lua5/imlua_aux.c", "lua5/imlua_convert.c", "lua5/imlua_file.c", + "lua5/imlua_image.c", "lua5/imlua_palette.c", "lua5/imlua_util.c" +} +fixPackagePath(package.files) + +package.includepaths = { "../include", "lua5", "$(LUA51)/include" } + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "imlua_cd51" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + "lua5/imlua_cd.c" +} +fixPackagePath(package.files) + +package.includepaths = { "../include", "lua5", "$(LUA51)/include", "$(CD)/include" } + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "imlua_process51" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + "lua5/imlua_process.c" +} +fixPackagePath(package.files) + +package.includepaths = { "../include", "lua5", "$(LUA51)/include" } + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "imlua_capture51" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + "lua5/imlua_capture.c" +} +fixPackagePath(package.files) + +package.includepaths = { "../include", "lua5", "$(LUA51)/include" } + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "imlua_fftw51" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + "lua5/imlua_fftw.c" +} +fixPackagePath(package.files) + +package.includepaths = { "../include", "lua5", "$(LUA51)/include" } + +--------------------------------------------------------------------- +---------------------------------------------------- +-- The main porpouse of this file is to build linux gcc makefiles. +-- Must have Premake version 3 installed. +-- Original Premake was changed to remove some parameters and add others. +-- Default parameters: +-- premake3s --target gnu --os linux +-- But it can build windows gcc makefiles, and visual studio projects. +-- premake3s --target gnu --os windows +-- premake3s --target gnu --os macosx +-- premake3s --target vs6 +-- premake3s --target vs2002 +-- premake3s --target vs2003 +-- premake3s --target vs2005 +-- In Linux the generated makefiles will not correctly build libraries in 64-bits. +-- must add "-m64 -fPIC" flags +---------------------------------------------------- + +if (not options.target) then + options.target = "gnu" +end + +if (not options.os) then + if (options.target ~= "gnu") then + options.os = "windows" + else + options.os = "linux" + end +end + +function fixPackagePath(package_files) + if (options.os ~= "linux") then + for i, file in package_files do + package_files[i] = "../src/"..file + end + end +end + +function tremove(t, value) + local index = -1 + function f(i, v) + if (v == value) then + index = i + end + end + table.foreachi(t, f) + if (index ~= -1) then + table.remove(t, index) + end +end + +---------------------------------------------------- + +project.name = "iup" +project.bindir = "../bin" +project.libdir = "../lib" + +if (options.os ~= "linux") then + if (options.os == "macosx") then + project.path = "../mak.macosx" + else + project.path = "../mak."..options.target + end +end + +---------------------------------------------------- + +package = newpackage() +package.name = "iup" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + matchfiles("*.c") +} + +package.includepaths = { ".", "../include" } + +if (options.os == "windows") then + tinsert(package.files, matchfiles("win/*.c")) + tinsert(package.includepaths, {"win"}) + package.defines = {"_WIN32_WINNT=0x0400"} +else + tinsert(package.files, matchfiles("mot/*.c")) + tremove(package.files[2], "mot/ComboBox1.c") + tinsert(package.includepaths, {"mot", "/usr/X11R6/include"}) + package.defines = {"LINUX"} +end + +fixPackagePath(package.files) + +---------------------------------------------------- +---------------------------------------------------- +-- The main porpouse of this file is to build linux gcc makefiles. +-- Must have Premake version 3 installed. +-- Original Premake was changed to remove some parameters and add others. +-- Default parameters: +-- premake3s --target gnu --os linux +-- But it can build windows gcc makefiles, and visual studio projects. +-- premake3s --target gnu --os windows +-- premake3s --target gnu --os macosx +-- premake3s --target vs6 +-- premake3s --target vs2002 +-- premake3s --target vs2003 +-- premake3s --target vs2005 +-- In Linux the generated makefiles will not correctly build libraries in 64-bits. +-- must add "-m64 -fPIC" flags +---------------------------------------------------- + +if (not options.target) then + options.target = "gnu" +end + +if (not options.os) then + if (options.target ~= "gnu") then + options.os = "windows" + else + options.os = "linux" + end +end + +function fixPackagePath(package_files) + if (options.os ~= "linux") then + for i, file in package_files do + package_files[i] = "../src/"..file + end + end +end + +---------------------------------------------------- + +project.name = "iup" +project.bindir = "../bin" +project.libdir = "../lib" + +if (options.os ~= "linux") then + if (options.os == "macosx") then + project.path = "../mak.macosx" + else + project.path = "../mak."..options.target + end +end + +---------------------------------------------------- + +package = newpackage() +package.name = "iupcontrols" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + matchfiles("*.c"), + matchfiles("mask/*.c"), + matchfiles("matrix/*.c"), + matchfiles("tree/*.c"), + matchfiles("color/*.c") +} + +package.includepaths = { ".", "../include", "../src", "$(CD)/include" } + +if (options.os == "linux") then + package.defines = { "_MOTIF_" } + tinsert(package.includepaths, {"/usr/X11R6/include"}) +end + +fixPackagePath(package.files) + +---------------------------------------------------- +---------------------------------------------------- +-- The main porpouse of this file is to build linux gcc makefiles. +-- Must have Premake version 3 installed. +-- Original Premake was changed to remove some parameters and add others. +-- Default parameters: +-- premake3s --target gnu --os linux +-- But it can build windows gcc makefiles, and visual studio projects. +-- premake3s --target gnu --os windows +-- premake3s --target gnu --os macosx +-- premake3s --target vs6 +-- premake3s --target vs2002 +-- premake3s --target vs2003 +-- premake3s --target vs2005 +-- In Linux the generated makefiles will not correctly build libraries in 64-bits. +-- must add "-m64 -fPIC" flags +---------------------------------------------------- + +if (not options.target) then + options.target = "gnu" +end + +if (not options.os) then + if (options.target ~= "gnu") then + options.os = "windows" + else + options.os = "linux" + end +end + +function fixPackagePath(package_files) + if (options.os ~= "linux") then + for i, file in package_files do + package_files[i] = "../src/"..file + end + end +end + +---------------------------------------------------- + +project.name = "iup" +project.bindir = "../bin" +project.libdir = "../lib" + +if (options.os ~= "linux") then + if (options.os == "macosx") then + project.path = "../mak.macosx" + else + project.path = "../mak."..options.target + end +end + +---------------------------------------------------- + +package = newpackage() +package.name = "iupgl" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.includepaths = { ".", "../include" } + +if (options.os == "windows") then + package.files = { "iupglw.c" } +else + package.files = { "iupglx.c", "GL/GLwMDrawA.c" } + tinsert(package.includepaths, {"/usr/X11R6/include"}) +end + +fixPackagePath(package.files) + +---------------------------------------------------- +---------------------------------------------------- +-- The main porpouse of this file is to build linux gcc makefiles. +-- Must have Premake version 3 installed. +-- Original Premake was changed to remove some parameters and add others. +-- Default parameters: +-- premake3s --target gnu --os linux +-- But it can build windows gcc makefiles, and visual studio projects. +-- premake3s --target gnu --os windows +-- premake3s --target gnu --os macosx +-- premake3s --target vs6 +-- premake3s --target vs2002 +-- premake3s --target vs2003 +-- premake3s --target vs2005 +-- In Linux the generated makefiles will not correctly build libraries in 64-bits. +-- must add "-m64 -fPIC" flags +---------------------------------------------------- + +if (not options.target) then + options.target = "gnu" +end + +if (not options.os) then + if (options.target ~= "gnu") then + options.os = "windows" + else + options.os = "linux" + end +end + +function fixPackagePath(package_files) + if (options.os ~= "linux") then + for i, file in package_files do + package_files[i] = "../src/"..file + end + end +end + +---------------------------------------------------- + +project.name = "iup" +project.bindir = "../bin" +project.libdir = "../lib" + +if (options.os ~= "linux") then + if (options.os == "macosx") then + project.path = "../mak.macosx" + else + project.path = "../mak."..options.target + end +end + +---------------------------------------------------- + +package = newpackage() +package.name = "iupim" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.includepaths = { ".", "../include", "$(IM)/include" } + +package.files = { "iupim.c" } + +fixPackagePath(package.files) + +---------------------------------------------------- +---------------------------------------------------- +-- The main porpouse of this file is to build linux gcc makefiles. +-- Must have Premake version 3 installed. +-- Original Premake was changed to remove some parameters and add others. +-- Default parameters: +-- premake3s --target gnu --os linux +-- But it can build windows gcc makefiles, and visual studio projects. +-- premake3s --target gnu --os windows +-- premake3s --target gnu --os macosx +-- premake3s --target vs6 +-- premake3s --target vs2002 +-- premake3s --target vs2003 +-- premake3s --target vs2005 +-- In Linux the generated makefiles will not correctly build libraries in 64-bits. +-- must add "-m64 -fPIC" flags +---------------------------------------------------- + +if (not options.target) then + options.target = "gnu" +end + +if (not options.os) then + if (options.target ~= "gnu") then + options.os = "windows" + else + options.os = "linux" + end +end + +function fixPackagePath(package_files) + if (options.os ~= "linux") then + for i, file in package_files do + package_files[i] = "../src/"..file + end + end +end + +---------------------------------------------------- + +project.name = "iup" +project.bindir = "../bin" +project.libdir = "../lib" + +if (options.os ~= "linux") then + if (options.os == "macosx") then + project.path = "../mak.macosx" + else + project.path = "../mak."..options.target + end +end + +---------------------------------------------------- + +package = newpackage() +package.name = "ledc" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "exe" + +package.files = +{ + "lex.yy.c", "y.tab.c", "main.c" +} + +package.includepaths = { "." } + +fixPackagePath(package.files) + +---------------------------------------------------- +-- Utilities + +function printvars() + local n,v = nextvar(nil) + print("--printvars Start--") + while n ~= nil do + print(tostring(n).."="..tostring(v)) + n,v = nextvar(n) + end + print("--printvars End--") +end + +function printtable(t) + local n,v = next(t, nil) + print("--printtable Start--") + while n ~= nil do + print(tostring(n).."="..tostring(v)) + n,v = next(t, n) + end + print("--printtable End--") +end + +function print_version_info() + print(_VERSION .. " " .. iup._LUA_COPYRIGHT) + if (im) then print(im._VERSION .. " " .. im._COPYRIGHT) end + if (cd and cd._VERSION) then print(cd._VERSION .. " " .. cd._COPYRIGHT) end + print(iup._VERSION .. " " .. iup._COPYRIGHT) + print("") + print("IUP Info") + print(" System: " .. iup.GetGlobal("SYSTEM")) + print(" System Version: " .. iup.GetGlobal("SYSTEMVERSION")) + local mot = iup.GetGlobal("MOTIFVERSION") + if (mot) then print(" Motif Version: ", mot) end + print(" Screen Size: " .. iup.GetGlobal("SCREENSIZE")) + print(" Screen Depth: " .. iup.GetGlobal("SCREENDEPTH")) + if (iup.GL_VENDOR) then print(" OpenGL Vendor: " .. iup.GL_VENDOR) end + if (iup.GL_RENDERER) then print(" OpenGL Renderer: " .. iup.GL_RENDERER) end + if (iup.GL_VERSION) then print(" OpenGL Version: " .. iup.GL_VERSION) end +end + +-- IUPLUA Full Application + +lastfile = nil -- Last file open + +mulCommands = iupmultiline{expand=IUP_YES, size="200x120", font="COURIER_NORMAL_10"} +poslabel = iuplabel{title="0:0", size="50x"} +filelabel = iuplabel{title="", size="50x", expand="HORIZONTAL"} + +mulCommands.caretcb = function(self, lin, col) + poslabel.title = lin..":"..col +end + +butExecute = iupbutton{size="50x15", title = "Execute", action="dostring(mulCommands.value)"} +butClearCommands = iupbutton{size="50x15", title = "Clear", action = "mulCommands.value = '' filelabel.title = '' lastfile = nil"} +butLoadFile = iupbutton{size="50x15", title = "Load..."} +butSaveasFile = iupbutton{size="50x15", title = "Save As..."} +butSaveFile = iupbutton{size="50x15", title = "Save"} + +function butSaveFile:action() + if (lastfile == nil) then + butSaveasFile:action() + else + novoarq = openfile (lastfile, "w+") + if (novoarq ~= nil) then + write (novoarq,mulCommands.value) + closefile (novoarq) + else + error ("Cannot Save file "..filename) + end + end +end + +function butSaveasFile:action() + local filedlg = iupfiledlg{dialogtype = "SAVE", title = "Save File", filter = "*.lua", filterinfo = "Lua files",allownew=yes} + IupPopup(filedlg,IUP_LEFT, IUP_LEFT) + local status = filedlg.status + lastfile = filedlg.value + filelabel.title = lastfile + IupDestroy(filedlg) + if status ~= "-1" then + if (lastfile == nil) then + error ("Cannot Save file "..lastfile) + end + local novoarq = openfile (lastfile, "w+") + if (novoarq ~= nil) then + write (novoarq,mulCommands.value) + closefile (novoarq) + else + error ("Cannot Save file") + end + end +end + +function butLoadFile:action() + local filedlg = iupfiledlg{dialogtype="OPEN", title="Load File", filter="*.lua", filterinfo="Lua Files", allownew="NO"} + filedlg:popup(IUP_CENTER, IUP_CENTER) + local status = filedlg.status + local newfile = filedlg.value + IupDestroy(filedlg) + if (status == "-1") or (status == "1") then + if (status == "1") then + error ("Cannot load file "..newfile) + end + else + local fp = openfile (newfile, "r") + if (fp == nil) then + error ("Cannot load file "..newfile) + else + mulCommands.value = read (fp,"*a") + closefile (fp) + lastfile = newfile + filelabel.title = lastfile + end + end +end + +vbxConsole = iupvbox +{ + iupframe{iuphbox{iupvbox{butLoadFile, butSaveFile, butSaveasFile, butClearCommands, butExecute; margin="0x0", gap="10"}, iupvbox{filelabel, mulCommands, poslabel; alignment="ARIGHT"}; alignment="ATOP"}; title="Commands"} + ;alignment="ACENTER", margin="5x5", gap="5" +} + +-- Main Menu Definition. + +mnuMain = iupmenu +{ + iupsubmenu + { + iupmenu + { + iupitem{title="Exit", action="return IUP_CLOSE"} + }; title="File" + }, + iupsubmenu{iupmenu + { + iup.item{title="Print Version Info...", action=print_version_info}, + iupitem{title="About...", action="dlgAbout:popup(IUP_CENTER, IUP_CENTER)"} + };title="Help"} +} + +-- Main Dialog Definition. + +dlgMain = iupdialog{vbxConsole; title="Complete IupLua3 Interpreter", menu=mnuMain, close_cb = "return IUP_CLOSE"} + +-- About Dialog Definition. + +dlgAbout = iupdialog +{ + iupvbox + { + iuplabel{title="Complete IupLua3 Interpreter"}, + iupfill{size="5"}, + iupfill{size="5"}, + iupframe + { + iupvbox + { + iuplabel{title="Tecgraf/PUC-Rio"}, + iuplabel{title="Mark/Ovídio/Scuri"}, + iuplabel{title="iup@tecgraf.puc-rio.br"} + } + }, + iupfill{size="5"}, + iupbutton{title="OK", action="return IUP_CLOSE", size="50X20"} + ;margin="10x10", alignment="ACENTER" + } + ;maxbox=IUP_NO, minbox=IUP_NO, resize=IUP_NO, title="About" +} + +-- Displays the Main Dialog + +dlgMain:show() + +IupMainLoop() + +IupDestroy(dlgMain) +IupDestroy(dlgAbout) + +-- ################################################################################# +-- Constants +-- ################################################################################# + + +IUP_ERROR = 1 iup.ERROR = IUP_ERROR +IUP_NOERROR = 0 iup.NOERROR = IUP_NOERROR +IUP_OPENED = -1 iup.OPENED = IUP_OPENED +IUP_INVALID = -1 iup.INVALID = IUP_INVALID + +IUP_CENTER = 65535 iup.CENTER = IUP_CENTER +IUP_LEFT = 65534 iup.LEFT = IUP_LEFT +IUP_RIGHT = 65533 iup.RIGHT = IUP_RIGHT +IUP_MOUSEPOS = 65532 iup.MOUSEPOS = IUP_MOUSEPOS +IUP_CURRENT = 65531 iup.CURRENT = IUP_CURRENT +IUP_CENTERPARENT = 65530 iup.CENTERPARENT = IUP_CENTERPARENT +IUP_TOP = IUP_LEFT iup.TOP = IUP_TOP +IUP_BOTTOM = IUP_RIGHT iup.BOTTOM = IUP_BOTTOM +IUP_ANYWHERE = IUP_CURRENT iup.ANYWHERE = IUP_ANYWHERE + +IUP_BUTTON1 = 49 iup.BUTTON1 = IUP_BUTTON1 -- '1' +IUP_BUTTON2 = 50 iup.BUTTON2 = IUP_BUTTON2 -- '2' +IUP_BUTTON3 = 51 iup.BUTTON3 = IUP_BUTTON3 -- '3' +IUP_BUTTON4 = 52 iup.BUTTON4 = IUP_BUTTON4 -- '4' +IUP_BUTTON5 = 53 iup.BUTTON5 = IUP_BUTTON5 -- '5' + +IUP_IGNORE = -1 iup.IGNORE = IUP_IGNORE +IUP_DEFAULT = -2 iup.DEFAULT = IUP_DEFAULT +IUP_CLOSE = -3 iup.CLOSE = IUP_CLOSE +IUP_CONTINUE = -4 iup.CONTINUE = IUP_CONTINUE + +IUP_SBUP = 0 iup.SBUP = IUP_SBUP +IUP_SBDN = 1 iup.SBDN = IUP_SBDN +IUP_SBPGUP = 2 iup.SBPGUP = IUP_SBPGUP +IUP_SBPGDN = 3 iup.SBPGDN = IUP_SBPGDN +IUP_SBPOSV = 4 iup.SBPOSV = IUP_SBPOSV +IUP_SBDRAGV = 5 iup.SBDRAGV = IUP_SBDRAGV +IUP_SBLEFT = 6 iup.SBLEFT = IUP_SBLEFT +IUP_SBRIGHT = 7 iup.SBRIGHT = IUP_SBRIGHT +IUP_SBPGLEFT = 8 iup.SBPGLEFT = IUP_SBPGLEFT +IUP_SBPGRIGHT = 9 iup.SBPGRIGHT = IUP_SBPGRIGHT +IUP_SBPOSH = 10 iup.SBPOSH = IUP_SBPOSH +IUP_SBDRAGH = 11 iup.SBDRAGH = IUP_SBDRAGH + +IUP_SHOW = 0 iup.SHOW = IUP_SHOW +IUP_RESTORE = 1 iup.RESTORE = IUP_RESTORE +IUP_MINIMIZE = 2 iup.MINIMIZE = IUP_MINIMIZE +IUP_MAXIMIZE = 3 iup.MAXIMIZE = IUP_MAXIMIZE +IUP_HIDE = 4 iup.HIDE = IUP_HIDE + +RED = IupRGB(1, 0, 0) iup.RED = RED +GREEN = IupRGB(0, 1, 0) iup.GREEN = GREEN +BLUE = IupRGB(0, 0, 1) iup.BLUE = BLUE +BLACK = IupRGB(0, 0, 0) iup.BLACK = BLACK +WHITE = IupRGB(1, 1, 1) iup.WHITE = WHITE +YELLOW = IupRGB(1, 1, 0) iup.YELLOW = YELLOW + +IUP_ON = "ON" iup.ON = IUP_ON +IUP_OFF = "OFF" iup.OFF = IUP_OFF +IUP_YES = "YES" iup.YES = IUP_YES +IUP_NO = "NO" iup.NO = IUP_NO +IUP_APPEND = "APPEND" iup.APPEND = IUP_APPEND +IUP_VERTICAL = "VERTICAL" iup.VERTICAL = IUP_VERTICAL +IUP_HORIZONTAL ="HORIZONTAL" iup.HORIZONTAL =IUP_HORIZONTAL + +IUP_ACENTER = "ACENTER" iup.ACENTER = IUP_ACENTER +IUP_ALEFT = "ALEFT" iup.ALEFT = IUP_ALEFT +IUP_ARIGHT = "ARIGHT" iup.ARIGHT = IUP_ARIGHT +IUP_ATOP = "ATOP" iup.ATOP = IUP_ATOP +IUP_ABOTTOM = "ABOTTOM" iup.ABOTTOM = IUP_ABOTTOM + +IUP_NORTH = "NORTH" iup.NORTH = IUP_NORTH +IUP_SOUTH = "SOUTH" iup.SOUTH = IUP_SOUTH +IUP_WEST = "WEST" iup.WEST = IUP_WEST +IUP_EAST = "EAST" iup.EAST = IUP_EAST +IUP_NE = "NE" iup.NE = IUP_NE +IUP_SE = "SE" iup.SE = IUP_SE +IUP_NW = "NW" iup.NW = IUP_NW +IUP_SW = "SW" iup.SW = IUP_SW + +IUP_FULL = "FULL" iup.FULL = IUP_FULL +IUP_HALF = "HALF" iup.HALF = IUP_HALF +IUP_THIRD = "THIRD" iup.THIRD = IUP_THIRD +IUP_QUARTER = "QUARTER" iup.QUARTER = IUP_QUARTER +IUP_EIGHTH = "EIGHTH" iup.EIGHTH = IUP_EIGHTH + +IUP_ARROW = "ARROW" iup.ARROW = IUP_ARROW +IUP_BUSY = "BUSY" iup.BUSY = IUP_BUSY +IUP_RESIZE_N = "RESIZE_N" iup.RESIZE_N = IUP_RESIZE_N +IUP_RESIZE_S = "RESIZE_S" iup.RESIZE_S = IUP_RESIZE_S +IUP_RESIZE_E = "RESIZE_E" iup.RESIZE_E = IUP_RESIZE_E +IUP_RESIZE_W = "RESIZE_W" iup.RESIZE_W = IUP_RESIZE_W +IUP_RESIZE_NE = "RESIZE_NE" iup.RESIZE_NE = IUP_RESIZE_NE +IUP_RESIZE_NW = "RESIZE_NW" iup.RESIZE_NW = IUP_RESIZE_NW +IUP_RESIZE_SE = "RESIZE_SE" iup.RESIZE_SE = IUP_RESIZE_SE +IUP_RESIZE_SW = "RESIZE_SW" iup.RESIZE_SW = IUP_RESIZE_SW +IUP_MOVE = "MOVE" iup.MOVE = IUP_MOVE +IUP_HAND = "HAND" iup.HAND = IUP_HAND +IUP_NONE = "NONE" iup.NONE = IUP_NONE +IUP_IUP = "IUP" iup.IUP = IUP_IUP +IUP_CROSS = "CROSS" iup.CROSS = IUP_CROSS +IUP_PEN = "PEN" iup.PEN = IUP_PEN +IUP_TEXT = "TEXT" iup.TEXT = IUP_TEXT +IUP_RESIZE_C = "RESIZE_C" iup.RESIZE_C = IUP_RESIZE_C +IUP_OPENHAND = "OPENHAND" iup.OPENHAND = IUP_OPENHAND + +IUP_HELVETICA_NORMAL_8 = "HELVETICA_NORMAL_8" iup.HELVETICA_NORMAL_8 = IUP_HELVETICA_NORMAL_8 +IUP_HELVETICA_ITALIC_8 = "HELVETICA_ITALIC_8" iup.HELVETICA_ITALIC_8 = IUP_HELVETICA_ITALIC_8 +IUP_HELVETICA_BOLD_8 = "HELVETICA_BOLD_8" iup.HELVETICA_BOLD_8 = IUP_HELVETICA_BOLD_8 +IUP_HELVETICA_NORMAL_10 = "HELVETICA_NORMAL_10" iup.HELVETICA_NORMAL_10 = IUP_HELVETICA_NORMAL_10 +IUP_HELVETICA_ITALIC_10 = "HELVETICA_ITALIC_10" iup.HELVETICA_ITALIC_10 = IUP_HELVETICA_ITALIC_10 +IUP_HELVETICA_BOLD_10 = "HELVETICA_BOLD_10" iup.HELVETICA_BOLD_10 = IUP_HELVETICA_BOLD_10 +IUP_HELVETICA_NORMAL_12 = "HELVETICA_NORMAL_12" iup.HELVETICA_NORMAL_12 = IUP_HELVETICA_NORMAL_12 +IUP_HELVETICA_ITALIC_12 = "HELVETICA_ITALIC_12" iup.HELVETICA_ITALIC_12 = IUP_HELVETICA_ITALIC_12 +IUP_HELVETICA_BOLD_12 = "HELVETICA_BOLD_12" iup.HELVETICA_BOLD_12 = IUP_HELVETICA_BOLD_12 +IUP_HELVETICA_NORMAL_14 = "HELVETICA_NORMAL_14" iup.HELVETICA_NORMAL_14 = IUP_HELVETICA_NORMAL_14 +IUP_HELVETICA_ITALIC_14 = "HELVETICA_ITALIC_14" iup.HELVETICA_ITALIC_14 = IUP_HELVETICA_ITALIC_14 +IUP_HELVETICA_BOLD_14 = "HELVETICA_BOLD_14" iup.HELVETICA_BOLD_14 = IUP_HELVETICA_BOLD_14 +IUP_COURIER_NORMAL_8 = "COURIER_NORMAL_8" iup.COURIER_NORMAL_8 = IUP_COURIER_NORMAL_8 +IUP_COURIER_ITALIC_8 = "COURIER_ITALIC_8" iup.COURIER_ITALIC_8 = IUP_COURIER_ITALIC_8 +IUP_COURIER_BOLD_8 = "COURIER_BOLD_8" iup.COURIER_BOLD_8 = IUP_COURIER_BOLD_8 +IUP_COURIER_NORMAL_10 = "COURIER_NORMAL_10" iup.COURIER_NORMAL_10 = IUP_COURIER_NORMAL_10 +IUP_COURIER_ITALIC_10 = "COURIER_ITALIC_10" iup.COURIER_ITALIC_10 = IUP_COURIER_ITALIC_10 +IUP_COURIER_BOLD_10 = "COURIER_BOLD_10" iup.COURIER_BOLD_10 = IUP_COURIER_BOLD_10 +IUP_COURIER_NORMAL_12 = "COURIER_NORMAL_12" iup.COURIER_NORMAL_12 = IUP_COURIER_NORMAL_12 +IUP_COURIER_ITALIC_12 = "COURIER_ITALIC_12" iup.COURIER_ITALIC_12 = IUP_COURIER_ITALIC_12 +IUP_COURIER_BOLD_12 = "COURIER_BOLD_12" iup.COURIER_BOLD_12 = IUP_COURIER_BOLD_12 +IUP_COURIER_NORMAL_14 = "COURIER_NORMAL_14" iup.COURIER_NORMAL_14 = IUP_COURIER_NORMAL_14 +IUP_COURIER_ITALIC_14 = "COURIER_ITALIC_14" iup.COURIER_ITALIC_14 = IUP_COURIER_ITALIC_14 +IUP_COURIER_BOLD_14 = "COURIER_BOLD_14" iup.COURIER_BOLD_14 = IUP_COURIER_BOLD_14 +IUP_TIMES_NORMAL_8 = "TIMES_NORMAL_8" iup.TIMES_NORMAL_8 = IUP_TIMES_NORMAL_8 +IUP_TIMES_ITALIC_8 = "TIMES_ITALIC_8" iup.TIMES_ITALIC_8 = IUP_TIMES_ITALIC_8 +IUP_TIMES_BOLD_8 = "TIMES_BOLD_8" iup.TIMES_BOLD_8 = IUP_TIMES_BOLD_8 +IUP_TIMES_NORMAL_10 = "TIMES_NORMAL_10" iup.TIMES_NORMAL_10 = IUP_TIMES_NORMAL_10 +IUP_TIMES_ITALIC_10 = "TIMES_ITALIC_10" iup.TIMES_ITALIC_10 = IUP_TIMES_ITALIC_10 +IUP_TIMES_BOLD_10 = "TIMES_BOLD_10" iup.TIMES_BOLD_10 = IUP_TIMES_BOLD_10 +IUP_TIMES_NORMAL_12 = "TIMES_NORMAL_12" iup.TIMES_NORMAL_12 = IUP_TIMES_NORMAL_12 +IUP_TIMES_ITALIC_12 = "TIMES_ITALIC_12" iup.TIMES_ITALIC_12 = IUP_TIMES_ITALIC_12 +IUP_TIMES_BOLD_12 = "TIMES_BOLD_12" iup.TIMES_BOLD_12 = IUP_TIMES_BOLD_12 +IUP_TIMES_NORMAL_14 = "TIMES_NORMAL_14" iup.TIMES_NORMAL_14 = IUP_TIMES_NORMAL_14 +IUP_TIMES_ITALIC_14 = "TIMES_ITALIC_14" iup.TIMES_ITALIC_14 = IUP_TIMES_ITALIC_14 +IUP_TIMES_BOLD_14 = "TIMES_BOLD_14" iup.TIMES_BOLD_14 = IUP_TIMES_BOLD_14 + + + +-- ################################################################################# +-- Private functions +-- ################################################################################# + +-- maps Ihandles into Lua objects +iup_handles = {} + +settagmethod(iuplua_tag, "gettable", iup_gettable) +settagmethod(iuplua_tag, "settable", iup_settable) +settagmethod (tag({}), "index", iup_index) + +function _ALERT(s) + local bt = iupbutton{title="Ok", size="60", action="return IUP_CLOSE"} + local ml = iupmultiline{expand="YES", readonly="YES", value=s, size="300x150"} + local vb = iupvbox{ml, bt; alignment="ACENTER", margin="10x10", gap="10"} + local dg = iupdialog{vb; title="Lua Error",defaultesc=bt,defaultenter=bt,startfocus=bt} + dg:popup(IUP_CENTER, IUP_CENTER) + dg:destroy() +end + +function type_string (o) + return type(o) == "string" +end + +function type_number (o) + return type(o) == "number" +end + +function type_nil (o) + return type(o) == "nil" +end + +function type_function (o) + return type(o) == "function" +end + +function type_widget(w) + if w then + return iup_handles[w] + else + return nil + end +end + +function type_menu (o) + return type_widget(o) and (o.parent==IUPMENU) +end + +function type_item (o) + return type_widget(o) and (o.parent==IUPITEM or o.parent==IUPSUBMENU or o.parent==IUPSEPARATOR) +end + +function iupCallMethod(name, ...) + local handle = arg[1] -- always the handle + + local func = handle[name] -- this is the old name + if (not func) then + local full_name = strlower(iup_callbacks[name][1]) + func = handle[full_name] -- check also for the full name + + if (not func) then + return + end + end + + if type_function (func) then + return call(func, arg) + elseif type_string(func) then + local temp = self + self = handle + local result = dostring(func) + self = temp + return result + else + return IUP_ERROR + end +end + +function iupSetName (handle) + if not type_string(iup_handles[handle].IUP_name) then + iup_handles[handle].IUP_name = format("_IUPLUA_NAME(%s)", tostring(handle)) + IupSetHandle(handle.IUP_name, handle) + end +end + +function iupCreateChildrenNames (obj) + if obj.parent.parent == COMPOSITION then + local i = 1 + while obj[i] do + iupCreateChildrenNames (obj[i]) + i = i+1 + end + elseif obj.parent == IUPFRAME then + iupCreateChildrenNames (obj[1]) + else + iupSetName (obj) + end +end + + +-- ################################################################################# +-- Public Functions +-- ################################################################################# + + +function IupRGB (red, green, blue) + return floor(red*255).." "..floor(green*255).." "..floor(blue*255) +end +iup.RGB = IupRGB + +function IupRegisterHandle(handle, typename) + if not iup_handles[handle] then + local obj = getglobal("IUP"..strupper(typename)) + if not obj then + obj = WIDGET + end + iup_handles[handle] = { parent=obj, handle=handle } + end + return handle +end +iup.RegisterHandle = IupRegisterHandle + +function IupGetFromC(obj) + local handle = IupGetHandle(obj[1]) + return IupRegisterHandle(handle, IupGetType(handle)) +end + +iup.GetFromC = function (name) + local handle = IupGetHandle(name) + return IupRegisterHandle(handle, IupGetType(handle)) +end + + +-- ################################################################################# +-- Widgets +-- ################################################################################# + + +-- "type" is used to check the type of each parameter in the creation table +WIDGET = {type = {}} + +-- called by the iupxxx functions +-- obj is a lua table +function WIDGET:Constructor(obj) + -- the parent of the table is the widget class used to create the control + obj.parent = self + + -- check the table parameters + self:checkParams(obj) + + -- create the IUP control, calling iupCreateXXX + obj.handle = self:CreateIUPelement(obj) + + -- set the parameters that are attributes + self:setAttributes(obj) + + -- save the table indexed by the handle + iup_handles[obj.handle] = obj + + -- the returned value is the handle, not the table + return obj.handle +end + +function WIDGET:checkParams (obj) + local type = self.type + local param, func = next(type, nil) + while param do + if not func(obj[param]) then + error("parameter " .. param .. " has wrong value or is not initialized") + end + param, func = next(type, param) + end +end + +function WIDGET:setAttributes (obj) + local temp = {} + local f = next(obj, nil) + while f do + temp[f] = 1 + f = next(obj, f) + end + f = next(temp, nil) + while f do + obj:set (f, obj[f]) + f = next(temp, f) + end +end + +function WIDGET:get(index) + if type_string (index) then + if (iup_callbacks[index]) then + return self[index] + else + local INDEX = strupper (index) + local value = IupGetAttribute (self.handle, INDEX) + if value then + local handle = IupGetHandle (value) + if handle then + return handle + else + return value + end + end + end + end + return self[index] +end + +function WIDGET:set(index, value) + if type_string (index) then + local INDEX = strupper (index) + local cb = iup_callbacks[index] + + -- workaround for resize attribute in dialog + if (index == "resize" and IupGetType(self.handle) == "dialog") then + cb = nil + end + + if (cb) then + local func = cb[2] + if (not func) then + func = cb[IupGetType(self.handle)] + end + iupSetCallback(self.handle, cb[1], func, value) + self[index] = value + return + elseif type_string(value) or type_number(value) then + IupSetAttribute(self.handle, INDEX, value) + return + elseif type_nil(value) then + local old_value = IupGetAttribute(self.handle, INDEX) + if old_value then + IupSetAttribute(self.handle, INDEX, value) + return + end + elseif type_widget(value) then + iupSetName(value) + IupSetAttribute(self.handle, INDEX, value.IUP_name) + return + end + end + self[index] = value +end + +function WIDGET:r_destroy() + local i = 1 + local elem = self[i] + while elem do + if type_widget (elem) and elem.IUP_parent then + if elem.IUP_parent == self then + elem.IUP_parent = nil + elem:r_destroy () + else -- wrong parent + error ("Internal table inconsistency") + exit() + end + end + + i = i + 1 + elem = self[i] + end + iup_handles[self] = nil +end + +function WIDGET:destroy() + self:r_destroy () + IupDestroy (self) +end + +function WIDGET:detach() + IupDetach (self) + local parent = self.IUP_parent + if parent then + self.IUP_parent = nil + local i = 1 + while parent[i] do + if parent[i] == self then + while parent[i+1] do + parent[i] = parent[i+1] + i = i+1 + end + parent[i] = nil + return + end + i = i+1 + end + end +end + +function WIDGET:append(o) + if IupAppend (self, o) then + o.IUP_parent = self + local i = 1 + while self[i] do + if self[i] == o then + return i + end + i = i+1 + end + iup_handles[self][i] = o + return i + else + return nil + end +end + +function WIDGET:map() + return IupMap(self) +end + +function WIDGET:hide() + return IupHide(self) +end + + +-- ############### +IUPTIMER = {parent = WIDGET} + +function IUPTIMER:CreateIUPelement (obj) + return iupCreateTimer() +end + +function iuptimer(o) + return IUPTIMER:Constructor(o) +end +iup.timer = iuptimer + + +-- ############### +IUPDIALOG = {parent = WIDGET, type = {type_widget}} + +function IUPDIALOG:CreateIUPelement (obj) + local handle = iupCreateDialog(obj[1]) + obj[1].IUP_parent = handle + return handle +end + +function IUPDIALOG:show () + return IupShow(self) +end + +function IUPDIALOG:showxy (x,y) + return IupShowXY(self, x, y) +end + +function IUPDIALOG:popup (x, y) + return IupPopup (self, x, y) +end + +function iupdialog (o) + return IUPDIALOG:Constructor (o) +end +iup.dialog = iupdialog + + +-- ############### +IUPRADIO = {parent = WIDGET, type = {type_widget}} + +function IUPRADIO:CreateIUPelement (obj) + local handle = iupCreateRadio (obj[1]) + obj[1].IUP_parent = handle + return handle +end + +function iupradio (o) + local handle = IUPRADIO:Constructor (o) + iupCreateChildrenNames (handle[1]) + return handle +end +iup.radio = iupradio + +-- OLD STUFF +function edntoggles (h) + local tmp = {} + local i = 1 + while h[i] do + if type_string (h[i]) then + tmp[i] = iuptoggle{title = h[i], action = h.action} + else + error ("option "..i.." must be a string") + end + i = i + 1 + end + + if h.value then + local j = 1 + while h[j] and (h[j] ~= h.value) do + j = j + 1 + end + if h[j] then + tmp.value = tmp[j] + end + elseif h.nvalue then + tmp.value = tmp[h.nvalue] + end + + return tmp +end + +-- OLD STUFF +function edhradio (o) + local toggles = edntoggles (o) + return iupradio{edhbox (toggles); value = toggles.value} +end + +-- OLD STUFF +function edvradio (o) + local toggles = edntoggles (o) + return iupradio{edvbox (toggles); value = toggles.value} +end + + +-- ############### +IUPMENU = {parent = WIDGET} + +function IUPMENU:checkParams (obj) + local i = 1 + while obj[i] do + local o = obj[i] + if not type_item (o) then -- not a menu item + if type (o) ~= 'table' then + error("parameter " .. i .. " is not a table nor a menu item") + elseif (o[1] and not type_string (o[1])) then + error("parameter " .. i .. " does not have a string title") + elseif (o[2] and not type_string (o[2]) and not type_function (o[2]) + and not type_widget (o[2])) then + error("parameter " .. i .. " does not have an action nor a menu") + end + end + i = i + 1 + end +end + +function IUPMENU:CreateIUPelement (obj) + local handle = iupCreateMenu () + local i = 1 + while obj[i] do + local o = obj[i] + local elem + if type_widget (o) then -- predefined + elem = o + elseif not o[1] then -- Separator + elem = iupseparator {} + elseif type_widget (o[2]) then -- SubMenu + o.title = o[1] + o[1] = o[2] + o[2] = nil + elem = iupsubmenu(o) + else -- Item + o.title = o[1] + o.action = o[2] + o[1] = nil + o[2] = nil + elem = iupitem(o) + end + IupAppend (handle, elem) + elem.IUP_parent = handle + obj[i] = elem + i = i + 1 + end + return handle +end + +function iupmenu (o) + return IUPMENU:Constructor (o) +end +iup.menu = iupmenu + +function IUPMENU:popup (x, y) + return IupPopup (self, x, y) +end + + +-- ############### +COMPOSITION = {parent = WIDGET} + +function COMPOSITION:checkParams (obj) + local i = 1 + while obj[i] do + if not type_widget (obj[i]) then + error("parameter " .. i .. " has wrong value or is not initialized") + end + i = i + 1 + end +end + +function COMPOSITION:CreateIUPelement (obj) + local handle = self:CreateBoxElement () + local filled = obj.filled + local i = 1 + local n = 0 + while obj[i] do + n = n + 1 + i = i + 1 + end + i = 1 + + if filled == IUP_YES then + obj[i+n] = iupfill{} + IupAppend (handle, obj[i+n]) + obj[i+n].IUP_parent = handle + end + + while i <= n do + IupAppend (handle, obj[i]) + obj[i].IUP_parent = handle + i = i + 1 + if filled == IUP_YES then + obj[i+n] = iupfill{} + IupAppend (handle, obj[i+n]) + obj[i+n].IUP_parent = handle + end + end + return handle +end + + +-- ############### +IUPHBOX = {parent = COMPOSITION} + +function IUPHBOX:CreateBoxElement () + return iupCreateHbox () +end + +function iuphbox (o) + return IUPHBOX:Constructor (o) +end +iup.hbox = iuphbox + +-- OLD STUFF +function edhbox (o) + o.filled = IUP_YES + return IUPHBOX:Constructor (o) +end + +-- OLD STUFF +function edfield (f) + local l, t + if (type_string (f.prompt) or type_number (f.prompt)) then + l = iuplabel {title = f.prompt} + else + error ("parameter prompt has wrong value or is not initialized") + end + if f.value then + t = iuptext {value = f.value} + else + t = iuptext {value = f.nvalue} + end + if t and l then + return edhbox {l, t} + else + return nil + end +end + + +-- ############### +IUPVBOX = {parent = COMPOSITION} + +function IUPVBOX:CreateBoxElement () + return iupCreateVbox () +end + +function iupvbox (o) + return IUPVBOX:Constructor (o) +end +iup.vbox = iupvbox + +-- OLD STUFF +function edvbox (o) + o.filled = IUP_YES + return IUPVBOX:Constructor (o) +end + + +-- ############### +IUPZBOX = {parent = COMPOSITION} + +function IUPZBOX:CreateBoxElement () + return iupCreateZbox () +end + +function iupzbox (obj) + local handle = IUPZBOX:Constructor (obj) + local i = 1 + while obj[i] do + iupSetName(handle[i]) + i = i+1 + end + return handle +end +iup.zbox = iupzbox + + +-- ############### +IUPFILL = {parent = WIDGET} + +function IUPFILL:CreateIUPelement (obj) + return iupCreateFill () +end + +function iupfill (o) + return IUPFILL:Constructor (o) +end +iup.fill = iupfill + + +-- ############### +IUPBUTTON = {parent = WIDGET, type = {title = type_string}} + +function IUPBUTTON:CreateIUPelement (obj) + if not obj.title and obj.image then + obj.title='' + end + return iupCreateButton(obj.title) +end + +function iupbutton (o) + return IUPBUTTON:Constructor (o) +end +iup.button = iupbutton + + +-- ############### +IUPTEXT = {parent = WIDGET} + +function IUPTEXT:CreateIUPelement (obj) + return iupCreateText() +end + +function iuptext (o) + return IUPTEXT:Constructor (o) +end +iup.text = iuptext + + +-- ############### +IUPMULTILINE = {parent = IUPTEXT} + +function IUPMULTILINE:CreateIUPelement (obj) + return iupCreateMultiLine() +end + +function iupmultiline (o) + return IUPMULTILINE:Constructor (o) +end +iup.multiline = iupmultiline + + +-- ############### +IUPLABEL = {parent = WIDGET, type = {title = type_string}} + +function IUPLABEL:CreateIUPelement (obj) + if not obj.title and obj.image then + obj.title='' + end + return iupCreateLabel (obj.title) +end + +function iuplabel (o) + return IUPLABEL:Constructor (o) +end +iup.label = iuplabel + + +-- ############### +IUPTOGGLE = {parent = IUPBUTTON} + +function IUPTOGGLE:CreateIUPelement (obj) + return iupCreateToggle (obj.title) +end + +function iuptoggle (o) + return IUPTOGGLE:Constructor (o) +end +iup.toggle = iuptoggle + + +-- ############### +IUPITEM = {parent = IUPBUTTON} + +function IUPITEM:CreateIUPelement (obj) + return iupCreateItem (obj.title) +end + +function iupitem (o) + return IUPITEM:Constructor (o) +end +iup.item = iupitem + + +-- ############### +IUPSUBMENU = {parent = WIDGET, type = {type_menu; title = type_string}} + +function IUPSUBMENU:CreateIUPelement (obj) + local h = iupCreateSubmenu (obj.title, obj[1]) + obj[1].IUP_parent = h + return h +end + +function iupsubmenu (o) + return IUPSUBMENU:Constructor (o) +end +iup.submenu = iupsubmenu + + +-- ############### +IUPSEPARATOR = {parent = WIDGET} + +function IUPSEPARATOR:CreateIUPelement (obj) + return iupCreateSeparator () +end + +function iupseparator (o) + return IUPSEPARATOR:Constructor (o) +end +iup.separator = iupseparator + + +-- ############### +IUPFILEDLG = {parent = WIDGET} + +function IUPFILEDLG:popup (x, y) + return IupPopup (self, x, y) +end + +function IUPFILEDLG:CreateIUPelement () + return iupCreateFileDlg () +end + +function iupfiledlg (o) + return IUPFILEDLG:Constructor (o) +end +iup.filedlg = iupfiledlg + + +-- ############### +IUPMESSAGEDLG = {parent = WIDGET} + +function IUPMESSAGEDLG:popup (x, y) + return IupPopup (self, x, y) +end + +function IUPMESSAGEDLG:CreateIUPelement () + return iupCreateMessageDlg () +end + +function iupmessagedlg (o) + return IUPMESSAGEDLG:Constructor (o) +end +iup.messagedlg = iupmessagedlg + + +-- ############### +IUPCOLORDLG = {parent = WIDGET} + +function IUPCOLORDLG:popup (x, y) + return IupPopup (self, x, y) +end + +function IUPCOLORDLG:CreateIUPelement () + return iupCreateColorDlg () +end + +function iupcolordlg (o) + return IUPCOLORDLG:Constructor (o) +end +iup.colordlg = iupcolordlg + + +-- ############### +IUPFONTDLG = {parent = WIDGET} + +function IUPFONTDLG:popup (x, y) + return IupPopup (self, x, y) +end + +function IUPFONTDLG:CreateIUPelement () + return iupCreateFontDlg () +end + +function iupfontdlg (o) + return IUPFONTDLG:Constructor (o) +end +iup.fontdlg = iupfontdlg + + +-- ############### +IUPUSER = {parent = WIDGET} + +function IUPUSER:CreateIUPelement () + return iupCreateUser () +end + +function iupuser () + return IUPUSER:Constructor () +end +iup.user = iupuser + + +-- ############### +IUPFRAME = {parent = WIDGET, type = {type_widget}} + +function IUPFRAME:CreateIUPelement (obj) + local h = iupCreateFrame (obj[1]) + obj[1].IUP_parent = h + return h +end + +function iupframe (o) + return IUPFRAME:Constructor (o) +end +iup.frame = iupframe + + +-- ############### +IUPCANVAS = {parent = WIDGET} + +function IUPCANVAS:CreateIUPelement (obj) + return iupCreateCanvas () +end + +function iupcanvas (o) + return IUPCANVAS:Constructor (o) +end +iup.canvas = iupcanvas + + +-- ############### +IUPLIST = {parent = WIDGET} + +function IUPLIST:CreateIUPelement (obj) + return iupCreateList () +end + +function IUPLIST:get(index) + if type (index) == 'number' then + return IupGetAttribute (self.handle, ""..index) + else + return WIDGET.get(self, index) + end +end + +function IUPLIST:set (index, value) + if type (index) == 'number' then + if (type_string (value) or type_number (value)) then + return IupSetAttribute (self.handle, ""..index, ""..value) + elseif value == nil then + return IupSetAttribute (self.handle, ""..index, value) + end + end + return WIDGET.set(self, index, value) +end + +function iuplist (o) + return IUPLIST:Constructor (o) +end +iup.list = iuplist + + +-- ############### +IUPIMAGE = {parent = WIDGET} + +function IUPIMAGE:checkParams (obj) + local i = 1 + while obj[i] do + local j = 1 + while obj[i][j] do + if type (obj[i][j]) ~= 'number' then + error ("non-numeric value in image definition") + end + j = j + 1 + end + + if obj.width and (j - 1) ~= obj.width then + error ("inconsistent image lenght") + else + obj.width = j - 1 + end + + i = i + 1 + end + + obj.height = i - 1 +end + +function IUPIMAGE:CreateIUPelement (obj) + local handle = iupCreateImage (obj.width, obj.height, obj) + if type (obj.colors) == 'table' then + local i = 1 + while obj.colors[i] do + IupSetAttribute (handle, i, obj.colors[i]) + i = i + 1 + end + end + return handle +end + +function iupimage (o) + return IUPIMAGE:Constructor (o) +end +iup.image = iupimage + + +IUPIMAGERGB = {parent = WIDGET} + +function IUPIMAGERGB:CreateIUPelement (obj) + return iupCreateImageRGB(obj.width, obj.height, obj.pixels) +end + +function iupimagergb (o) + return IUPIMAGERGB:Constructor (o) +end +iup.imagergb = iupimagergb + + +IUPIMAGERGBA = {parent = WIDGET} + +function IUPIMAGERGBA:CreateIUPelement (obj) + return iupCreateImageRGBA(obj.width, obj.height, obj.pixels) +end + +function iupimagergba (o) + return IUPIMAGERGBA:Constructor (o) +end +iup.imagergba = iupimagergba + + +-- ################################################################################# +-- Callbacks +-- ################################################################################# + + +-- global list of callbacks +-- index is the Lua callback name +-- each callback contains the full name, and the C callback +iup_callbacks = +{ + action = {"ACTION", nil}, + actioncb = {"ACTION_CB", nil}, + getfocus = {"GETFOCUS_CB", iup_getfocus_cb}, + killfocus = {"KILLFOCUS_CB", iup_killfocus_cb}, + focus = {"FOCUS_CB", iup_focus_cb}, + k_any = {"K_ANY", iup_k_any}, + help = {"HELP_CB", iup_help_cb}, + caretcb = {"CARET_CB", iup_caret_cb}, + keypress = {"KEYPRESS_CB", iup_keypress_cb}, + scroll = {"SCROLL_CB", iup_scroll_cb}, + trayclick = {"TRAYCLICK_CB", iup_trayclick_cb}, + close = {"CLOSE_CB", iup_close_cb}, + open = {"OPEN_CB", iup_open_cb}, + showcb = {"SHOW_CB", iup_show_cb}, + mapcb = {"MAP_CB", iup_map_cb}, + dropfiles = {"DROPFILES_CB", iup_dropfiles_cb}, + menuclose = {"MENUCLOSE_CB", iup_menuclose_cb}, + highlight = {"HIGHLIGHT_CB", iup_highlight_cb}, + wom = {"WOM_CB", iup_wom_cb}, + wheel = {"WHEEL_CB", iup_wheel_cb}, + button = {"BUTTON_CB", iup_button_cb}, + resize = {"RESIZE_CB", iup_resize_cb}, + motion = {"MOTION_CB", iup_motion_cb}, + enterwindow = {"ENTERWINDOW_CB", iup_enterwindow_cb}, + leavewindow = {"LEAVEWINDOW_CB", iup_leavewindow_cb}, + edit = {"EDIT_CB", iup_edit_cb}, + multiselect = {"MULTISELECT_CB", iup_multiselect_cb}, + filecb = {"FILE_CB", iup_file_cb}, + mdiactivatecb = {"MDIACTIVATE_CB", iup_mdiactivate_cb}, +} + +iup_callbacks.action.toggle = iup_action_toggle +iup_callbacks.action.multiline = iup_action_text +iup_callbacks.action.text = iup_action_text +iup_callbacks.action.button = iup_action_button +iup_callbacks.action.list = iup_action_list +iup_callbacks.action.item = iup_action_button +iup_callbacks.action.canvas = iup_action_canvas + +-- must set here because it is also used elsewhere with a different signature +iup_callbacks.actioncb.timer = iup_action_timer + +-- aliases for the full names +iup_callbacks.action_cb = iup_callbacks.actioncb +iup_callbacks.getfocus_cb = iup_callbacks.getfocus +iup_callbacks.killfocus_cb = iup_callbacks.killfocus +iup_callbacks.focus_cb = iup_callbacks.focus +iup_callbacks.k_any = iup_callbacks.k_any +iup_callbacks.help_cb = iup_callbacks.help +iup_callbacks.caret_cb = iup_callbacks.caretcb +iup_callbacks.keypress_cb = iup_callbacks.keypress +iup_callbacks.scroll_cb = iup_callbacks.scroll +iup_callbacks.trayclick_cb = iup_callbacks.trayclick +iup_callbacks.close_cb = iup_callbacks.close +iup_callbacks.open_cb = iup_callbacks.open +iup_callbacks.show_cb = iup_callbacks.showcb +iup_callbacks.map_cb = iup_callbacks.mapcb +iup_callbacks.dropfiles_cb = iup_callbacks.dropfiles +iup_callbacks.menuclose_cb = iup_callbacks.menuclose +iup_callbacks.highlight_cb = iup_callbacks.highlight +iup_callbacks.wom_cb = iup_callbacks.wom +iup_callbacks.wheel_cb = iup_callbacks.wheel +iup_callbacks.button_cb = iup_callbacks.button +iup_callbacks.resize_cb = iup_callbacks.resize +iup_callbacks.motion_cb = iup_callbacks.motion +iup_callbacks.enterwindow_cb = iup_callbacks.enterwindow +iup_callbacks.leavewindow_cb = iup_callbacks.leavewindow +iup_callbacks.edit_cb = iup_callbacks.edit +iup_callbacks.multiselect_cb = iup_callbacks.multiselect +iup_callbacks.mdiactivate_cb = iup_callbacks.mdiactivatecb +iup_callbacks.file_cb = iup_callbacks.filecb +IUPCOLORBROWSER = {parent = WIDGET} + +function IUPCOLORBROWSER:CreateIUPelement(obj) + return iupCreateColorBrowser(obj) +end + +function iupcolorbrowser (o) + return IUPCOLORBROWSER:Constructor (o) +end +iup.colorbrowser = iupcolorbrowser + + +iup_callbacks.drag = {"DRAG_CB", iup_colorbrowser_drag_cb} +iup_callbacks.change = {"CHANGE_CB", iup_colorbrowser_change_cb} + +iup_callbacks.drag_cb = iup_callbacks.drag +iup_callbacks.change_cb = iup_callbacks.change +IUPCELLS = {parent = WIDGET} + +function IUPCELLS:CreateIUPelement( obj ) + return iupCreateCells() +end + +function IUPCELLS:redraw() + self.repaint = IUP_YES +end + +function iupcells(o) + return IUPCELLS:Constructor(o) +end +iup.cells = iupcells + + +-- iup_callbacks.draw_cb = iup_callbacks.draw = {"DRAW_CB", iup_mat_draw_cb} -- same callback at IupMatrix + +iup_callbacks.mouseclick = {"MOUSECLICK_CB", iup_cells_mouseclick_cb} +iup_callbacks.mousemotion = {"MOUSEMOTION_CB", iup_cells_mousemotion_cb} +iup_callbacks.scrolling = {"SCROLLING_CB", iup_cells_scrolling_cb} +iup_callbacks.width = {"WIDTH_CB", iup_cells_width_cb} +iup_callbacks.height = {"HEIGHT_CB", iup_cells_height_cb} +iup_callbacks.nlines = {"NLINES_CB", iup_cells_nlines_cb} +iup_callbacks.ncols = {"NCOLS_CB", iup_cells_ncols_cb} +iup_callbacks.hspan = {"HSPAN_CB", iup_cells_hspan_cb} +iup_callbacks.vspan = {"VSPAN_CB", iup_cells_vspan_cb} + +iup_callbacks.mouseclick_cb = iup_callbacks.mouseclick +iup_callbacks.mousemotion_cb = iup_callbacks.mousemotion +iup_callbacks.scrolling_cb = iup_callbacks.scrolling +iup_callbacks.width_cb = iup_callbacks.width +iup_callbacks.height_cb = iup_callbacks.height +iup_callbacks.nlines_cb = iup_callbacks.nlines +iup_callbacks.ncols_cb = iup_callbacks.ncols +iup_callbacks.hspan_cb = iup_callbacks.hspan +iup_callbacks.vspan_cb = iup_callbacks.vspan +IUPCOLORBAR = {parent = WIDGET} + +function IUPCOLORBAR:CreateIUPelement(obj) + return iupCreateColorbar(obj) +end + +function iupcolorbar (o) + return IUPCOLORBAR:Constructor (o) +end +iup.colorbar = iupcolorbar + + +iup_callbacks.cellcb = {"CELL_CB", iup_colorbar_cell_cb} +iup_callbacks.selectcb = {"SELECT_CB", iup_colorbar_select_cb} +iup_callbacks.switchcb = {"SWITCH_CB", iup_colorbar_switch_cb} +iup_callbacks.extendedcb = {"EXTENDED_CB", iup_colorbar_extended_cb} + +iup_callbacks.cell_cb = iup_callbacks.cellcb +iup_callbacks.select_cb = iup_callbacks.selectcb +iup_callbacks.switch_cb = iup_callbacks.switchcb +iup_callbacks.extended_cb = iup_callbacks.extendedcb +IUPDIAL = {parent = WIDGET} + +function IUPDIAL:CreateIUPelement (obj) + return iupCreateDial (obj[1]) +end + +function iupdial (o) + return IUPDIAL:Constructor (o) +end +iup.dial = iupdial + +iup_callbacks.mousemove.dial = iup_val_mousemove_cb -- same callback at IupVal + +-- iup_callbacks.buttonpress = {"BUTTON_PRESS_CB", iup_val_button_press_cb} -- same callback at IupVal +-- iup_callbacks.buttonrelease = {"BUTTON_RELEASE_CB", iup_val_button_release_cb} -- same callback at IupVal +IUPGAUGE = {parent = WIDGET} + +function IUPGAUGE:CreateIUPelement (obj) + return iupCreateGauge () +end + +function iupgauge (o) + return IUPGAUGE:Constructor (o) +end +iup.gauge = iupgauge +IUPMATRIX = {parent = WIDGET} + +function IUPMATRIX:CreateIUPelement (obj) + return iupCreateMatrix () +end + +function IUPMATRIX:setcell(l,c,val) + IupSetAttribute(self,l..":"..c,val) +end + +function IUPMATRIX:getcell(l,c,val) + return IupGetAttribute(self,l..":"..c) +end + +function iupmatrix (o) + return IUPMATRIX:Constructor (o) +end +iup.matrix = iupmatrix + + +iup_callbacks.actioncb.matrix = iup_mat_action_cb +iup_callbacks.mousemove.matrix = iup_mat_mousemove_cb + +iup_callbacks.edition = {"EDITION_CB", iup_mat_edition_cb} +iup_callbacks.drop = {"DROP_CB", iup_mat_drop_cb} +iup_callbacks.dropselect = {"DROPSELECT_CB", iup_mat_dropselect_cb} +iup_callbacks.enteritem = {"ENTERITEM_CB", iup_mat_enteritem_cb} +iup_callbacks.leaveitem = {"LEAVEITEM_CB", iup_mat_leaveitem_cb} +iup_callbacks.click = {"CLICK_CB", iup_mat_click_cb} +iup_callbacks.scrolltop = {"SCROLLTOP_CB", iup_mat_scrolltop_cb} +iup_callbacks.valuecb = {"VALUE_CB", iup_mat_value_cb} +iup_callbacks.draw = {"DRAW_CB", iup_mat_draw_cb} +iup_callbacks.dropcheck = {"DROPCHECK_CB", iup_mat_dropcheck_cb} +iup_callbacks.fgcolorcb = {"FGCOLOR_CB", iup_mat_fgcolor_cb} +iup_callbacks.bgcolorcb = {"BGCOLOR_CB", iup_mat_bgcolor_cb} +iup_callbacks.value_edit = {"VALUE_EDIT_CB", iup_mat_value_edit_cb} +iup_callbacks.markedit_cb = {"MARKEDIT_CB", iup_mat_markedit_cb} +iup_callbacks.mark_cb = {"MARK_CB", iup_mat_mark_cb} +iup_callbacks.mouse_cb = {"MOUSE_CB", iup_mat_mouse_cb} + +iup_callbacks.edition_cb = iup_callbacks.edition +iup_callbacks.drop_cb = iup_callbacks.drop +iup_callbacks.dropselect_cb = iup_callbacks.dropselect +iup_callbacks.enteritem_cb = iup_callbacks.enteritem +iup_callbacks.leaveitem_cb = iup_callbacks.leaveitem +iup_callbacks.click_cb = iup_callbacks.click +iup_callbacks.scrolltop_cb = iup_callbacks.scrolltop +iup_callbacks.value_cb = iup_callbacks.valuecb +iup_callbacks.draw_cb = iup_callbacks.draw +iup_callbacks.dropcheck_cb = iup_callbacks.dropcheck +iup_callbacks.fgcolor_cb = iup_callbacks.fgcolorcb +iup_callbacks.bgcolor_cb = iup_callbacks.bgcolorcb +iup_callbacks.value_edit_cb = iup_callbacks.value_edit +IUPPPLOT = {parent = WIDGET} + +function IUPPPLOT:CreateIUPelement (obj) + return iupCreatePPlot () +end + +function iuppplot (o) + return IUPPPLOT:Constructor (o) +end +iup.pplot = iuppplot + +iup_callbacks.edit_cb.pplot = iup_pplot_edit_cb + +iup_callbacks.editbegin_cb = {"EDITBEGIN_CB", iup_pplot_editbegin_cb} +iup_callbacks.editend_cb = {"EDITEND_CB", iup_pplot_editend_cb} +iup_callbacks.select_cb = {"SELECT_CB", iup_pplot_select_cb} +iup_callbacks.selectbegin_cb = {"SELECTBEGIN_CB", iup_pplot_selectbegin_cb} +iup_callbacks.selectend_cb = {"SELECTEND_CB", iup_pplot_selectend_cb} +iup_callbacks.delete_cb = {"DELETE_CB", iup_pplot_delete_cb} +iup_callbacks.deletebegin_cb = {"DELETEBEGIN_CB", iup_pplot_deletebegin_cb} +iup_callbacks.deleteend_cb = {"DELETEEND_CB", iup_pplot_deleteend_cb} +iup_callbacks.predraw_cb = {"PREDRAW_CB", iup_pplot_predraw_cb} +iup_callbacks.postdraw_cb = {"POSTDRAW_CB", iup_pplot_postdraw_cb} +IUPSBOX = {parent = WIDGET} + +function IUPSBOX:CreateIUPelement (obj) + return iupCreateSbox(obj[1]) +end + +function iupsbox (o) + return IUPSBOX:Constructor (o) +end +iup.sbox = iupsbox +IUPSPIN = {parent = WIDGET} + +function IUPSPIN:CreateIUPelement (obj) + return iupCreateSpin () +end + +function iupspin (o) + return IUPSPIN:Constructor (o) +end +iup.spin = iupspin + +IUPSPINBOX = {parent = WIDGET} + +function IUPSPINBOX:CreateIUPelement (obj) + return iupCreateSpinbox (obj[1]) +end + +function iupspinbox (o) + return IUPSPINBOX:Constructor (o) +end +iup.spinbox = iupspinbox + +iup_callbacks.spincb = {"SPIN_CB", iup_spin_cb} +iup_callbacks.spin_cb = iup_callbacks.spincb +IUPTABS = {parent = WIDGET} + +function IUPTABS:CreateIUPelement (obj) + return iupCreateTabs (obj, getn(obj)) +end + +function iuptabs (o) + return IUPTABS:Constructor (o) +end +iup.tabs = iuptabs + +iup_callbacks.tabchange = {"TABCHANGE_CB", iup_tabchange_cb} +iup_callbacks.tabchange_cb = iup_callbacks.tabchangeIUPTREE = {parent = WIDGET} +IUPTREEREFERENCETABLE = {} -- Used in C, see luatree.c + +function IUPTREE:CreateIUPelement (obj) + return iupCreateTree () +end + +function iuptree (o) + return IUPTREE:Constructor (o) +end +iup.tree = iuptree + +function TreeSetValueRec(handle, t, id) + + if t == nil then return end + + local cont = getn(t) + + while cont >= 0 do + if type (t[cont]) == "table" then + if t[cont].branchname ~= nil then + IupSetAttribute(handle, "ADDBRANCH"..id, t[cont].branchname) + else + IupSetAttribute(handle, "ADDBRANCH"..id, "") + end + TreeSetValueRec(handle, t[cont], id+1) + else + if t[cont] then + IupSetAttribute(handle, "ADDLEAF"..id, t[cont]) + end + end + cont = cont - 1 + end +end + +function TreeSetValue(handle, t) + if type(t) ~= "table" then + IupMessage("TreeLua Error", "Incorrect arguments to function TreeSetValue") + return + end + if t.branchname ~= nil then + IupSetAttribute(handle, "NAME", t.branchname) + end + TreeSetValueRec(handle, t, 0) +end +iup.TreeSetValue = TreeSetValue + +iup_callbacks.selection = {"SELECTION_CB", iup_tree_selection_cb} +iup_callbacks.multiselection = {"MULTISELECTION_CB", iup_tree_multiselection_cb} +iup_callbacks.branchopen = {"BRANCHOPEN_CB", iup_tree_branchopen_cb} +iup_callbacks.branchclose = {"BRANCHCLOSE_CB", iup_tree_branchclose_cb} +iup_callbacks.executeleaf = {"EXECUTELEAF_CB", iup_tree_executeleaf_cb} +iup_callbacks.renamenode = {"RENAMENODE_CB", iup_tree_renamenode_cb} +iup_callbacks.renamecb = {"RENAME_CB", iup_tree_renamecb_cb} +iup_callbacks.showrenamecb = {"SHOWRENAME_CB", iup_tree_showrenamecb_cb} +iup_callbacks.rightclick = {"RIGHTCLICK_CB", iup_tree_rightclick_cb} +iup_callbacks.dragdrop = {"DRAGDROP_CB", iup_tree_dragdrop_cb} + +iup_callbacks.selection_cb = iup_callbacks.selection +iup_callbacks.multiselection_cb = iup_callbacks.multiselection +iup_callbacks.branchopen_cb = iup_callbacks.branchopen +iup_callbacks.branchclose_cb = iup_callbacks.branchclose +iup_callbacks.executeleaf_cb = iup_callbacks.executeleaf +iup_callbacks.renamenode_cb = iup_callbacks.renamenode +iup_callbacks.rename_cb = iup_callbacks.renamecb +iup_callbacks.showrename_cb = iup_callbacks.showrenamecb +iup_callbacks.rightclick_cb = iup_callbacks.rightclick +iup_callbacks.dragdrop_cb = iup_callbacks.dragdrop +IUPVAL = {parent = WIDGET} + +function IUPVAL:CreateIUPelement (obj) + return iupCreateVal (obj[1]) +end + +function iupval (o) + return IUPVAL:Constructor (o) +end +iup.val = iupval + + +-- must set here because it is also used elsewhere with a different signature +iup_callbacks.mousemove = {"MOUSEMOVE_CB", nil} +iup_callbacks.mousemove_cb = iup_callbacks.mousemove +iup_callbacks.mousemove.val = iup_val_mousemove_cb + +iup_callbacks.buttonpress = {"BUTTON_PRESS_CB", iup_val_button_press_cb} +iup_callbacks.buttonrelease = {"BUTTON_RELEASE_CB", iup_val_button_release_cb} + +iup_callbacks.button_press_cb = iup_callbacks.buttonpress +iup_callbacks.button_release_cb = iup_callbacks.buttonrelease +---------------------------------------------------- +-- The main porpouse of this file is to build linux gcc makefiles. +-- Must have Premake version 3 installed. +-- Original Premake was changed to remove some parameters and add others. +-- Default parameters: +-- premake3s --target gnu --os linux +-- But it can build windows gcc makefiles, and visual studio projects. +-- premake3s --target gnu --os windows +-- premake3s --target gnu --os macosx +-- premake3s --target vs6 +-- premake3s --target vs2002 +-- premake3s --target vs2003 +-- premake3s --target vs2005 +-- In Linux the generated makefiles will not correctly build libraries in 64-bits. +-- must add "-m64 -fPIC" flags +---------------------------------------------------- + +if (not options.target) then + options.target = "gnu" +end + +if (not options.os) then + if (options.target ~= "gnu") then + options.os = "windows" + else + options.os = "linux" + end +end + +function fixPackagePath(package_files) + if (options.os ~= "linux") then + for i, file in package_files do + package_files[i] = "../src/"..file + end + end +end + +---------------------------------------------------- + +project.name = "iup" +project.bindir = "../bin" +project.libdir = "../lib" + +if (options.os ~= "linux") then + if (options.os == "macosx") then + project.path = "../mak.macosx" + else + project.path = "../mak."..options.target + end +end + +---------------------------------------------------- + +package = newpackage() +package.name = "iuplua3" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + "iuplua.c", "iuplua_api.c", "iuplua_widgets.c" +} +fixPackagePath(package.files) + +package.includepaths = { "../include", "../src", "$(LUA3)/include" } +package.defines = {"IUPLUA_USELOH"} + +-- SRCLUA = iuplua.lua + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "iupluacontrols3" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + "luaval.c", "luadial.c", "luagauge.c", "luagc.c", "luacbox.c", "luacells.c", + "luacb.c", "luatabs.c", "luamask.c", "luacontrols.c", "luagetparam.c", + "luamatrix.c", "luatree.c", "luasbox.c", "luaspin.c", "luacolorbar.c" +} +fixPackagePath(package.files) + +-- SRCLUA = luaval.lua luadial.lua luagauge.lua luacb.lua luatabs.lua luamatrix.lua luatree.lua luasbox.lua luaspin.lua luacells.lua + +package.includepaths = { "../include", "$(CD)/include", "$(LUA3)/include" } +package.defines = {"IUPLUA_USELOH"} + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "iuplua_pplot3" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + "luapplot.c" +} +fixPackagePath(package.files) + +-- SRCLUA = luapplot.lua + +package.includepaths = { "../include", "$(CD)/include", "$(LUA3)/include" } +package.defines = {"IUPLUA_USELOH"} + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "iupluagl3" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + "luaglcanvas.c" +} +fixPackagePath(package.files) + +package.includepaths = { "../include", "$(LUA3)/include" } + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "iupluaim3" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + "luaim.c" +} +fixPackagePath(package.files) + +package.includepaths = { "../include", "$(LUA3)/include" } + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "iuplua3exe" +package.target = "iuplua3" +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "exe" +package.linkflags = { "static-runtime" } + +package.files = +{ + "iupluaexe.c" +} +fixPackagePath(package.files) + +-- SRCLUA = console.lua + +package.includepaths = { "../include", "$(LUA3)/include", "$(CD)/include", "$(IM)/include" } +package.defines = {"IUPLUA_USELOH"} +package.links = { "imlua3", "cdluaiup3", "cdlua3", + "iupluagl3", "iupluaim3", "iupluacontrols3", "iuplua3", + "lualib", "lua", + "iupgl", "iupim", "iupcontrols", + "cdiup", "cd", "iup", "im" } +package.libpaths = { "../lib", "$(IM)/lib", "$(CD)/lib", "$(LUA3)/lib" } + +if (options.os == "windows") then + tinsert(package.links, { "comctl32", "ole32", "opengl32", "glu32", "glaux" }) +else + tinsert(package.links, { "GLU", "GL", "Xm", "Xpm", "Xmu", "Xt", "Xext", "X11", "m" }) + tinsert(package.libpaths, { "/usr/X11R6/lib" }) +end + +--------------------------------------------------------------------- +------------------------------------------------------------------------------ +-- Button class +------------------------------------------------------------------------------ +local ctrl = { + nick = "button", + parent = WIDGET, + creation = "S-", + callback = { + action = "", + } +} + +function ctrl.createElement(class, arg) + return Button(arg.title) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Canvas class +------------------------------------------------------------------------------ +local ctrl = { + nick = "canvas", + parent = WIDGET, + creation = "-", + callback = { + action = "ff", + button_cb = "nnnns", + enterwindow_cb = "", + leavewindow_cb = "", + motion_cb = "nns", + resize_cb = "nn", + scroll_cb = "nff", + keypress_cb = "nn", + wom_cb = "n", + wheel_cb = "fnns", + mdiactivate_cb = "", + focus_cb = "n", + } +} + +function ctrl.createElement(class, arg) + return Canvas() +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Cbox class +------------------------------------------------------------------------------ +local ctrl = { + nick = "cbox", + parent = WIDGET, + creation = "v", + callback = {}, + include = "iupcbox.h", + funcname = "Cboxv", + createfunc = [[ +static int Cboxv(lua_State *L) +{ + Ihandle **hlist = iuplua_checkihandle_array(L, 1); + Ihandle *h = IupCboxv(hlist); + iuplua_plugstate(L, h); + iuplua_pushihandle_raw(L, h); + free(hlist); + return 1; +} + ]], +} + +function ctrl.createElement(class, arg) + return Cboxv(arg) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Cells class +------------------------------------------------------------------------------ +local ctrl = { + nick = "cells", + parent = WIDGET, + creation = "", + callback = { + mouseclick_cb = "nnnnnns", + mousemotion_cb = "nnnns", + scrolling_cb = "nn", +-- draw_cb = "nnnnnnn", -- already registered by the matrix + width_cb = "n", + height_cb = "n", + nlines_cb = "", + ncols_cb = "", + hspan_cb = "nn", + vspan_cb = "nn", + }, + include = "iupcells.h" +} + +function ctrl.redraw(handle) + handle.repaint = "YES" +end + +function ctrl.createElement(class, arg) + return Cells() +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Colorbar class +------------------------------------------------------------------------------ +local ctrl = { + nick = "colorbar", + parent = WIDGET, + creation = "", + callback = { + select_cb = "nn", + cell_cb = {"n", ret = "s"}, + switch_cb = "nn", + extended_cb = "n", + }, + funcname = "Colorbar", + include = "iupcolorbar.h", +} + +function ctrl.createElement(class, arg) + return Colorbar(arg.action) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- ColorBrowser class +------------------------------------------------------------------------------ +local ctrl = { + nick = "colorbrowser", + parent = WIDGET, + creation = "", + callback = { + drag_cb = "ccc", + change_cb = "ccc", + }, + funcname = "ColorBrowser", + include = "iupcb.h", +} + +function ctrl.createElement(class, arg) + return ColorBrowser(arg.action) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- ColorDlg class +------------------------------------------------------------------------------ +local ctrl = { + nick = "colordlg", + parent = WIDGET, + creation = "", + funcname = "ColorDlg", + callback = {} +} + +function ctrl.popup(handle, x, y) + Popup(handle,x,y) +end + +function ctrl.destroy(handle) + return Destroy(handle) +end + +function ctrl.createElement(class, arg) + return ColorDlg() +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") + +-- Utilities +iupluacmd = {} + +function iupluacmd.printtable(t) + local n,v = next(t, nil) + print("--printtable Start--") + while n ~= nil do + print(tostring(n).."="..tostring(v)) + n,v = next(t, n) + end + print("--printtable End--") +end + +function iupluacmd.print_version_info() + print(_VERSION .. " " .. _COPYRIGHT) + if (im) then print("IM " .. im._VERSION .. " " .. im._COPYRIGHT) end + if (cd) then print("CD " .. cd._VERSION .. " " .. cd._COPYRIGHT) end + print("IUP " .. iup._VERSION .. " " .. iup._COPYRIGHT) + print("") + print("IUP Info") + print(" System: " .. iup.GetGlobal("SYSTEM")) + print(" System Version: " .. iup.GetGlobal("SYSTEMVERSION")) + local mot = iup.GetGlobal("MOTIFVERSION") + if (mot) then print(" Motif Version: ", mot) end + print(" Screen Size: " .. iup.GetGlobal("SCREENSIZE")) + print(" Screen Depth: " .. iup.GetGlobal("SCREENDEPTH")) + if (iup.GL_VENDOR) then print(" OpenGL Vendor: " .. iup.GL_VENDOR) end + if (iup.GL_RENDERER) then print(" OpenGL Renderer: " .. iup.GL_RENDERER) end + if (iup.GL_VERSION) then print(" OpenGL Version: " .. iup.GL_VERSION) end +end + +-- IUPLUA Full Application + +iupluacmd.lastfilename = nil -- Last file open +iupluacmd.mlCode = iup.multiline{expand="YES", size="200x120", font="COURIER_NORMAL_10"} +iupluacmd.lblPosition = iup.label{title="0:0", size="50x"} +iupluacmd.lblFileName = iup.label{title="", size="50x", expand="HORIZONTAL"} + +function iupluacmd.mlCode:caret_cb(lin, col) + iupluacmd.lblPosition.title = lin..":"..col +end + +iupluacmd.butExecute = iup.button{size="50x15", title="Execute", + action="iup.dostring(iupluacmd.mlCode.value)"} +iupluacmd.butClearCommands = iup.button{size="50x15", title="Clear", + action="iupluacmd.mlCode.value='' iupluacmd.lblFileName.title = '' iupluacmd.lastfilename = nil"} +iupluacmd.butLoadFile = iup.button{size="50x15", title="Load..."} +iupluacmd.butSaveasFile = iup.button{size="50x15", title="Save As..."} +iupluacmd.butSaveFile = iup.button{size="50x15", title="Save"} + +iupluacmd.butSaveFile.action = function() + if (iupluacmd.lastfilename == nil) then + iupluacmd.butSaveasFile:action() + else + newfile = io.open(iupluacmd.lastfilename, "w+") + if (newfile ~= nil) then + newfile:write(iupluacmd.mlCode.value) + newfile:close() + else + error ("Cannot Save file "..filename) + end + end +end + +iupluacmd.butSaveasFile.action = function() + local fd = iup.filedlg{dialogtype="SAVE", title="Save File", + filter="*.lua", filterinfo="Lua files",allownew=yes} + fd:popup(iup.LEFT, iup.LEFT) + local status = fd.status + iupluacmd.lastfilename = fd.value + iupluacmd.lblFileName.title = iupluacmd.lastfilename + fd:destroy() + if status ~= "-1" then + if (iupluacmd.lastfilename == nil) then + error ("Cannot Save file "..filename) + end + local newfile=io.open(iupluacmd.lastfilename, "w+") + if (newfile ~= nil) then + newfile:write(iupluacmd.mlCode.value) + newfile:close(newfile) + else + error ("Cannot Save file") + end + end +end + +iupluacmd.butLoadFile.action = function () + local fd=iup.filedlg{dialogtype="OPEN", title="Load File", + filter="*.lua", filterinfo="Lua Files", allownew="NO"} + fd:popup(iup.CENTER, iup.CENTER) + local status = fd.status + local filename = fd.value + fd:destroy() + if (status == "-1") or (status == "1") then + if (status == "1") then + error ("Cannot load file "..filename) + end + else + local newfile = io.open (filename, "r") + if (newfile == nil) then + error ("Cannot load file "..filename) + else + iupluacmd.mlCode.value=newfile:read("*a") + newfile:close (newfile) + iupluacmd.lastfilename = filename + iupluacmd.lblFileName.title = iupluacmd.lastfilename + end + end +end + +iupluacmd.vbxConsole = iup.vbox +{ + iup.frame{iup.hbox{iup.vbox{iupluacmd.butLoadFile, + iupluacmd.butSaveFile, + iupluacmd.butSaveasFile, + iupluacmd.butClearCommands, + iupluacmd.butExecute; + margin="0x0", gap="10"}, + iup.vbox{iupluacmd.lblFileName, + iupluacmd.mlCode, + iupluacmd.lblPosition; + alignment = "ARIGHT"}; + alignment="ATOP"}; title="Commands"} + ;alignment="ACENTER", margin="5x5", gap="5" +} + +-- Main Menu Definition. + +iupluacmd.mnuMain = iup.menu +{ + iup.submenu + { + iup.menu + { + iup.item{title="Exit", action="return iup.CLOSE"} + }; title="File" + }, + iup.submenu{iup.menu + { + iup.item{title="Print Version Info...", action=iupluacmd.print_version_info}, + iup.item{title="About...", action="iupluacmd.dlgAbout:popup(iup.CENTER, iup.CENTER)"} + };title="Help"} +} + +-- Main Dialog Definition. + +iupluacmd.dlgMain = iup.dialog{iupluacmd.vbxConsole; + title="IupLua Console", + menu=iupluacmd.mnuMain, + defaultenter=iupluacmd.butExecute, + close_cb = "return iup.CLOSE"} + +-- About Dialog Definition. + +iupluacmd.dlgAbout = iup.dialog +{ + iup.vbox + { + iup.label{title="IupLua5 Console"}, + iup.fill{size="5"}, + iup.fill{size="5"}, + iup.frame + { + iup.vbox + { + iup.label{title="Tecgraf/PUC-Rio"}, + iup.label{title="iup@tecgraf.puc-rio.br"} + } + }, + iup.fill{size="5"}, + iup.button{title="OK", action="return iup.CLOSE", size="50X20"} + ;margin="10x10", alignment="ACENTER" + } + ;maxbox="NO", minbox="NO", resize="NO", title="About" +} + +-- Displays the Main Dialog + +iupluacmd.dlgMain:show() +iup.SetFocus(iupluacmd.mlCode) + +iup.MainLoop() + +iupluacmd.dlgMain:destroy() +iupluacmd.dlgAbout:destroy() +---------------------------------------------------------------------------- +-- Callback return values +---------------------------------------------------------------------------- +IGNORE = -1 +DEFAULT = -2 +CLOSE = -3 +CONTINUE = -4 + +---------------------------------------------------------------------------- +-- IupPopup e IupShowXY +---------------------------------------------------------------------------- +CENTER = 65535 +LEFT = 65534 +RIGHT = 65533 +MOUSEPOS = 65532 +CURRENT = 65531 +CENTERPARENT = 65530 +TOP = LEFT +BOTTOM = RIGHT +ANYWHERE = CURRENT + +---------------------------------------------------------------------------- +-- Scrollbar +---------------------------------------------------------------------------- +SBUP = 0 +SBDN = 1 +SBPGUP = 2 +SBPGDN = 3 +SBPOSV = 4 +SBDRAGV = 5 +SBLEFT = 6 +SBRIGHT = 7 +SBPGLEFT = 8 +SBPGRIGHT = 9 +SBPOSH = 10 +SBDRAGH = 11 + +---------------------------------------------------------------------------- +-- SHOW_CB +---------------------------------------------------------------------------- +SHOW = 0 +RESTORE = 1 +MINIMIZE = 2 +MAXIMIZE = 3 +HIDE = 4 + +---------------------------------------------------------------------------- +-- BUTTON_CB +---------------------------------------------------------------------------- +BUTTON1 = string.byte('1') +BUTTON2 = string.byte('2') +BUTTON3 = string.byte('3') +BUTTON4 = string.byte('4') +BUTTON5 = string.byte('5') + +---------------------------------------------------------------------------- +-- IupOpen +---------------------------------------------------------------------------- +ERROR = 1 +NOERROR = 0 +OPENED = -1 +INVALID = -1 +------------------------------------------------------------------------------ +-- Template to create control classes for IupLua5 +-- The Lua module is used by the "generator.lua" to build a C module, +-- and loaded during iuplua_open to initialize the control. +------------------------------------------------------------------------------ +local ctrl = { + nick = "mycontrol", -- name of the control, used in the control creation: iup.mycontrol{} + -- also used for the generated C module + parent = WIDGET, -- used to define a few methods used fro creation and set attribute + creation = "nn", -- the creation parameters in Lua + -- "n" = int + -- "d" = double + -- "s" = char* + -- "S" = optional char*, can be nil + -- "i" = Ihandle* + -- "-" = NULL, no parameters in Lua, but a NULL parameter in C + -- "a" = char* array in a table + -- "t" = int array in a table + -- "v" = Ihandle* array in a table + + funcname = "myControl", -- [optional] name of the function used in C + -- default is ctrl.nick with first letter uppercase + + callback = { -- partial list of callbacks + -- only the callbacks that are not already defined by other controls needs to be defined + action = "ff", + button_cb = "nnnns", + enterwindow_cb = "", + leavewindow_cb = "", + motion_cb = "nns", + resize_cb = "nn", + scroll_cb = "nff", + keypress_cb = "nn", + wom_cb = "n", + wheel_cb = "fnns", + mdiactivate_cb = "", + focus_cb = "n", + value_cb = {"nn", ret = "s"}, -- ret is return type, default is n ("int") + + -- the following types can be used for callback parameters: + -- n = "int", + -- s = "char *", + -- i = "Ihandle *", + -- c = "unsigned char ", + -- d = "double", + -- f = "float", + -- v = "Ihandle **", + -- + -- Other parameters must be implemented in C using the extrafuncs module + + -- IMPORTANT: callbacks with the same name in different controls + -- are assumed to have the same parameters, that's why they are defined only once + -- When callbacks conflict using the same name, but different parameters + -- generator.lua must be edited to include the callback in the list of conflicting callbacks + -- "action" is a common callback that conflicts + -- In the callback list, just declare the callback with the parameters used in that control. + } + + include = "iupmycontrol.h", -- [optional] header to be included, it is where the creation function is declared. + extrafuncs = 1, -- [optional] additional module in C called by the initialization function + + createfunc = [[ -- [optional] creation function in C, + -- used if creation parameters needs some interpretation in C + -- not to be used together with funcname +#include<stdlib.h> +static int myControl (lua_State * L) +{ + xxxx; + yyyy; + return 1; +} +]] + + extracode = [[ -- [optional] extra fucntions to be defined in C. +int luaopen_iupluamycontrol51(lua_State* L) +{ + return iupmycontrollua_open(L); +} +]] + +} + +-- must be defined so the WIDGET constructor can call it +function ctrl.createElement(class, arg) + return myControl() +end + +-- here you can add some custom methods to the class +function ctrl.popup(handle, x, y) + Popup(handle,x,y) +end + +iupRegisterWidget(ctrl) -- will make iup.mycontrol available +iupSetClass(ctrl, "iup widget") -- register the class in the registry +------------------------------------------------------------------------------ +-- Dial class +------------------------------------------------------------------------------ +local ctrl = { + nick = "dial", + parent = WIDGET, + creation = "s", + callback = { + mousemove_cb = "d", -- already registered by the val, but has a name conflict +-- button_press_cb = "d", -- already registered by the val +-- button_release_cb = "d", -- already registered by the val + }, + include = "iupdial.h", +} + +function ctrl.createElement(class, arg) + return Dial(arg[1]) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Dialog class +------------------------------------------------------------------------------ +local ctrl = { + nick = "dialog", + parent = WIDGET, + creation = "i", + callback = { + map_cb = "", + close_cb = "", + show_cb = "n", + trayclick_cb = "nnn", + dropfiles_cb = "snnn", + } +} + +function ctrl.createElement(class, arg) + return Dialog(arg[1]) +end + +function ctrl.popup(handle, x, y) + Popup(handle,x,y) +end + +function ctrl.showxy(handle, x, y) + return ShowXY(handle, x, y) +end + +function ctrl.destroy(handle) + return Destroy(handle) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- FileDlg class +------------------------------------------------------------------------------ +local ctrl = { + nick = "filedlg", + parent = WIDGET, + creation = "", + callback = { + file_cb = "ss", + }, + funcname = "FileDlg" +} + +function ctrl.popup(handle, x, y) + Popup(handle,x,y) +end + +function ctrl.destroy(handle) + return Destroy(handle) +end + +function ctrl.createElement(class, arg) + return FileDlg() +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") + +------------------------------------------------------------------------------ +-- Fill class +------------------------------------------------------------------------------ +local ctrl = { + nick = "fill", + parent = WIDGET, + creation = "", + callback = {} +} + +function ctrl.createElement(class, arg) + return Fill() +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- FontDlg class +------------------------------------------------------------------------------ +local ctrl = { + nick = "fontdlg", + parent = WIDGET, + creation = "", + funcname = "FontDlg", + callback = {} +} + +function ctrl.popup(handle, x, y) + Popup(handle,x,y) +end + +function ctrl.destroy(handle) + return Destroy(handle) +end + +function ctrl.createElement(class, arg) + return FontDlg() +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") + +------------------------------------------------------------------------------ +-- Frame class +------------------------------------------------------------------------------ +local ctrl = { + nick = "frame", + parent = WIDGET, + creation = "i", + callback = {} +} + +function ctrl.createElement(class, arg) + return Frame(arg[1]) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Gauge class +------------------------------------------------------------------------------ +local ctrl = { + nick = "gauge", + parent = WIDGET, + creation = "", + callback = {}, + include = "iupgauge.h", +} + +function ctrl.createElement(class, arg) + return Gauge(arg.action) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") + +function dofile(f) + pcall(loadfile(f)) +end + +-- compatibility functions (with iuplua.lua) +function iupSetClass(ctrl, name) + element = ctrl +end + +-- dummy functions +iupluaNewClass = function() end +iupSetMethod = iupluaNewClass +iupRegisterWidget = iupluaNewClass + +c_types = { + n = "int", + s = "char *", + i = "Ihandle *", + c = "unsigned char ", + d = "double", + f = "float", + v = "Ihandle **", +} + +-- Adjust the callbacks table +function adjustcallbacktable(c) + d = {} + for i,j in pairs(c) do + if type(j) == "string" then + d[i] = { j, "IUP_".. string.upper(i)} + elseif type(j) == "table" then + d[i] = j + else + print("ERROR IN CALLBACK TABLE FORMAT") + end + end + return d +end + + +function header(o,i) + io.write [[ +/****************************************************************************** + * Automatically generated file (iuplua5). Please don't change anything. * + *****************************************************************************/ + +#include <stdlib.h> + +#include <lua.h> +#include <lauxlib.h> + +#include <iup.h> +#include <iuplua.h> +]] + if i then io.write("#include <",i,">\n") end + io.write('#include "il.h"\n\n\n') +end + +function firstupper(name) + return string.upper(string.sub(name,1,1)) .. string.sub(name,2,-1) +end + +function write_creation(o, t) + local aux = {n = 1} + local u = firstupper(o) + local v = t.creation + local c = t.callback + if t.funcname then + u = t.funcname + end + io.write ("static int ",u,"(lua_State *L)\n") + io.write ("{\n") + if t.rettype == nil then io.write(" Ihandle *ih = Iup",u,"(") + elseif t.rettype == "n" then io.write(" int n = (Iup",u,"(") + elseif t.rettype == "s" then io.write(" char *s = (Iup",u,"(") + end + local max = string.len(v) + string.gsub(v, "(.)", function(p) + if p == "n" then io.write("luaL_checkint(L, ",aux.n,")") + elseif p == "d" then io.write("luaL_number(L, ",aux.n,")") + elseif p == "s" then io.write("(char *) luaL_checkstring(L, ",aux.n,")") + elseif p == "S" then io.write("(char *) luaL_optstring(L, ",aux.n,', NULL)') + elseif p == "i" then io.write("iuplua_checkihandle(L, ",aux.n,")") + elseif p == "-" then io.write("NULL") + elseif p == "a" then io.write("iuplua_checkstring_array(L, ",aux.n,")") + elseif p == "t" then io.write("iuplua_checkint_array(L, ",aux.n,")") + elseif p == "v" then io.write("iuplua_checkihandle_array(L, ",aux.n,")") + else io.write("FORMAT '", p, "' NOT SUPPORTED\n") + end + if aux.n < max then io.write(", ") end + aux.n = aux.n + 1 + end) + io.write(");\n") + + io.write(" iuplua_plugstate(L, ih);\n") + io.write(" iuplua_pushihandle_raw(L, ih);\n") + io.write(" return 1;\n") + io.write("}\n\n") +end + +function write_callbacks(o, c) + local aux = { } + for i,v in pairs(c) do + local s = v[1] + local max = string.len(s) + aux.n = 0 + io.write("static ") + if v.ret ~= nil then + if v.ret == "s" then + io.write("char * ") + end + else + io.write("int ") + end + io.write(o, "_", i, "(Ihandle *self") + if max > 0 then io.write(", ") end + string.gsub(s, "(.)", function(p) + io.write(c_types[p], " p", aux.n) + aux.n = aux.n + 1 + if aux.n < max then io.write(", ") end + end) + io.write(")\n{\n") + io.write(' lua_State *L = iuplua_call_start(self, "', i, '");') + aux.n = 0 + string.gsub(s, "(.)", function(p) + if p == "n" or p == "f" or p == "d" or p == "c" then + io.write("\n lua_pushnumber(L, p"..aux.n..");") + elseif p == "s" then + io.write("\n lua_pushstring(L, p"..aux.n..");") + elseif p == "i" then + io.write("\n iuplua_pushihandle(L, p"..aux.n..");") + else + io.write("\n ERROR !! ") + end + aux.n = aux.n + 1 + end) + if v.ret ~= nil and v.ret == "s" then + io.write("\n return iuplua_call_rs(L, " .. max .. ");") + else + io.write("\n return iuplua_call(L, " .. max .. ");") + end + io.write("\n}\n\n") + end +end + +function write_initialization(o,t) + local aux= {n=1} + local c = t.callback + local u = firstupper(o) + if t.extrafuncs then + io.write('void iuplua_', o,'funcs_open(lua_State *L);\n\n') + end + if t.openfuncname then + io.write("void ", t.openfuncname, "(lua_State * L)\n") + else + io.write("int iup", o,"lua_open(lua_State * L)\n") + end + io.write("{\n") + io.write(" iuplua_register(L, ") + if t.funcname then + u = t.funcname + end + io.write(u, ', "', u,'");\n\n') + + for i,v in pairs(c) do + local type = "NULL" + if i == "action" or + i == "action_cb" or + i == "edit_cb" or + i == "mousemove_cb" then + type = '"'..string.lower(o)..'"' + end + io.write(' iuplua_register_cb(L, "',string.upper(i),'", (lua_CFunction)',o,'_',i,', ',type,');\n') + first = 0 + end + io.write('\n') + + if t.extrafuncs then + io.write(' iuplua_', o,'funcs_open(L);\n\n') + end + io.write('#ifdef IUPLUA_USELOH\n') + io.write('#ifdef TEC_BIGENDIAN\n') + io.write('#ifdef TEC_64\n') + io.write('#include "', o,'_be64.loh"\n') + io.write('#else\n') + io.write('#include "', o,'_be32.loh"\n') + io.write('#endif\n') + io.write('#else\n') + io.write('#ifdef TEC_64\n') + io.write('#ifdef WIN64\n') + io.write('#include "', o,'_le64w.loh"\n') + io.write('#else\n') + io.write('#include "', o,'_le64.loh"\n') + io.write('#endif\n') + io.write('#else\n') + io.write('#include "', o,'.loh"\n') + io.write('#endif\n') + io.write('#endif\n') + io.write('#else\n') + io.write(' iuplua_dofile(L, "', o,'.lua");\n') + io.write('#endif\n\n') + io.write(' return 0;\n') + io.write("}\n\n") +end + +dofile(arg[1]) +element.callback = adjustcallbacktable(element.callback) + +io.output(element.nick..".c") +header(element.nick, element.include) +write_callbacks(element.nick, element.callback) +if element.createfunc == nil then + write_creation(element.nick, element) +else + io.write(element.createfunc) +end +write_initialization(element.nick, element) +if element.extracode then + io.write(element.extracode) +end +------------------------------------------------------------------------------ +-- GLCanvas class +------------------------------------------------------------------------------ +local ctrl = { + nick = "glcanvas", + parent = WIDGET, + creation = "-", + funcname = "GLCanvas", + include = "iupgl.h", + callback = { + action = "nn", + }, + extrafuncs = 1, + extracode = [[ +int iupgllua_open(lua_State * L) +{ + if (iuplua_opencall_internal(L)) + IupGLCanvasOpen(); + + iuplua_changeEnv(L); + iupglcanvaslua_open(L); + iuplua_returnEnv(L); + return 0; +} + +/* obligatory to use require"iupluagl" */ +int luaopen_iupluagl(lua_State* L) +{ + return iupgllua_open(L); +} + +/* obligatory to use require"iupluagl51" */ +int luaopen_iupluagl51(lua_State* L) +{ + return iupgllua_open(L); +} + +]] +} + +function ctrl.createElement(class, arg) + return GLCanvas() +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- HBox class +------------------------------------------------------------------------------ +local ctrl = { + nick = "hbox", + parent = BOX, + creation = "-", + callback = {} +} + +function ctrl.append(handle, elem) + Append(handle, elem) +end + +function ctrl.createElement(class, arg) + return Hbox() +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Image class +------------------------------------------------------------------------------ +local ctrl = { + nick = "image", + parent = WIDGET, + creation = "nns", -- fake definition + callback = {}, + createfunc = [[ +#include<stdlib.h> +static int Image (lua_State * L) +{ + int w, h, i, j; + char *img; + Ihandle *image; + + h = luaL_getn(L, 1); + lua_pushnumber(L, 1); + lua_gettable(L, 1); + w = luaL_getn(L, -1); + lua_pop(L, 1); + + img = (char *) malloc (h*w); + + for (i=1; i<=h; i++) + { + lua_pushnumber(L, i); + lua_gettable(L, 1); + for (j=1; j<=w; j++) + { + int idx = (i-1)*w+(j-1); + lua_pushnumber(L, j); + lua_gettable(L, -2); + img[idx] = (char)lua_tonumber(L, -1); + lua_pop(L, 1); + } + lua_pop(L, 1); + } + + image = IupImage(w,h,img); + free(img); + + w = luaL_getn(L, 2); + + for(i=1; i<=w; i++) + { + lua_pushnumber(L,i); + lua_pushnumber(L,i); + lua_gettable(L, 2); + IupStoreAttribute(image, (char *) lua_tostring(L,-2), (char *) lua_tostring(L,-1)); + lua_pop(L, 2); + } + + iuplua_plugstate(L, image); + iuplua_pushihandle_raw(L, image); + return 1; +} + +]] +} + +function ctrl.createElement(class, arg) + return Image(arg, arg.colors) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- ImageRGB class +------------------------------------------------------------------------------ +local ctrl = { + nick = "imagergb", + parent = WIDGET, + creation = "nns", -- fake definition + funcname = "ImageRGB", + callback = {}, + createfunc = [[ +static int ImageRGB(lua_State *L) +{ + int w = luaL_checkint(L, 1); + int h = luaL_checkint(L, 2); + unsigned char *pixels = iuplua_checkuchar_array(L, 3, w*h*3); + Ihandle *ih = IupImageRGB(w, h, pixels); + iuplua_plugstate(L, ih); + iuplua_pushihandle_raw(L, ih); + free(pixels); + return 1; +} + +]] +} + +function ctrl.createElement(class, arg) + return ImageRGB(arg.width, arg.height, arg.pixels) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- ImageRGBA class +------------------------------------------------------------------------------ +local ctrl = { + nick = "imagergba", + parent = WIDGET, + creation = "nns", -- fake definition + funcname = "ImageRGBA", + callback = {}, + createfunc = [[ +static int ImageRGBA(lua_State *L) +{ + int w = luaL_checkint(L, 1); + int h = luaL_checkint(L, 2); + unsigned char *pixels = iuplua_checkuchar_array(L, 3, w*h*4); + Ihandle *ih = IupImageRGBA(w, h, pixels); + iuplua_plugstate(L, ih); + iuplua_pushihandle_raw(L, ih); + free(pixels); + return 1; +} + +]] +} + +function ctrl.createElement(class, arg) + return ImageRGBA(arg.width, arg.height, arg.pixels) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Item class +------------------------------------------------------------------------------ +local ctrl = { + nick = "item", + parent = WIDGET, + creation = "S-", + callback = { + action = "", + highlight_cb = "", + } +} + +function ctrl.createElement(class, arg) + return Item(arg.title) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +-- This file is executed with the "iup" table already as the globalindex + +------------------------------------------------------------------------------ +-- Callback handler +------------------------------------------------------------------------------ + +callbacks = {} + +function iupCallMethod(name, ...) + local handle = arg[1] -- always the handle + local func = handle[name] + if (not func) then + return + end + + if type(func) == "function" then + return func(unpack(arg)) + elseif type(func) == "string" then + local temp = self + self = handle + local result = iup.dostring(func) + self = temp + return result + else + return iup.ERROR + end +end + +function RegisterCallback(name, func, type) + if not callbacks[name] then callbacks[name] = {} end + local cb = callbacks[name] + if type then + cb[type] = func + else + cb[1] = func + end +end + +------------------------------------------------------------------------------ +-- Meta Methods +------------------------------------------------------------------------------ + + +local widget_gettable = function(object, index) + local p = object + local v + while 1 do + v = rawget(p, index) + if v then return v end + p = rawget(p, "parent") + if not p then return nil end + end +end + +iupNewClass("iup widget") +iupSetMethod("iup widget", "__index", widget_gettable) + + +local ihandle_gettable = function(handle, index) + local INDEX = string.upper(index) + if (callbacks[INDEX]) then + local object = iupGetWidget(handle) + if (not object or type(object)~="table") then error("invalid iup handle") end + return object[index] + else + local value = GetAttribute(handle, INDEX) + if (not value) then + local object = iupGetWidget(handle) + if (not object or type(object)~="table") then error("invalid iup handle") end + return object[index] + elseif type(value)== "number" or type(value) == "string" then + local ih = GetHandle(value) + if ih then return ih + else return value end + else + return value + end + end +end + +local ihandle_settable = function(handle, index, value) + local ti = type(index) + local tv = type(value) + local object = iupGetWidget(handle) + if (not object or type(object)~="table") then error("invalid iup handle") end + if ti == "number" or ti == "string" then -- check if a valid C name + local INDEX = string.upper(index) + local cb = callbacks[INDEX] + if (cb) then -- if a callback name + local func = cb[1] + if (not func) then + func = cb[GetType(handle)] + end + iupSetCallback(handle, INDEX, func, value) -- register the pre-defined C callback + object[index] = value -- store also in Lua + elseif iupGetClass(value) == "iup handle" then -- if a iup handle + local name = ihandle_setname(value) + StoreAttribute(handle, INDEX, name) + object[index] = nil -- if there was something in Lua remove it + elseif tv == "string" or tv == "number" or tv == "nil" then -- if a common value + StoreAttribute(handle, INDEX, value) + object[index] = nil -- if there was somthing in Lua remove it + else + object[index] = value -- store also in Lua + end + else + object[index] = value -- store also in Lua + end +end + +iupNewClass("iup handle") +iupSetMethod("iup handle", "__index", ihandle_gettable) +iupSetMethod("iup handle", "__newindex", ihandle_settable) +iupSetMethod("iup handle", "__tostring", ihandle_tostring) +iupSetMethod("iup handle", "__eq", ihandle_compare) -- implemented in C + + +------------------------------------------------------------------------------ +-- Utilities +------------------------------------------------------------------------------ + +function ihandle_setname(v) -- used also by radio and zbox + local name = GetName(v) + if not name then + local autoname = string.format("_IUPLUA_NAME(%s)", tostring(v)) + SetHandle(autoname, v) + return autoname + end + return name +end + +function iupRegisterWidget(ctrl) -- called by all the controls initialization functions + iup[ctrl.nick] = function(arg) + return ctrl:constructor(arg) + end +end + +function RegisterHandle(handle, typename) + + iupSetClass(handle, "iup handle") + + local object = iupGetWidget(handle) + if not object then + + local class = iup[string.upper(typename)] + if not class then + class = WIDGET + end + + local object = { parent=class, handle=handle } + iupSetClass(object, "iup widget") + iupSetWidget(handle, object) + end + + return handle +end + +------------------------------------------------------------------------------ +-- Widget class (top class) +------------------------------------------------------------------------------ + +WIDGET = { + callback = {} +} + +function WIDGET.show(object) + Show(object.handle) +end + +function WIDGET.hide(object) + Hide(object.handle) +end + +function WIDGET.map(object) + Map(object.handle) +end + +function WIDGET.constructor(class, arg) + local handle = class:createElement(arg) + local object = { + parent = class, + handle = handle + } + iupSetClass(handle, "iup handle") + iupSetClass(object, "iup widget") + iupSetWidget(handle, object) + object:setAttributes(arg) + return handle +end + +function WIDGET.setAttributes(object, arg) + local handle = object.handle + for i,v in pairs(arg) do + if type(i) == "number" and iupGetClass(v) == "iup handle" then + -- We should not set this or other elements (such as iuptext) + -- will erroneosly inherit it + rawset(object, i, v) + else + -- this will call settable metamethod + handle[i] = v + end + end +end + +-- all the objects in the hierarchy must be "iup widget" +-- Must repeat this call for every new widget +iupSetClass(WIDGET, "iup widget") + + +------------------------------------------------------------------------------ +-- Box class (inherits from WIDGET) +------------------------------------------------------------------------------ + +BOX = { + parent = WIDGET +} + +function BOX.setAttributes(object, arg) + local handle = rawget(object, "handle") + local n = table.getn(arg) + for i = 1, n do + if iupGetClass(arg[i]) == "iup handle" then + Append(handle, arg[i]) + end + end + WIDGET.setAttributes(object, arg) +end + +iupSetClass(BOX, "iup widget") + + +------------------------------------------------------------------------------ +-- Compatibility functions. +------------------------------------------------------------------------------ + +error_message_popup = nil + +function _ERRORMESSAGE(err) + if (error_message_popup) then + error_message_popup.value = err + else + local bt = button{title="Ok", size="60", action="error_message_popup = nil; return iup.CLOSE"} + local ml = multiline{expand="YES", readonly="YES", value=err, size="300x150"} + local vb = vbox{ml, bt; alignment="ACENTER", margin="10x10", gap="10"} + local dg = dialog{vb; title="Error Message",defaultesc=bt,defaultenter=bt,startfocus=bt} + error_message_popup = ml + dg:popup(CENTER, CENTER) + dg:destroy() + error_message_popup = nil + end +end + +pack = function (...) return arg end + +function protectedcall_(f, err) + if not f then + _ERRORMESSAGE(err) + return + end + local ret = pack(pcall(f)) + if not ret[1] then + _ERRORMESSAGE(ret[2]) + return + else + table.remove(ret, 1) + return unpack(ret) + end +end + +function dostring(s) return protectedcall_(loadstring(s)) end +function dofile(f) return protectedcall_(loadfile(f)) end + +function RGB(r, g, b) + return string.format("%d %d %d", 255*r, 255*g, 255*b) +end +------------------------------------------------------------------------------ +-- Label class +------------------------------------------------------------------------------ +local ctrl = { + nick = "label", + parent = WIDGET, + creation = "S", + callback = {} +} + +function ctrl.createElement(class, arg) + return Label(arg.title) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- List class +------------------------------------------------------------------------------ +local ctrl = { + nick = "list", + parent = WIDGET, + creation = "-", + callback = { + action = "snn", + multiselect_cb = "s", + edit_cb = "ns", + } +} + +function ctrl.createElement(class, arg) + return List() +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Matrix class +------------------------------------------------------------------------------ +local ctrl = { + nick = "matrix", + parent = WIDGET, + creation = "-", + callback = { + action_cb = "nnnns", + click_cb = "nns", + release_cb = "nns", + drop_cb = "inn", + dropcheck_cb = "nn", + draw_cb = "nnnnnnn", -- fake definitions to be replaced by matrixfuncs module + dropselect_cb = "nnisnn", + edition_cb = "nnn", + enteritem_cb = "nn", + leaveitem_cb = "nn", + mousemove_cb = "nn", + scrolltop_cb = "nn", + fgcolor_cb = "nn", -- fake definitions to be replaced by matrixfuncs module + bgcolor_cb = "nn", + value_cb = {"nn", ret = "s"}, -- ret is return type + value_edit_cb = "nns", + mark_cb = "nn", + markedit_cb = "nnn", + }, + include = "iupmatrix.h", + extrafuncs = 1, +} + +function ctrl.createElement(class, arg) + return Matrix(arg.action) +end + +function ctrl.setcell(handle, l, c, val) + SetAttribute(handle,l..":"..c,val) +end + +function ctrl.getcell(handle, l, c) + return GetAttribute(handle,l..":"..c) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Menu class +------------------------------------------------------------------------------ +local ctrl = { + nick = "menu", + parent = BOX, + creation = "-", + callback = { + open_cb = "", + menuclose_cb = "", + } +} + +function ctrl.popup(handle, x, y) + Popup(handle, x, y) +end + +function ctrl.append(handle, elem) + Append(handle, elem) +end + +function ctrl.createElement(class, arg) + local n = table.getn(arg) + for i=1,n do + if type(arg[i]) == "table" then + itemarg = {} + for u,v in pairs(arg[i]) do + if type(u) ~= "number" then + itemarg[u] = v + end + end + if type(arg[i][1]) == "string" and (type(arg[i][2]) == "function" or type(arg[i][2]) == "string") then + itemarg.title = arg[i][1] + itemarg.action = arg[i][2] + arg[i] = item(itemarg) + elseif type(arg[i][1]) == "string" and type(arg[i][2]) == "userdata" then + itemarg[1] = arg[i][2] + itemarg.title = arg[i][1] + arg[i] = submenu(itemarg) + end + end + end + return Menu() +end + +function ctrl.showxy(handle, x, y) + return ShowXY(handle, x, y) +end + +function ctrl.destroy(handle) + return Destroy(handle) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- MessageDlg class +------------------------------------------------------------------------------ +local ctrl = { + nick = "messagedlg", + parent = WIDGET, + creation = "", + funcname = "MessageDlg", + callback = {} +} + +function ctrl.popup(handle, x, y) + Popup(handle,x,y) +end + +function ctrl.destroy(handle) + return Destroy(handle) +end + +function ctrl.createElement(class, arg) + return MessageDlg() +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") + +------------------------------------------------------------------------------ +-- Multiline class +------------------------------------------------------------------------------ +local ctrl = { + nick = "multiline", + parent = WIDGET, + creation = "-", + callback = { + action = "ns", + }, + funcname = "MultiLine", +} + +function ctrl.createElement(class, arg) + return MultiLine() +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- OleControl class +------------------------------------------------------------------------------ +local ctrl = { + nick = "olecontrol", + parent = WIDGET, + creation = "s", + funcname = "OleControl", + callback = {}, + include = "iupole.h", + extracode = [[ +int iupolelua_open(lua_State* L) +{ + if (iuplua_opencall_internal(L)) + IupOleControlOpen(); + + iuplua_changeEnv(L); + iupolecontrollua_open(L); + iuplua_returnEnv(L); + return 0; +} + +/* obligatory to use require"iupluaole" */ +int luaopen_iupluaole(lua_State* L) +{ + return iupolelua_open(L); +} + +/* obligatory to use require"iupluaole51" */ +int luaopen_iupluaole51(lua_State* L) +{ + return iupolelua_open(L); +} + +]] +} + +function ctrl.createElement(class, arg) + local ctl = OleControl(arg[1]) + + -- if luacom is loaded, use it to access methods and properties + -- of the control + if luacom then + local punk = ctl.iunknown + if punk then + ctl.com = luacom.MakeLuaCOM(luacom.MakeIUnknown(punk)) + end + end + + return ctl +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- PPlot class +------------------------------------------------------------------------------ +local ctrl = { + nick = "pplot", + parent = WIDGET, + creation = "", + funcname = "PPlot", + callback = { + select_cb = "nnffn", + selectbegin_cb = "", + selectend_cb = "", + predraw_cb = "n", -- fake definitions to be replaced by pplotfuncs module + postdraw_cb = "n", -- fake definitions to be replaced by pplotfuncs module + edit_cb = "nnffff", -- fake definitions to be replaced by pplotfuncs module + editbegin_cb = "", + editend_cb = "", + delete_cb = "nnff", + deletebegin_cb = "", + deleteend_cb = "", + }, + include = "iup_pplot.h", + extrafuncs = 1, +} + +function ctrl.createElement(class, arg) + return PPlot(arg.action) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +---------------------------------------------------- +-- The main porpouse of this file is to build linux gcc makefiles. +-- Must have Premake version 3 installed. +-- Original Premake was changed to remove some parameters and add others. +-- Default parameters: +-- premake3s --target gnu --os linux +-- But it can build windows gcc makefiles, and visual studio projects. +-- premake3s --target gnu --os windows +-- premake3s --target gnu --os macosx +-- premake3s --target vs6 +-- premake3s --target vs2002 +-- premake3s --target vs2003 +-- premake3s --target vs2005 +-- In Linux the generated makefiles will not correctly build libraries in 64-bits. +-- must add "-m64 -fPIC" flags +---------------------------------------------------- + +if (not options.target) then + options.target = "gnu" +end + +if (not options.os) then + if (options.target ~= "gnu") then + options.os = "windows" + else + options.os = "linux" + end +end + +function fixPackagePath(package_files) + if (options.os ~= "linux") then + for i, file in package_files do + package_files[i] = "../src/"..file + end + end +end + +if (options.os ~= "linux") then + if (options.os == "macosx") then + project.path = "../mak.macosx" + else + project.path = "../mak."..options.target + end +end + +---------------------------------------------------- + +project.name = "iup" +project.bindir = "../bin" +project.libdir = "../lib" + +---------------------------------------------------- + +package = newpackage() +package.name = "iuplua51" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + "iuplua.c", "scanf.c", "iuplua_api.c", "fontdlg.c", + "button.c", "canvas.c", "dialog.c", "messagedlg.c", + "filedlg.c", "fill.c", "frame.c", "hbox.c", + "item.c", "image.c", "label.c", "menu.c", "multiline.c", + "list.c", "separator.c", "radio.c", "colordlg.c", + "submenu.c", "text.c", "toggle.c", "vbox.c", "zbox.c", "timer.c" +} +fixPackagePath(package.files) + +package.includepaths = { "../include", "../src", "$(LUA51)/include" } +package.defines = {"IUPLUA_USELOH"} + +--SRCLUA = iuplua.lua constants.lua $(CTRLUA) +--GC = $(addsuffix .c, $(basename $(CTRLUA))) +--$(GC) : %.c : %.lua %.loh generator.lua +-- lua5 generator.lua $< + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "iupluacontrols51" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + "val.c", "dial.c", "gauge.c", "gc.c", "cbox.c", "cells.c", "getparam.c", + "colorbrowser.c", "tabs.c", "mask.c", "colorbar.c", + "matrix.c", "tree.c", "sbox.c", "spin.c", "spinbox.c", + "controls.c", "mask.c", "treefuncs.c", "matrixfuncs.c" +} +fixPackagePath(package.files) + +package.includepaths = { "../include", "$(CD)/include", "$(LUA51)/include" } +package.defines = {"IUPLUA_USELOH"} + +--SRCLUA = val.lua dial.lua gauge.lua colorbrowser.lua tabs.lua sbox.lua matrix.lua tree.lua spin.lua spinbox.lua + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "iuplua_pplot51" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + "pplot.c", "pplotfuncs.c" +} +fixPackagePath(package.files) + +package.includepaths = { "../include", "$(CD)/include", "$(LUA51)/include" } +package.defines = {"IUPLUA_USELOH"} + +--SRCLUA = pplot.lua + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "iupluagl51" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + "glcanvas.c", "glcanvasfuncs.c" +} +fixPackagePath(package.files) + +-- SRCLUA = glcanvas.lua + +package.includepaths = { "../include", "$(LUA51)/include" } +package.defines = {"IUPLUA_USELOH"} + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "iupluaim51" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.files = +{ + "iupluaim.c" +} +fixPackagePath(package.files) + +package.includepaths = { "../include", "$(LUA51)/include" } + +--------------------------------------------------------------------- + +package = newpackage() +package.name = "iuplua51exe" +package.target = "iuplua51" +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "exe" +package.linkflags = { "static-runtime" } + +package.files = +{ + "iupluaexe51.c" +} +fixPackagePath(package.files) + +-- SRCLUA = console.lua + +package.includepaths = { "../include", "$(LUA51)/include", "$(CD)/include", "$(IM)/include" } + +package.links = { "imlua_process51", "im_process", "imlua_cd51", "imlua51", + "cdluaiup51", "cdlua51", + "iupluagl51", "iupluaim51", "iuplua_pplot51.lib", "iupluacontrols51", "iuplua51", + "lua5.1", + "iupgl", "iupim", "iup_pplot.lib", "iupcontrols", + "cdiup", "cd", "iup", "im" } +package.libpaths = { "../lib", "$(IM)/lib", "$(CD)/lib", "$(LUA51)/lib", } + +if (options.os == "windows") then + tinsert(package.links, { "cdgdiplus", "gdiplus", "comctl32", "opengl32", "glu32", "glaux" }) +else + tinsert(package.links, { "GLU", "GL", "Xm", "Xpm", "Xmu", "Xt", "Xext", "X11", "m" }) + tinsert(package.libpaths, { "/usr/X11R6/lib" }) +end + +--------------------------------------------------------------------- +------------------------------------------------------------------------------ +-- Radio class +------------------------------------------------------------------------------ +local ctrl = { + nick = "radio", + parent = WIDGET, + creation = "i", + callback = {} +} + +function ctrl.CreateChildrenNames(obj) + if obj then + if obj.parent.parent == BOX then + local i = 1 + while obj[i] do + ctrl.CreateChildrenNames (obj[i]) + i = i+1 + end + elseif obj.parent == IUPFRAME then + ctrl.CreateChildrenNames (obj[1]) + else + ihandle_setname(obj) + end + end +end + +function ctrl.createElement(class, arg) + ctrl.CreateChildrenNames(arg[1]) + return Radio(arg[1]) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Sbox class +------------------------------------------------------------------------------ +local ctrl = { + nick = "sbox", + parent = WIDGET, + creation = "i", + callback = {}, + include="iupsbox.h" +} + +function ctrl.createElement(class, arg) + return Sbox(arg[1]) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Separator class +------------------------------------------------------------------------------ +local ctrl = { + nick = "separator", + parent = WIDGET, + creation = "", + callback = {} +} + +function ctrl.createElement(class, arg) + return Separator() +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Spin class +------------------------------------------------------------------------------ +local ctrl = { + nick = "spin", + parent = WIDGET, + creation = "", + callback = { + spin_cb = "n", + }, + include = "iupspin.h", +} + +function ctrl.createElement(class, arg) + return Spin(arg.action) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- SpinBox class +------------------------------------------------------------------------------ +local ctrl = { + nick = "spinbox", + parent = WIDGET, + creation = "i", + callback = { + spin_cb = "n", + }, + include = "iupspin.h", +} + +function ctrl.createElement(class, arg) + return Spinbox(arg[1]) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Submenu class +------------------------------------------------------------------------------ +local ctrl = { + nick = "submenu", + parent = WIDGET, + creation = "Si", + callback = { +-- open_cb = "", -- already registered by the menu +-- menuclose_cb = "", -- already registered by the menu + } +} + +function ctrl.createElement(class, arg) + return Submenu(arg.title, arg[1]) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Tabs class +------------------------------------------------------------------------------ +local ctrl = { + nick = "tabs", + parent = WIDGET, + creation = "v", + callback = { + tabchange_cb = "ii", + }, + include = "iuptabs.h", + funcname = "Tabsv", + createfunc = [[ +static int Tabsv(lua_State *L) +{ + Ihandle **hlist = iuplua_checkihandle_array(L, 1); + Ihandle *h = IupTabsv(hlist); + iuplua_plugstate(L, h); + iuplua_pushihandle_raw(L, h); + free(hlist); + return 1; +} + +]], +} + +function ctrl.createElement(class, arg) + return Tabsv(arg) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Text class +------------------------------------------------------------------------------ +local ctrl = { + nick = "text", + parent = WIDGET, + creation = "-", + callback = { + action = "ns", + caret_cb = "nn", + } +} + +function ctrl.createElement(class, arg) + return Text() +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Timer class +------------------------------------------------------------------------------ +local ctrl = { + nick = "timer", + parent = WIDGET, + creation = "", + callback = { + action_cb = "", + }, +} + +function ctrl.createElement(class, arg) + return Timer() +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Toggle class +------------------------------------------------------------------------------ +local ctrl = { + nick = "toggle", + parent = WIDGET, + creation = "S-", + callback = { + action = "n", + } +} + +function ctrl.createElement(class, arg) + return Toggle(arg.title) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Tree class +------------------------------------------------------------------------------ +local ctrl = { + nick = "tree", + parent = WIDGET, + creation = "", + callback = { + selection_cb = "nn", + multiselection_cb = "nn", -- fake definition to be replaced by treefuncs module + branchopen_cb = "n", + branchclose_cb = "n", + executeleaf_cb = "n", + renamenode_cb = "ns", + rename_cb = "ns", + showrename_cb = "n", + rightclick_cb = "n", + dragdrop_cb = "nnnn", + }, + include = "iuptree.h", + extrafuncs = 1, +} + +function TreeSetValueRec(handle, t, id) + if t == nil then return end + local cont = table.getn(t) + while cont >= 0 do + if type (t[cont]) == "table" then + if t[cont].branchname ~= nil then + SetAttribute(handle, "ADDBRANCH"..id, t[cont].branchname) + TreeSetValueRec(handle, t[cont], id+1) + end + else + if t[cont] then + SetAttribute(handle, "ADDLEAF"..id, t[cont]) + end + end + cont = cont - 1 + end +end + +function TreeSetValue(handle, t) + if t.branchname ~= nil then + SetAttribute(handle, "NAME", t.branchname) + end + TreeSetValueRec(handle, t, 0) +end + +function ctrl.createElement(class, arg) + return Tree() +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- Val class +------------------------------------------------------------------------------ +local ctrl = { + nick = "val", + parent = WIDGET, + creation = "s", + callback = { + mousemove_cb = "d", + button_press_cb = "d", + button_release_cb = "d", + }, + include = "iupval.h", +} + +function ctrl.createElement(class, arg) + return Val(arg[1]) +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- VBox class +------------------------------------------------------------------------------ +local ctrl = { + nick = "vbox", + parent = BOX, + creation = "-", + callback = {} +} + +function ctrl.append (handle, elem) + Append(handle, elem) +end + +function ctrl.createElement(class, arg) + return Vbox() +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +------------------------------------------------------------------------------ +-- ZBox class +------------------------------------------------------------------------------ +local ctrl = { + nick = "zbox", + parent = BOX, + creation = "-", + callback = {} +} + +function ctrl.append (handle, elem) + ihandle_setname(elem) + Append(handle, elem) +end + +function ctrl.SetChildrenNames(obj) + if obj then + local i = 1 + while obj[i] do + ihandle_setname(obj[i]) + i = i+1 + end + end +end + +function ctrl.createElement(class, arg) + ctrl.SetChildrenNames(arg) + return Zbox() +end + +iupRegisterWidget(ctrl) +iupSetClass(ctrl, "iup widget") +---------------------------------------------------- +-- The main porpouse of this file is to build linux gcc makefiles. +-- Must have Premake version 3 installed. +-- Original Premake was changed to remove some parameters and add others. +-- Default parameters: +-- premake3s --target gnu --os linux +-- But it can build windows gcc makefiles, and visual studio projects. +-- premake3s --target gnu --os windows +-- premake3s --target gnu --os macosx +-- premake3s --target vs6 +-- premake3s --target vs2002 +-- premake3s --target vs2003 +-- premake3s --target vs2005 +-- In Linux the generated makefiles will not correctly build libraries in 64-bits. +-- must add "-m64 -fPIC" flags +---------------------------------------------------- + +if (not options.target) then + options.target = "gnu" +end + +if (not options.os) then + if (options.target ~= "gnu") then + options.os = "windows" + else + options.os = "linux" + end +end + +function fixPackagePath(package_files) + if (options.os ~= "linux") then + for i, file in package_files do + package_files[i] = "../src/"..file + end + end +end + +---------------------------------------------------- + +project.name = "iup" +project.bindir = "../bin" +project.libdir = "../lib" + +if (options.os ~= "linux") then + if (options.os == "macosx") then + project.path = "../mak.macosx" + else + project.path = "../mak."..options.target + end +end + +---------------------------------------------------- + +package = newpackage() +package.name = "iup_pplot" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "lib" +package.buildflags = { "static-runtime" } + +package.includepaths = { ".", "../include" } + +package.files = { "iup_pplot.cpp", "PPlot.cpp", "PPlotInteraction.cpp" } +fixPackagePath(package.files) + +---------------------------------------------------- +---------------------------------------------------- +-- The main porpouse of this file is to build linux gcc makefiles. +-- Must have Premake version 3 installed. +-- Original Premake was changed to remove some parameters and add others. +-- Default parameters: +-- premake3s --target gnu --os linux +-- But it can build windows gcc makefiles, and visual studio projects. +-- premake3s --target gnu --os windows +-- premake3s --target gnu --os macosx +-- premake3s --target vs6 +-- premake3s --target vs2002 +-- premake3s --target vs2003 +-- premake3s --target vs2005 +-- In Linux the generated makefiles will not correctly build libraries in 64-bits. +-- must add "-m64 -fPIC" flags +---------------------------------------------------- + +if (not options.target) then + options.target = "gnu" +end + +if (not options.os) then + if (options.target ~= "gnu") then + options.os = "windows" + else + options.os = "linux" + end +end + +function fixPackagePath(package_files) + if (options.os ~= "linux") then + for i, file in package_files do + package_files[i] = "../src/"..file + end + end +end + +---------------------------------------------------- + +project.name = "iup" +project.bindir = "../bin" +project.libdir = "../lib" + +if (options.os ~= "linux") then + if (options.os == "macosx") then + project.path = "../mak.macosx" + else + project.path = "../mak."..options.target + end +end + +---------------------------------------------------- + +package = newpackage() +package.name = "iupview" +package.target = package.name +package.objdir = "../obj/"..package.name +package.language = "c++" +package.kind = "winexe" +package.linkflags = { "static-runtime" } + +package.files = +{ + "iupview.c" +} +fixPackagePath(package.files) + +package.includepaths = { ".", "../include", "$(CD)/include" } +package.links = { "iupgl", "iupim", "iupimglib", "iupcontrols", "cdiup", "cd", "iup", "im" } +package.libpaths = { "../lib", "$(IM)/lib", "$(CD)/lib" } + +if (options.os == "windows") then + tinsert(package.links, { "comctl32", "opengl32", "glu32", "glaux" }) +else + tinsert(package.links, { "GLU", "GL", "Xm", "Xpm", "Xmu", "Xt", "Xext", "X11", "m" }) + tinsert(package.libpaths, { "/usr/X11R6/lib" }) +end + +---------------------------------------------------- + +l = iup.label{title="1", size="200x"} + +function idle_cb() + local v = tonumber(l.title) + 1 + l.title = v + if v == 10000 then + iup.SetIdle(nil) + end + return iup.DEFAULT +end + +dlg = iup.dialog{l; title = "Idle Test"} + +dlg:showxy(iup.CENTER, iup.CENTER) + +-- Registers idle callback +iup.SetIdle(idle_cb) + +-- Creates a IupColorBrowser control and updates, through +-- callbacks, the values of texts representing the R, G and B +-- components of the selected color. + +text_red = iup.text{} +text_green = iup.text{} +text_blue = iup.text{} + +cb = iup.colorbrowser{} + +function update(r, g, b) + text_red.value = r + text_green.value = g + text_blue.value = b +end + +function cb:drag_cb(r, g ,b) + update(r,g,b) +end + +function cb:change_cb(r, g ,b) + update(r,g,b) +end + +vbox = iup.vbox { + iup.fill {}, + text_red, + iup.fill {}, + text_green, + iup.fill {}, + text_blue, + iup.fill {} + } + +dlg = iup.dialog{iup.hbox {cb, iup.fill{}, vbox}; title = "ColorBrowser"} +dlg:showxy(iup.CENTER, iup.CENTER) +--IupDial Example in IupLua + +lbl_h = iup.label{title = "0", alignment = "ACENTER", size = "100x10"} +lbl_v = iup.label{title = "0", alignment = "ACENTER", size = "100x10"} +lbl_c = iup.label{title = "0", alignment = "ACENTER", size = "100x10"} + +dial_v = iup.dial{"VERTICAL"; size="100x100"} +dial_h = iup.dial{"HORIZONTAL"; density=0.3} + +function dial_v:mousemove_cb(a) + lbl_v.title = a + return iup.DEFAULT +end + +function dial_v:button_press_cb(a) + lbl_v.bgcolor = "255 0 0" + return iup.DEFAULT +end + +function dial_v:button_release_cb(a) + lbl_v.bgcolor = nil + return iup.DEFAULT +end + +function dial_h:mousemove_cb(a) + lbl_h.title = a + return iup.DEFAULT +end + +function dial_h:button_press_cb(a) + lbl_h.bgcolor = "255 0 0" + return iup.DEFAULT +end + +function dial_h:button_release_cb(a) + lbl_h.bgcolor = nil + return iup.DEFAULT +end + +dlg = iup.dialog +{ + iup.hbox + { + iup.fill{}, + iup.vbox + { + iup.fill{}, + iup.frame + { + iup.vbox + { + iup.hbox + { + iup.fill{}, + dial_v, + iup.fill{} + } , + iup.hbox + { + iup.fill{}, + lbl_v, + iup.fill{} + } + } + }, + iup.fill{}, + iup.frame + { + iup.vbox + { + iup.hbox + { + iup.fill{}, + dial_h, + iup.fill{} + } , + iup.hbox + { + iup.fill{}, + lbl_h, + iup.fill{} + } , + } + }, + iup.fill{}, + }, + iup.fill{} + }; title="IupDial" +} + +dlg:showxy(iup.CENTER,iup.CENTER) + + +function idle_cb() + local value = gauge.value + value = value + 0.0001; + if value > 1.0 then + value = 0.0 + end + gauge.value = value + return iup.DEFAULT +end + +gauge = iup.gauge{} +gauge.size = "QUARTERxEIGHTH" +gauge.show_text = "YES" + +dlg = iup.dialog{gauge; title = "IupGauge"} + +-- Registers idle callback +iup.SetIdle(idle_cb) + +dlg:showxy(iup.CENTER, iup.CENTER) +-- +-- IupGetColor Example in IupLua +-- +-- Creates a predefined color selection dialog which returns the +-- selected color in the RGB format. +-- + +r, g, b = iup.GetColor(100, 100, 255, 255, 255) +if (r) then + print("r="..r.." g="..g.." b="..b) +end +-- IupGetParam Example in IupLua +-- Shows a dialog with all possible fields. + +iup.SetLanguage("ENGLISH") + +function param_action(dialog, param_index) + if (param_index == -1) then + print("OK") + elseif (param_index == -2) then + print("Map") + elseif (param_index == -3) then + print("Cancel") + else + local param = iup.GetParamParam(dialog, param_index) + print("PARAM"..param_index.." = "..param.value) + end + return 1 +end + +-- set initial values +pboolean = 1 +pinteger = 3456 +preal = 3.543 +pinteger2 = 192 +preal2 = 0.5 +pangle = 90 +pstring = "string text" +plist = 2 +pstring2 = "second text\nsecond line" + +ret, pboolean, pinteger, preal, pinteger2, preal2, pangle, pstring, plist, pstring2 = + iup.GetParam("Title", param_action, + "Boolean: %b\n".. + "Integer: %i\n".. + "Real 1: %r\n".. + "Sep1 %t\n".. + "Integer: %i[0,255]\n".. + "Real 2: %r[-1.5,1.5]\n".. + "Sep2 %t\n".. + "Angle: %a[0,360]\n".. + "String: %s\n".. + "List: %l|item1|item2|item3|\n".. + "Sep3 %t\n".. + "Multiline: %m\n", + pboolean, pinteger, preal, pinteger2, preal2, pangle, pstring, plist, pstring2) +if (ret == 0) then + return +end + +iup.Message("IupGetParam", + "Boolean Value: "..pboolean.."\n".. + "Integer: "..pinteger.."\n".. + "Real 1: "..preal.."\n".. + "Integer: "..pinteger2.."\n".. + "Real 2: "..preal2.."\n".. + "Angle: "..pangle.."\n".. + "String: "..pstring.."\n".. + "List Index: "..plist.."\n".. + "String: "..pstring2) +-- Example IupGLCanvas in Lua +-- Creates a OpenGL canvas and draws a line in it. +-- This example uses gllua binding of OpenGL to Lua. + +cv = iup.glcanvas{buffer="DOUBLE", rastersize = "300x300"} + +function cv:action(x, y) + iup.GLMakeCurrent(self) + --glClearColor(1.0, 1.0, 1.0, 1.0) + --glClear(GL_COLOR_BUFFER_BIT) + --glClear(GL_DEPTH_BUFFER_BIT) + --glMatrixMode( GL_PROJECTION ) + --glViewport(0, 0, 300, 300) + --glLoadIdentity() + --glBegin( GL_LINES ) + --glColor(1.0, 0.0, 0.0) + --glVertex(0.0, 0.0) + --glVertex(10.0, 10.0) + --glEnd() + iup.GLSwapBuffers(self) + return iup.DEFAULT +end + +dg = iup.dialog{cv; title="IupGLCanvas Example"} + +function cv:k_any(c) + if c == iup.K_q then + return iup.CLOSE + else + return iup.DEFAULT + end +end + + +dg:show() + +canvas = iup.glcanvas{buffer="DOUBLE", rastersize = "640x480"} + +function canvas:resize_cb(width, height) + iup.GLMakeCurrent(self) + + gl.Viewport(0, 0, width, height) + + gl.MatrixMode('PROJECTION') + gl.LoadIdentity() + + gl.MatrixMode('MODELVIEW') + gl.LoadIdentity() + +end + +function canvas:action() + iup.GLMakeCurrent(self) + + gl.MatrixMode("PROJECTION") + gl.LoadIdentity() + gl.Ortho(0, 1, 1, 0, -1.0, 1.0) + gl.MatrixMode("MODELVIEW") + gl.LoadIdentity() + gl.PushMatrix() + gl.Translate(0.25,0.5, 0) + gl.Scale(0.2, 0.2, 1) + + gl.BlendFunc("SRC_ALPHA", "ONE_MINUS_SRC_ALPHA") + + gl.ClearColor(0,0,0,1) + gl.Clear("DEPTH_BUFFER_BIT,COLOR_BUFFER_BIT") + gl.Enable("BLEND") + + -- draw rectangle + gl.Color( {1, 1, 0, 0.8} ) + gl.Rect(-1,-1,1,1) + + -------------------------------------------------------- + -- Create List That Draws the Circle + -------------------------------------------------------- + + planet = 1 + orbit = 2 + pi = + + gl.NewList(planet, "COMPILE") + gl.Begin("POLYGON") + for i=0, 100 do + cosine = math.cos(i * 2 * math.pi/100.0) + sine = math.sin(i * 2 * math.pi/100.0) + gl.Vertex(cosine,sine) + end + gl.End() + gl.EndList() + + gl.NewList(orbit, "COMPILE") + gl.Begin("LINE_LOOP") + for i=0, 100 do + cosine = math.cos(i * 2 * math.pi/100.0) + sine = math.sin(i * 2 * math.pi/100.0) + gl.Vertex(cosine, sine) + end + gl.End() + gl.EndList() + + -------------------------------------------------------- + + gl.Color( {0, 0.5, 0, 0.8} ) + gl.CallList(planet) + + gl.Color( {0, 0, 0, 1} ) + lists = { orbit } + gl.CallLists(lists) + + gl.EnableClientState ("VERTEX_ARRAY") + + vertices = { {-3^(1/2)/2, 1/2}, {3^(1/2)/2, 1/2}, {0, -1}, {-3^(1/2)/2, -1/2}, {3^(1/2)/2, -1/2}, {0, 1} } + + gl.VertexPointer (vertices) + + -- draw first triangle + gl.Color( {0, 0, 1, 0.5} ) + + gl.Begin("TRIANGLES") + gl.ArrayElement (0) + gl.ArrayElement (1) + gl.ArrayElement (2) + gl.End() + + -- draw second triangle + gl.Color( {1, 0, 0, 0.5} ) + gl.VertexPointer (vertices) + gl.DrawArrays("TRIANGLES", 3, 3) + + -- draw triangles outline + gl.Color(1,1,1,1) + elements = { 0, 1, 2} gl.DrawElements("LINE_LOOP", elements) + elements = { 3, 4, 5} gl.DrawElements("LINE_LOOP", elements) + + gl.DisableClientState ("VERTEX_ARRAY") + + gl.PopMatrix() + gl.Translate(0.75,0.5, 0) + gl.Scale(0.2, 0.2, 1) + + ---------------------------------------------------------------------------- + + gl.BlendFunc("SRC_ALPHA", "ONE_MINUS_SRC_ALPHA") + + -- draw rectangle + gl.Color( {1, 1, 0, 0.8} ) + + gl.Begin("QUADS") + gl.Vertex(-1,-1) + gl.Vertex( 1,-1) + gl.Vertex( 1, 1) + gl.Vertex(-1, 1) + gl.End() + ------------------------------- + gl.Color( {0, 0.5, 0, 0.8} ) + gl.Begin("POLYGON") + for i=0, 100 do + cosine = math.cos(i * 2 * math.pi/100.0) + sine = math.sin(i * 2 * math.pi/100.0) + gl.Vertex(cosine,sine) + end + gl.End() + + gl.Color( {0, 0, 0, 1} ) + gl.Begin("LINE_LOOP") + for i=0, 100 do + cosine = math.cos(i * 2 * math.pi/100.0) + sine = math.sin(i * 2 * math.pi/100.0) + gl.Vertex(cosine, sine) + end + gl.End() + + -- draw first triangle + gl.Color( {0, 0, 1, 0.5} ) + gl.Begin("TRIANGLES") + gl.Vertex (vertices[1]) + gl.Vertex (vertices[2]) + gl.Vertex (vertices[3]) + gl.End() + -- draw second triangle + gl.Color( {1, 0, 0, 0.5} ) + gl.Begin("TRIANGLES") + gl.Vertex (vertices[4]) + gl.Vertex (vertices[5]) + gl.Vertex (vertices[6]) + gl.End() + -- draw triangles outline + gl.Color(1,1,1,1) + gl.Begin("LINE_LOOP") + gl.Vertex (vertices[1]) + gl.Vertex (vertices[2]) + gl.Vertex (vertices[3]) + gl.End() + gl.Begin("LINE_LOOP") + gl.Vertex (vertices[4]) + gl.Vertex (vertices[5]) + gl.Vertex (vertices[6]) + gl.End() + + iup.GLSwapBuffers(self) + gl.Flush() + +end + +dialog = iup.dialog{canvas; title="Lua GL Test Application"} +dialog:show() +-- IupMask Example in Lua +-- Creates an IupText that accepts only numbers. + +txt = iup.text{} +iup.maskSet(txt, "/d*", 0, 1) ; +dg = iup.dialog{txt} +dg:show()mat= iup.matrix{numlin=3, numcol=3} +mat:setcell(1,1,"Only numbers") +iup.maskMatSet(mat, "/d*", 0, 1, 1, 1) ; +dg = iup.dialog{mat} +dg:show() + +mat = iup.matrix {numcol=5, numlin=3,numcol_visible=5, numlin_visible=3, widthdef=34} +mat.resizematrix = "YES" +mat:setcell(0,0,"Inflation") +mat:setcell(1,0,"Medicine") +mat:setcell(2,0,"Food") +mat:setcell(3,0,"Energy") +mat:setcell(0,1,"January 2000") +mat:setcell(0,2,"February 2000") +mat:setcell(1,1,"5.6") +mat:setcell(2,1,"2.2") +mat:setcell(3,1,"7.2") +mat:setcell(1,2,"4.6") +mat:setcell(2,2,"1.3") +mat:setcell(3,2,"1.4") +dlg = iup.dialog{iup.vbox{mat; margin="10x10"}} +dlg:showxy(iup.CENTER, iup.CENTER) +matrix = iup.matrix +{ + numlin=3, + numcol=3, + numcol_visible=3, + height0=10, + widthdef=30, + scrollbar="VERTICAL", +} + +data = { + {"1:1", "1:2", "1:3"}, + {"2:1", "2:2", "2:3"}, + {"3:1", "3:2", "3:3"}, + } + +function matrix:value_cb(l, c) + if l == 0 or c == 0 then + return "title" + end + return data[l][c] +end + +function matrix:value_edit_cb(l, c, newvalue) + data[l][c] = newvalue +end + +dlg=iup.dialog{matrix; title="IupMatrix in Callback Mode" } +dlg:show() + +bt = iup.button{title="Test"} +bt.expand = "YES" +box = iup.sbox{bt} +box.direction = "SOUTH" +box.color = "0 0 255" + +ml = iup.multiline{} +ml.expand = "YES" +vbox = iup.vbox{box, ml} + +lb = iup.label{title="Label"} +lb.expand = "YES" +dg = iup.dialog{iup.hbox{vbox, lb}} +dg:show() +--IupSpeech Example in Lua + +label = iuplabel{title="Possible commands are defined in xml1.xml"} +text = iuptext {size="200"} + +function reco(self, msg) + text.value = msg +end + +sk = iupspeech{action=reco, grammar="xml1.xml", say="xml1 loaded"} + +dg = iupdialog{iupvbox{label, text}; title = "IupSpeech Test"} +dg:show() +-- Creates boxes +vboxA = iup.vbox{iup.label{title="TABS AAA"}, iup.button{title="AAA"}} +vboxB = iup.vbox{iup.label{title="TABS BBB"}, iup.button{title="BBB"}} + +-- Sets titles of the vboxes +vboxA.tabtitle = "AAAAAA" +vboxB.tabtitle = "BBBBBB" + +-- Creates tabs +tabs = iup.tabs{vboxA, vboxB} + +-- Creates dialog +dlg = iup.dialog{tabs; title="Test IupTabs", size="200x80"} + +-- Shows dialog in the center of the screen +dlg:showxy(iup.CENTER, iup.CENTER)-- IupTree Example in IupLua +-- Creates a tree with some branches and leaves. +-- Two callbacks are registered: one deletes marked nodes when the Del key +-- is pressed, and the other, called when the right mouse button is pressed, +-- opens a menu with options. + +tree = iup.tree{} + +-- Creates rename dialog +ok = iup.button{title = "OK",size="EIGHTH"} +cancel = iup.button{title = "Cancel",size="EIGHTH"} + +text = iup.text{border="YES",expand="YES"} +dlg_rename = iup.dialog{iup.vbox{text,iup.hbox{ok,cancel}}; + defaultenter=ok, + defaultesc=cancel, + title="Enter node's name", + size="QUARTER", + startfocus=text} + +-- Creates menu displayed when the right mouse button is pressed +addleaf = iup.item {title = "Add Leaf"} +addbranch = iup.item {title = "Add Branch"} +renamenode = iup.item {title = "Rename Node"} +menu = iup.menu{addleaf, addbranch, renamenode} + +-- Callback of the right mouse button click +function tree:rightclick_cb(id) + tree.value = id + menu:popup(iup.MOUSEPOS,iup.MOUSEPOS) + return iup.DEFAULT +end + +-- Callback called when a node will be renamed +function tree:renamenode_cb(id) + text.value = tree.name + + dlg_rename:popup(iup.CENTER, iup.CENTER) + iup.SetFocus(tree) + + return iup.DEFAULT +end + +-- Callback called when the rename operation is cancelled +function cancel:action() + return iup.CLOSE +end + +-- Callback called when the rename operation is confirmed +function ok:action() + tree.name = text.value + + return iup.CLOSE +end + +function tree:k_any(c) + if c == 339 then tree.delnode = "MARKED" end + return iup.DEFAULT +end + +-- Callback called when a leaf is added +function addleaf:action() + tree.addleaf = "" + tree.redraw = "YES" + return iup.DEFAULT +end + +-- Callback called when a branch is added +function addbranch:action() + tree.addbranch = "" + tree.redraw = "YES" + return iup.DEFAULT +end + +-- Callback called when a branch will be renamed +function renamenode:action() + tree:renamenode_cb(tree.value) + tree.redraw = "YES" + return iup.DEFAULT +end + +function init_tree_atributes() + tree.font = "COURIER_NORMAL_10" + tree.name = "Figures" + tree.addbranch = "3D" + tree.addbranch = "2D" + tree.addbranch1 = "parallelogram" + tree.addleaf2 = "diamond" + tree.addleaf2 = "square" + tree.addbranch1 = "triangle" + tree.addleaf2 = "scalenus" + tree.addleaf2 = "isoceles" + tree.value = "6" + tree.ctrl = "YES" + tree.shift = "YES" + tree.addexpanded = "NO" + tree.redraw = "YES" +end + +dlg = iup.dialog{tree; title = "IupTree", size = "QUARTERxTHIRD"} +dlg:showxy(iup.CENTER,iup.CENTER) +init_tree_atributes()--IupTree Example in IupLua +--Creates a tree with some branches and leaves. Uses a Lua Table to define the IupTree structure. + +tree = iup.tree{} +dlg = iup.dialog{tree ; title = "TableTree result", size = "200x200"} +dlg:showxy(iup.CENTER,iup.CENTER) + +t = { + { + "Horse", + "Whale"; + branchname = "Mammals" + }, + { + "Shrimp", + "Lobster"; + branchname = "Crustaceans" + }; + branchname = "Animals" +} +iup.TreeSetValue(tree, t) + +tree.redraw = "YES" +-- IupTree Example in IupLua +-- Creates a tree with some branches and leaves. +-- Two callbacks are registered: one deletes marked nodes when the Del key +-- is pressed, and the other, called when the right mouse button is pressed, +-- opens a menu with options. + + +tree = iup.tree{} + + +function tree:showrename_cb(id) + print("SHOWRENAME") + return iup.DEFAULT +end +-- Callback called when a node will be renamed +function tree:renamenode_cb(id) + print("RENAMENODE") + return iup.DEFAULT +end + + +function tree:k_any(c) + if c == 316 then tree.delnode = "MARKED" end + return iup.DEFAULT +end + + +function init_tree_atributes() + tree.font = "COURIER_NORMAL_10" + tree.name = "Figures" + tree.addbranch = "3D" + tree.addbranch = "2D" + tree.addbranch1 = "parallelogram" + tree.addleaf2 = "diamond" + tree.addleaf2 = "square" + tree.addbranch1 = "triangle" + tree.addleaf2 = "scalenus" + tree.addleaf2 = "isoceles" + tree.value = "6" + tree.ctrl = "YES" + tree.shift = "YES" + tree.addexpanded = "NO" + tree.redraw = "YES" + tree.showrename = "NO" +end + + +dlg = iup.dialog{tree; title = "IupTree", size = "QUARTERxTHIRD"} +dlg:showxy(iup.CENTER,iup.CENTER) +init_tree_atributes()-- IupVal Example in IupLua +-- Creates two Valuator controls, exemplifying the two possible types. +-- When manipulating the Valuator, the label's value changes. + +if not string then + string = {} + string.format = format +end + +function fbuttonpress(self) + if(self.type == "VERTICAL") then + lbl_v.fgcolor = "255 0 0" + else + lbl_h.fgcolor = "255 0 0" + end + return iup.DEFAULT +end + +function fbuttonrelease(self) + if(self.type == "VERTICAL") then + lbl_v.fgcolor = "0 0 0" + else + lbl_h.fgcolor = "0 0 0" + end + return iup.DEFAULT +end + +function fmousemove(self, val) + local buffer = "iup.VALUE="..string.format('%.2f', val) + if (self.type == "VERTICAL") then + lbl_v.title=buffer + else + lbl_h.title=buffer + end + return iup.DEFAULT +end + +val_v = iup.val{"VERTICAL"; min=0, max=1, value="0.3", + mousemove_cb=fmousemove, + button_press_cb=fbuttonpress, + button_release_cb=fbuttonrelease +} + +lbl_v = iup.label{title="VALUE= ", size=70, type="1"} + +val_h = iup.val{"HORIZONTAL"; min=0, max=1, value=0, + mousemove_cb=fmousemove, + button_press_cb=fbuttonpress, + button_release_cb=fbuttonrelease +} + +lbl_h = iup.label{title="VALUE= ", size=70, type="2"} + +dlg_val = iup.dialog +{ + iup.hbox + { + iup.frame + { + iup.vbox + { + val_v, + lbl_v + } + }, + iup.frame + { + iup.vbox + { + val_h, + lbl_h + } + } + }; + title="Valuator Test" +} + +dlg_val:show() + +-- IupAlarm Example in IupLua +-- Shows a dialog similar to the one shown when you exit a program +-- without saving. + +b = iup.Alarm("IupAlarm Example", "File not saved! Save it now?" ,"Yes" ,"No" ,"Cancel") + +-- Shows a message for each selected button +if b == 1 then + iup.Message("Save file", "File saved sucessfully - leaving program") +elseif b == 2 then + iup.Message("Save file", "File not saved - leaving program anyway") +elseif b == 3 then + iup.Message("Save file", "Operation canceled") +end-- IupFileDlg Example in IupLua +-- Shows a typical file-saving dialog. + +-- Creates a file dialog and sets its type, title, filter and filter info +filedlg = iup.filedlg{dialogtype = "SAVE", title = "File save", + filter = "*.bmp", filterinfo = "Bitmap files", + directory="c:\\windows"} + +-- Shows file dialog in the center of the screen +filedlg:popup (iup.ANYWHERE, iup.ANYWHERE) + +-- Gets file dialog status +status = filedlg.status + +if status == "1" then + iup.Message("New file",filedlg.value) +elseif status == "0" then + iup.Message("File already exists", filedlg.value) +elseif status == "-1" then + iup.Message("IupFileDlg","Operation canceled") +end-- IupGetFile Example in IupLua +-- Shows a typical file-selection dialog. + +iup.SetLanguage("ENGLISH") +f, err = iup.GetFile("*.txt") +if err == 1 then + iup.Message("New file", f) +elseif err == 0 then + iup.Message("File already exists", f) +elseif err == -1 then + iup.Message("IupFileDlg", "Operation canceled") +elseif err == -2 then + iup.Message("IupFileDlg", "Allocation errr") +elseif err == -3 then + iup.Message("IupFileDlg", "Invalid parameter") +end-- IupListDialog Example in IupLua +-- Shows a color-selection dialog. + +iup.SetLanguage("ENGLISH") +size = 8 +marks = { 0,0,0,0,1,1,0,0 } +options = {"Blue", "Red", "Green", "Yellow", "Black", "White", "Gray", "Brown"} + +error = iup.ListDialog(2,"Color selection",size,options,0,16,5,marks); + +if error == -1 then + iup.Message("IupListDialog", "Operation canceled") +else + local selection = "" + local i = 1 + while i ~= size+1 do + if marks[i] ~= 0 then + selection = selection .. options[i] .. "\n" + end + i = i + 1 + end + if selection == "" then + iup.Message("IupListDialog","No option selected") + else + iup.Message("Selected options",selection) + end +end-- IupMessage Example in IupLua +-- Shows a dialog with the message: “Click the button”. + +iup.Message ("IupMessage", "Press the button")-- IupScanf Example in IupLua +-- Shows a dialog with three fields to be filled. +-- One receives a string, the other receives a real number and +-- the last receives an integer number. +-- Note: In Lua, the function does not return the number of successfully read characters. + +iup.SetLanguage("ENGLISH") +local integer = 12 +local real = 1e-3 +local text ="This is a vector of characters" +local fmt = "IupScanf\nText:%300.40%s\nReal:%20.10%g\nInteger:%20.10%d\n" + +text, real, integer = iup.Scanf (fmt, text, real, integer) + +if text then + local string = "Text: "..text.."\nReal: "..real.."\nInteger: "..integer + iup.Message("IupScanf", string) +else + iup.Message("IupScanf", "Operation canceled"); +end +-- Creates four buttons. The first uses images, the second turns the first +-- on and off, the third exits the application and the last does nothing + +-- defines released button image +img_release = iup.image { + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,4,4,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,4,4,4,4,3,3,3,2,2}, + {1,1,3,3,3,3,3,4,4,4,4,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,4,4,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, + {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}; + colors = { "215 215 215", "40 40 40", "30 50 210", "240 0 0" } +} + +-- defines pressed button image +img_press = iup.image { + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,4,4,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,4,4,4,4,3,3,3,3,2,2}, + {1,1,3,3,3,3,4,4,4,4,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,4,4,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, + {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}; + colors = { "40 40 40", "215 215 215", "0 20 180", "210 0 0" } +} + +-- defines deactivated button image +img_inactive = iup.image { + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,4,4,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,4,4,4,4,3,3,3,2,2}, + {1,1,3,3,3,3,3,4,4,4,4,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,4,4,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2}, + {1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, + {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}; + colors = { "215 215 215", "40 40 40", "100 100 100", "200 200 200" } +} + +-- creates a text box +text = iup.text{ readonly = "YES", SIZE = "EIGHTH" } + +-- creates a button with image +btn_image = iup.button{ title = "Button with image", image = img_release, impress = img_press, iminactive = img_inactive } + +-- creates a button +btn_big = iup.button{ title = "Big useless button", size = "EIGHTHxEIGHTH" } + +-- creates a button entitled Exit +btn_exit = iup.button{ title = "Exit" } + +-- creates a button entitled Activate +btn_on_off = iup.button{ title = "Activate" } + +-- creates a dialog and sets dialog's title and turns off resize, menubox, maximize and minimize +dlg = iup.dialog{ iup.vbox{ iup.hbox{ iup.fill{}, btn_image, btn_on_off, btn_exit, iup.fill{} }, text, btn_big }; title = "IupButton", resize = "NO", menubox = "NO", maxbox = "NO", minbox = "NO" } + +-- callback called when activate button is activated +function btn_on_off:action() + if btn_image.active == "YES" then + btn_image.active = "NO" + else + btn_image.active = "YES" + end + + return iup.DEFAULT +end + +-- callback called when the button is pressed or released +function btn_image:button( b, e ) + if( b == iup.BUTTON1 ) then + if( e == 1 ) then + -- botão pressionado + text.value = "Red button pressed" + else + -- botão solto + text.value = "Red button released" + end + end + return iup.DEFAULT +end + +-- callback called when the exit button is activated +function btn_exit:action() + dlg:hide() +end + +-- shows dialog +dlg:showxy( iup.CENTER, iup.CENTER)--IupCanvas Example in IupLua + +cv = iup.canvas {size="300x100", xmin=0, xmax=99, posx=0, dx=10} +dg = iup.dialog{iup.frame{cv}; title="IupCanvas"} + +function cv:motion_cb(x, y, r) + print(x, y, r) + return iup.DEFAULT +end + +dg:showxy(iup.CENTER, iup.CENTER) +--IupDialog Example in IupLua +--Creates a simple dialog. + +vbox = iup.vbox { iup.label {title="Label"}, iup.button { title="Test" } } +dlg = iup.dialog{vbox; title="Dialog"} +dlg:show() + +tecgraf = iup.image{ + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 02, 05, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 04, 05, 05, 05, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 11, 05, 05, 05, 05, 12, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 10, 06, 05, 03, 05, 05, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 07, 05, 01, 01, 03, 05, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 07, 05, 01, 01, 03, 05, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 02, 09, 09, 01, 01, 03, 07, 06, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 07, 06, 01, 01, 01, 01, 02, 07, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 07, 06, 01, 01, 01, 01, 04, 07, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 07, 06, 01, 01, 01, 01, 04, 07, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 11, 02, 07, 05, 04, 04, 04, 04, 04, 04, 11, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 07, 04, 04, 04, 06, 03, 03, 07, 05, 05, 07, 07, 04, 04, 04, 04, 10, 10, 10, 10, 10, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 04, 04, 04, 09, 09, 06, 05, 04, 08, 07, 05, 01, 01, 01, 01, 07, 05, 06, 03, 03, 03, 03, 04, 10, 07, 09, 01, 01, }, + { 01, 01, 01, 04, 04, 06, 06, 08, 01, 01, 01, 01, 01, 10, 05, 01, 01, 01, 01, 10, 06, 01, 01, 01, 01, 01, 03, 03, 07, 07, 07, 01, }, + { 01, 01, 02, 04, 04, 05, 01, 01, 01, 01, 01, 01, 01, 04, 05, 01, 01, 01, 01, 07, 09, 01, 01, 01, 01, 01, 01, 01, 07, 07, 05, 01, }, + { 01, 01, 01, 03, 04, 04, 04, 01, 01, 01, 01, 01, 01, 04, 05, 01, 01, 01, 01, 07, 06, 01, 01, 01, 01, 01, 07, 07, 07, 09, 07, 01, }, + { 01, 01, 01, 01, 03, 03, 03, 04, 10, 10, 10, 11, 01, 04, 05, 01, 01, 01, 01, 05, 06, 15, 05, 07, 07, 07, 09, 06, 05, 05, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 03, 03, 03, 03, 03, 02, 04, 07, 05, 05, 05, 05, 06, 09, 14, 14, 06, 05, 05, 05, 07, 12, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 06, 03, 03, 02, 02, 02, 04, 04, 02, 02, 10, 16, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 02, 05, 01, 01, 01, 01, 06, 07, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 02, 05, 01, 01, 01, 01, 06, 07, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 02, 05, 01, 01, 01, 01, 06, 07, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 03, 07, 09, 01, 01, 04, 09, 05, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 12, 03, 05, 01, 01, 05, 07, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 03, 05, 01, 01, 07, 07, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 03, 05, 05, 04, 07, 07, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 09, 03, 05, 07, 07, 13, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 03, 07, 07, 07, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 03, 04, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, }, + { 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01 }; + colors = { + "BGCOLOR", + "079 086 099", + "040 045 053", + "104 113 129", + "136 147 170", + "155 164 179", + "121 136 167", + "239 239 243", + "176 190 214", + "127 133 143", + "207 209 214", + "247 255 255", + "244 247 249", + "212 217 225", + "215 226 241", + "231 237 245" + }, +} + +dg = iup.dialog{iup.label{title="Tray example"}; title="Tray", + tray = "YES", traytip = "This is a tip at tray", trayimage = tecgraf} +dg:show() + +dg.hidetaskbar = "YES" + +dg.trayclick_cb = function(self, b, press, dclick) + if b == 1 and press then + item_show = iup.item {title = "Show", action = function() dg:show() end} + item_exit = iup.item {title = "Exit", action = function() dg.tray = "NO" dg:hide() end} + menu = iup.menu{item_show, item_exit} + menu:popup(iup.MOUSEPOS, iup.MOUSEPOS) + end + return iup.DEFAULT +end +-- IupFill Example in IupLua +-- Uses the Fill element to horizontally centralize a button and to +-- justify it to the left and right. + +-- Creates frame with left aligned button +frame_left = iup.frame +{ + iup.hbox + { + iup.button{ title = "Ok" }, + iup.fill{}, + }; title = "Left aligned" -- Sets frame's title +} + +-- Creates frame with centered button +frame_center = iup.frame +{ + iup.hbox + { + iup.fill{}, + iup.button{ title = "Ok" }, + iup.fill{}, + } ; title = "Centered" -- Sets frame's title +} + +-- Creates frame with right aligned button +frame_right = iup.frame +{ + iup.hbox + { + iup.fill {}, + iup.button { title = "Ok" }, + + } ; title = "Right aligned" -- Sets frame's title +} + +-- Creates dialog with these three frames +dialog = iup.dialog +{ + iup.vbox{frame_left, frame_center, frame_right,}; + size = 120, title = "IupFill" +} + +-- Shows dialog in the center of the screen +dialog:showxy(iup.CENTER, iup.CENTER)-- IupFrame Example in IupLua +-- Draws a frame around a button. Note that FGCOLOR is added to the frame but +-- it is inherited by the button. + +-- Creates frame with a label +frame = iup.frame + { + iup.hbox + { + iup.fill{}, + iup.label{title="IupFrame Test"}, + iup.fill{}, + NULL + } + } ; + +-- Sets label's attributes +frame.fgcolor = "255 0 0" +frame.size = EIGHTHxEIGHTH +frame.title = "This is the frame" +frame.margin = "10x10" + +-- Creates dialog +dialog = iup.dialog{frame}; + +-- Sets dialog's title +dialog.title = "IupFrame" + +dialog:showxy(iup.CENTER,iup.CENTER) -- Shows dialog in the center of the screen -- IupHbox Example in IupLua +-- Creates a dialog with buttons placed side by side, with the purpose +-- of showing the organization possibilities of elements inside an hbox. +-- The ALIGNMENT attribute is explored in all its possibilities to obtain +-- the given effect. + +fr1 = iup.frame +{ + iup.hbox + { + iup.fill{}, + iup.button{title="1", size="30x30"}, + iup.button{title="2", size="30x40"}, + iup.button{title="3", size="30x50"}, + iup.fill{}; + alignment = "ATOP" + }; + title = "Alignment = ATOP" +} + +fr2 = iup.frame +{ + iup.hbox + { + iup.fill{}, + iup.button{title="1", size="30x30", action=""}, + iup.button{title="2", size="30x40", action=""}, + iup.button{title="3", size="30x50", action=""}, + iup.fill{}; + alignment = "ACENTER" + }; + title = "Alignment = ACENTER" +} + +fr3 = iup.frame +{ + iup.hbox + { + iup.fill{}, + iup.button{title="1", size="30x30", action=""}, + iup.button{title="2", size="30x40", action=""}, + iup.button{title="3", size="30x50", action=""}, + iup.fill{}; + alignment = "ABOTTOM" + }; + title = "Alignment = ABOTTOM" +} + +dlg = iup.dialog +{ + iup.frame + { + iup.vbox + { + fr1, + fr2, + fr3 + }; title="HBOX", + }; + title="Alignment", + size=140 +} + +dlg:show()-- IupImage Example in IupLua +-- Creates a button, a label, a toggle and a radio using an image. +-- Uses an image for the cursor as well. + +-- Defines an "X" image +img_x = iup.image{ + { 1,2,3,3,3,3,3,3,3,2,1 }, + { 2,1,2,3,3,3,3,3,2,1,2 }, + { 3,2,1,2,3,3,3,2,1,2,3 }, + { 3,3,2,1,2,3,2,1,2,3,3 }, + { 3,3,3,2,1,2,1,2,3,3,3 }, + { 3,3,3,3,2,1,2,3,3,3,3 }, + { 3,3,3,2,1,2,1,2,3,3,3 }, + { 3,3,2,1,2,3,2,1,2,3,3 }, + { 3,2,1,2,3,3,3,2,1,2,3 }, + { 2,1,2,3,3,3,3,3,2,1,2 }, + { 1,2,3,3,3,3,3,3,3,2,1 } + -- Sets "X" image colors + ; colors = { "0 1 0", "255 0 0", "255 255 0" } +} + +-- Defines a cursor image +img_cursor = iup.image{ + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,1,1,2,2,2,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,1,1,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + -- Sets cursor image colors + ; colors = { "255 0 0", "128 0 0" }, hotspot = "21:10" +} + +-- Creates a button entitled "Dummy" and associates image img_x to it +btn = iup.button{ title = "", image = img_x } + +-- Creates a label entitled "Dummy" and associates image img_x to it +lbl = iup.label{ title = "", image = img_x } + +-- Creates toggle entitled "Dummy" and associates image img_x to it +tgl = iup.toggle{ title = "", image = img_x } + +-- Creates two toggles entitled "Dummy" and associates image img_x to them +tgl_radio_1 = iup.toggle{ title = "", image = img_x } +tgl_radio_2 = iup.toggle{ title = "", image = img_x } + +-- Creates label showing image size +lbl_size = iup.label{ title = '"X" image width = '..img_x.width..'; "X" image height = '..img_x.height } + +-- Creates frames around the elements +frm_btn = iup.frame{btn; title="button", size="EIGHTHxEIGHTH"} +frm_lbl = iup.frame{lbl; title="label" , size="EIGHTHxEIGHTH"} +frm_tgl = iup.frame{tgl; title="toggle", size="EIGHTHxEIGHTH"} + +frm_tgl_radio = iup.frame{ + iup.radio{ + iup.vbox + { + tgl_radio_1, + tgl_radio_2 + } + }; + title="radio", size="EIGHTHxEIGHTH" + } + +-- Creates dialog dlg with an hbox containing a button, a label, and a toggle +dlg = iup.dialog + { + iup.vbox + { + iup.hbox{frm_btn, frm_lbl, frm_tgl, frm_tgl_radio}, + iup.fill{}, + iup.hbox{iup.fill{}, lbl_size, iup.fill{}} + }; title = "IupImage Example", size = "HALFxQUARTER", + cursor = img_cursor + } + +-- Shows dialog in the center of the screen +dlg:showxy(iup.CENTER, iup.CENTER) +text = iup.text {value = "This is an empty text"} + +item_save = iup.item {title = "Save\tCtrl+S", key = "K_cS", active = "NO"} +item_autosave = iup.item {title = "Auto Save", key = "K_a", value = "ON"} +item_exit = iup.item {title = "Exit", key = "K_x"} + +menu_file = iup.menu {item_save, item_autosave, item_exit} + +submenu_file = iup.submenu{menu_file; title = "File"} + +menu = iup.menu {submenu_file} + +dlg = iup.dialog{text; title ="IupItem", menu = menu} + +dlg:showxy(iup.CENTER, iup.CENTER) + +function item_autosave:action() + if item_autosave.value == "ON" then + iup.Message("Auto Save", "OFF") + item_autosave.value = "OFF" + else + iup.Message("Auto Save", "ON") + item_autosave.value = "ON" + end + + return iup.DEFAULT +end + +function item_exit:action() +-- return iup.CLOSE + dlg:hide() +end +-- IupLabel Example in IupLua +-- Creates three labels, one using all attributes except for image, other +-- with normal text and the last one with an image.. + +-- Defines a star image +img_star = iup.image { + { 1,1,1,1,1,1,2,1,1,1,1,1,1 }, + { 1,1,1,1,1,1,2,1,1,1,1,1,1 }, + { 1,1,1,1,1,2,2,2,1,1,1,1,1 }, + { 1,1,1,1,1,2,2,2,1,1,1,1,1 }, + { 1,1,2,2,2,2,2,2,2,2,2,1,1 }, + { 2,2,2,2,2,2,2,2,2,2,2,2,2 }, + { 1,1,1,2,2,2,2,2,2,2,1,1,1 }, + { 1,1,1,1,2,2,2,2,2,1,1,1,1 }, + { 1,1,1,1,2,2,2,2,2,1,1,1,1 }, + { 1,1,1,2,2,1,1,2,2,2,1,1,1 }, + { 1,1,2,2,1,1,1,1,1,2,2,1,1 }, + { 1,2,2,1,1,1,1,1,1,1,2,2,1 }, + { 2,2,1,1,1,1,1,1,1,1,1,2,2 } + -- Sets star image colors + ; colors = { "0 0 0", "0 198 0" } +} + +-- Creates a label and sets all the attributes of label lbl, except for image +lbl = iup.label { title = "This label has the following attributes set:\nBGCOLOR = 255 255 0\nFGCOLOR = 0 0 255\nFONT = COURIER_NORMAL_14\nSIZE = HALFxQUARTER\nTITLE = All text contained here\nALIGNMENT = ACENTER\n", bgcolor = "255 255 0", fgcolor = "0 0 255", font = "COURIER_NORMAL_14", size = "HALFxQUARTER", alignment = "ACENTER" } + +-- Creates a label to explain that the label on the right has an image +lbl_explain = iup.label { title = "The label on the right has the image of a star" } + +-- Creates a label whose title is not important, cause it will have an image +lbl_star = iup.label { title = "Does not matter", image = img_star } + +-- Creates dialog with these three labels +dlg = iup.dialog { iup.vbox { lbl, iup.hbox { lbl_explain, lbl_star } } + ; title = "IupLabel Example" } + +-- Shows dialog in the center of the screen +dlg:showxy ( iup.CENTER, iup.CENTER )-- IupList Example in IupLua +-- Creates a dialog with three frames, each one containing a list. The first is a simple list, the second one is a multiple list and the last one is a drop-down list. The second list has a callback associated. + +-- Creates a list and sets items, initial item and size +list = iup.list {"Gold", "Silver", "Bronze", "None" + ; value = 4, size = "EIGHTHxEIGHTH"} + +-- Creates frame with simple list and sets its title +frm_medal = iup.frame {list ; title = "Best medal"} + +-- Creates a list and sets its items, multiple selection, initial items and size +list_multiple = iup.list {"100m dash", "Long jump", "Javelin throw", "110m hurdlers", "Hammer throw", "High jump" + ; multiple="YES", value="+--+--", size="EIGHTHxEIGHTH"} + +-- Creates frame with multiple list and sets its title +frm_sport = iup.frame {list_multiple + ; title = "Competed in"} + +-- Creates a list and sets its items, dropdown and amount of visible items +list_dropdown = iup.list {"Less than US$ 1000", "US$ 2000", "US$ 5000", "US$ 10000", "US$ 20000", "US$ 50000", "More than US$ 100000" + ; dropdown="YES", visible_items=5} + +-- Creates frame with dropdown list and sets its title +frm_prize = iup.frame {list_dropdown + ; title = "Prizes won"} + +-- Creates a dialog with the the frames with three lists and sets its title +dlg = iup.dialog {iup.hbox {frm_medal, frm_sport, frm_prize} + ; title = "IupList Example"} + +-- Shows dialog in the center of the screen +dlg:showxy(iup.CENTER, iup.CENTER) + +function list_multiple:action(t, i, v) + if v == 0 then + state = "deselected" + else + state = "selected" + end + iup.Message("Competed in", "Item "..i.." - "..t.." - "..state) + return iup.DEFAULT +end-- IupMenu Example in IupLua +-- Creates a dialog with a menu with two submenus. + +-- Creates a text, sets its value and turns on text readonly mode +text = iup.text {readonly = "YES", value = "Selecting show or hide will affect this text"} + +-- Creates items, sets its shortcut keys and deactivates edit item +item_show = iup.item {title = "Show", key = "K_S"} +item_hide = iup.item {title = "Hide\tCtrl+H", key = "K_H"} +item_edit = iup.item {title = "Edit", key = "K_E", active = "NO"} +item_exit = iup.item {title = "Exit", key = "K_x"} + +function item_show:action() + text.visible = "YES" + return iup.DEFAULT +end + +function item_hide:action() + text.visible = "NO" + return iup.DEFAULT +end + +function item_exit:action() + return iup.CLOSE +end + +-- Creates two menus +menu_file = iup.menu {item_exit} +menu_text = iup.menu {item_show, item_hide, item_edit} + +-- Creates two submenus +submenu_file = iup.submenu {menu_file; title = "File"} +submenu_text = iup.submenu {menu_text; title = "Text"} + +-- Creates main menu with two submenus +menu = iup.menu {submenu_file, submenu_text} + +-- Creates dialog with a text, sets its title and associates a menu to it +dlg = iup.dialog{text; title="IupMenu Example", menu=menu} + +-- Shows dialog in the center of the screen +dlg:showxy(iup.CENTER,iup.CENTER) + + +l = iup.list{dropdown="YES"} + +iup.SetAttribute(l, "1", "HELVETICA_NORMAL_8") +iup.SetAttribute(l, "2", "COURIER_NORMAL_8") +iup.SetAttribute(l, "3", "TIMES_NORMAL_8") +iup.SetAttribute(l, "4", "HELVETICA_ITALIC_8") +iup.SetAttribute(l, "5", "COURIER_ITALIC_8") +iup.SetAttribute(l, "6", "TIMES_ITALIC_8") +iup.SetAttribute(l, "7", "HELVETICA_BOLD_8") +iup.SetAttribute(l, "8", "COURIER_BOLD_8") +iup.SetAttribute(l, "9", "TIMES_BOLD_8") +iup.SetAttribute(l, "10", "HELVETICA_NORMAL_10") +iup.SetAttribute(l, "11", "COURIER_NORMAL_10") +iup.SetAttribute(l, "12", "TIMES_NORMAL_10") +iup.SetAttribute(l, "13", "HELVETICA_ITALIC_10") +iup.SetAttribute(l, "14", "COURIER_ITALIC_10") +iup.SetAttribute(l, "15", "TIMES_ITALIC_10") +iup.SetAttribute(l, "16", "HELVETICA_BOLD_10") +iup.SetAttribute(l, "17", "COURIER_BOLD_10") +iup.SetAttribute(l, "18", "TIMES_BOLD_10") +iup.SetAttribute(l, "19", "HELVETICA_NORMAL_12") +iup.SetAttribute(l, "20", "COURIER_NORMAL_12") +iup.SetAttribute(l, "21", "TIMES_NORMAL_12") +iup.SetAttribute(l, "22", "HELVETICA_ITALIC_12") +iup.SetAttribute(l, "23", "COURIER_ITALIC_12") +iup.SetAttribute(l, "24", "TIMES_ITALIC_12") +iup.SetAttribute(l, "25", "HELVETICA_BOLD_12") +iup.SetAttribute(l, "26", "COURIER_BOLD_12") +iup.SetAttribute(l, "27", "TIMES_BOLD_12") +iup.SetAttribute(l, "28", "HELVETICA_NORMAL_14") +iup.SetAttribute(l, "29", "COURIER_NORMAL_14") +iup.SetAttribute(l, "30", "TIMES_NORMAL_14") +iup.SetAttribute(l, "31", "HELVETICA_ITALIC_14") +iup.SetAttribute(l, "32", "COURIER_ITALIC_14") +iup.SetAttribute(l, "33", "TIMES_ITALIC_14") +iup.SetAttribute(l, "34", "HELVETICA_BOLD_14") +iup.SetAttribute(l, "35", "COURIER_BOLD_14") +iup.SetAttribute(l, "36", "TIMES_BOLD_14") + +dg = iup.dialog{l} +dg.title = "title" + +dg2 = nil + +l.action = function(self, t, i ,v) + + if dg2 then + iup.Hide(dg2) + end + + if v == 1 then + ml = iup.multiline{} + ml.size = "200x200" + ml.value = "1234\nmmmmm\niiiii" + + ml.font = t + + dg2 = iup.dialog{ml} + dg2.title = t + dg2:show() + iup.SetFocus(l) + end +end + +dg:show() +-- IupMultiline Simple Example in IupLua +-- Shows a multiline that ignores the treatment of the DEL key, canceling its effect. + +ml = iup.multiline{expand="YES", value="I ignore the DEL key!", border="YES"} + +ml.action = function(self, c, after) + if c == iup.K_DEL then + return iup.IGNORE + else + return iup.DEFAULT; + end +end + +dlg = iup.dialog{ml; title="IupMultiline", size="QUARTERxQUARTER"} +dlg:show()-- IupRadio Example in IupLua +-- Creates a dialog for the user to select his/her gender. +-- In this case, the radio element is essential to prevent the user from +-- selecting both options. + +male = iup.toggle{title="Male"} +female = iup.toggle{title="Female"} +exclusive = iup.radio +{ + iup.vbox + { + male, + female + }; + value=female, + tip="Two state button - Exclusive - RADIO" +} + +frame = iup.frame{exclusive; title="Gender"} + +dialog = iup.dialog +{ + iup.hbox + { + iup.fill{}, + frame, + iup.fill{} + }; + title="IupRadio", + size=140, + resize="NO", + minbox="NO", + maxbox="NO" +} + +dialog:show()-- IupSeparator Example in IupLua +-- Creates a dialog with a menu and some items. +-- A IupSeparator was used to separate the menu items. + +-- Creates a text, sets its value and turns on text readonly mode +text = iup.text {value = "This text is here only to compose", expand = "YES"} + +-- Creates six items +item_new = iup.item {title = "New"} +item_open = iup.item {title = "Open"} +item_close = iup.item {title = "Close"} +item_pagesetup = iup.item {title = "Page Setup"} +item_print = iup.item {title = "Print"} +item_exit = iup.item {title = "Exit", action="return iup.CLOSE"} + +-- Creates file menus +menu_file = iup.menu {item_new, item_open, item_close, iup.separator{}, item_pagesetup, item_print, iup.separator{}, item_exit } + +-- Creates file submenus +submenu_file = iup.submenu {menu_file; title="File"} + +-- Creates main menu with file submenu +menu = iup.menu {submenu_file} + +-- Creates dialog with a text, sets its title and associates a menu to it +dlg = iup.dialog {text + ; title ="IupSeparator Example", menu = menu, size = "QUARTERxEIGHTH"} + +-- Shows dialog in the center of the screen +dlg:showxy(iup.CENTER,iup.CENTER)-- IupSubmenu Example in IupLua +-- Creates a dialog with a menu with three submenus. One of the submenus has a submenu, which has another submenu. + +-- Creates a text, sets its value and turns on text readonly mode +text = iup.text {value = "This text is here only to compose", expand = "YES"} + +-- Creates items of menu file +item_new = iup.item {title = "New"} +item_open = iup.item {title = "Open"} +item_close = iup.item {title = "Close"} +item_exit = iup.item {title = "Exit"} + +-- Creates items of menu edit +item_copy = iup.item {title = "Copy"} +item_paste = iup.item {title = "Paste"} + +-- Creates items for menu triangle +item_equilateral = iup.item {title = "Equilateral"} +item_isoceles = iup.item {title = "Isoceles"} +item_scalenus = iup.item {title = "Scalenus"} + +-- Creates menu triangle +menu_triangle = iup.menu {item_equilateral, item_isoceles, item_scalenus} + +-- Creates submenu triangle +submenu_triangle = iup.submenu {menu_triangle; title = "Triangle"} + +-- Creates items of menu create +item_line = iup.item {title = "Line"} +item_circle = iup.item {title = "Circle"} + +-- Creates menu create +menu_create = iup.menu {item_line, item_circle, submenu_triangle} + +-- Creates submenu create +submenu_create = iup.submenu {menu_create; title = "Create"} + +-- Creates items of menu help +item_help = iup.item {title = "Help"} + +-- Creates menus of the main menu +menu_file = iup.menu {item_new, item_open, item_close, iup.separator{}, item_exit } +menu_edit = iup.menu {item_copy, item_paste, iup.separator{}, submenu_create} +menu_help = iup.menu {item_help} + +-- Creates submenus of the main menu +submenu_file = iup.submenu {menu_file; title = "File"} +submenu_edit = iup.submenu {menu_edit; title = "Edit"} +submenu_help = iup.submenu {menu_help; title = "Help"} + +-- Creates main menu with file submenu +menu = iup.menu {submenu_file, submenu_edit, submenu_help} + +-- Creates dialog with a text, sets its title and associates a menu to it +dlg = iup.dialog {text + ; title ="IupSubmenu Example", menu = menu, size = "QUARTERxEIGHTH"} + +-- Shows dialog in the center of the screen +dlg:showxy (iup.CENTER,iup.CENTER) + +function item_help:action () + iup.Message ("Warning", "Only Help and Exit items performs an operation") + return iup.DEFAULT +end + +function item_exit:action () + return iup.CLOSE +end-- IupText Example in IupLua +-- Allows the user to execute a Lua command + +text = iup.text{value = "Write a text; press Ctrl-Q to exit"} + +function text:action(c) + if c == iup.K_cQ then + return iup.CLOSE + end + return iup.DEFAULT +end + +dlg = iup.dialog{text; title="IupText"} + +dlg:showxy(iup.CENTER, iup.CENTER) +iup.SetFocus(text) +-- IupTimer Example in Lua + +timer1 = iup.timer{time=100} +timer2 = iup.timer{time=2000} + +function timer1:action_cb() + print("timer 1 called") + return iup.DEFAULT +end + +function timer2:action_cb() + print("timer 2 called") + return iup.CLOSE +end + +-- can only be set after the time is created +timer1.run = "YES" +timer2.run = "YES" + +dg = iup.dialog{iup.label{title="Timer example"}} +dg:show() +-- IupToggle Example in IupLua +-- Creates 9 toggles: +-- the first one has an image and an associated callback; +-- the second has an image and is deactivated; +-- the third is regular; +-- the fourth has its foreground color changed; +-- the fifth has its background color changed; +-- the sixth has its foreground and background colors changed; +-- the seventh is deactivated; +-- the eight has its font changed; +-- the ninth has its size changed. + +img1 = iup.image{ + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1}, + {1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1}, + {1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; + colors = {"255 255 255", "0 192 0"} +} + +img2 = iup.image{ + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1}, + {1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; + colors = {"255 255 255", "0 192 0"} +} + +toggle1 = iup.toggle{title = "", image = img1} +toggle2 = iup.toggle{title = "deactivated toggle with image", image = img2, active="NO"} +toggle3 = iup.toggle{title = "regular toggle"} +toggle4 = iup.toggle{title = "toggle with blue foreground color", fgcolor = BLUE } +toggle5 = iup.toggle{title = "toggle with red background color", bgcolor = RED } +toggle6 = iup.toggle{title = "toggle with black backgrounf color and green foreground color", fgcolor = GREEN, bgcolor = BLACK } +toggle7 = iup.toggle{title = "deactivated toggle", active = "NO" } +toggle8 = iup.toggle{title = "toggle with Courier 14 Bold font", font = "COURIER_BOLD_14" } +toggle9 = iup.toggle{title = "toggle with size EIGHTxEIGHT", size = "EIGHTHxEIGHTH" } + +function toggle1:action(v) + if v == 1 then estado = "pressed" else estado = "released" end + iup.Message("Toggle 1",estado) +end + +box = iup.vbox{ + toggle1, + toggle2, + toggle3, + toggle4, + toggle5, + toggle6, + toggle7, + toggle8, + toggle9 + } + +toggles = iup.radio{box; expand="YES"} +dlg = iup.dialog{toggles; title = "IupToggle", margin="5x5", gap="5", resize="NO"} +dlg:showxy(iup.CENTER, iup.CENTER)-- IupVbox Example in IupLua +-- Creates a dialog with buttons placed one above the other, showing +-- the organization possibilities of the elements inside a vbox. +-- The ALIGNMENT attribute is explored in all its possibilities to obtain +-- the effects. The attributes GAP, MARGIN and SIZE are also tested. + +-- Creates frame 1 +frm_1 = iup.frame +{ + iup.hbox + { + iup.fill {}, + iup.vbox + { + iup.button {title = "1", size = "20x30", action = ""}, + iup.button {title = "2", size = "30x30", action = ""}, + iup.button {title = "3", size = "40x30", action = ""} ; + -- Sets alignment and gap of vbox + alignment = "ALEFT", gap = 10 + }, + iup.fill {} + } ; + -- Sets title of frame 1 + title = "ALIGNMENT = ALEFT, GAP = 10" +} + +-- Creates frame 2 +frm_2 = iup.frame +{ + iup.hbox + { + iup.fill {}, + iup.vbox + { + iup.button {title = "1", size = "20x30", action = ""}, + iup.button {title = "2", size = "30x30", action = ""}, + iup.button {title = "3", size = "40x30", action = ""} ; + -- Sets alignment and margin of vbox + alignment = "ACENTER", + }, + iup.fill {} + } ; + -- Sets title of frame 1 + title = "ALIGNMENT = ACENTER" +} + +-- Creates frame 3 +frm_3 = iup.frame +{ + iup.hbox + { + iup.fill {}, + iup.vbox + { + iup.button {title = "1", size = "20x30", action = ""}, + iup.button {title = "2", size = "30x30", action = ""}, + iup.button {title = "3", size = "40x30", action = ""} ; + -- Sets alignment and size of vbox + alignment = "ARIGHT" + }, + iup.fill {} + } ; + -- Sets title of frame 3 + title = "ALIGNMENT = ARIGHT" +} + +dlg = iup.dialog +{ + iup.vbox + { + frm_1, + frm_2, + frm_3 + } ; + title = "IupVbox Example", size = "QUARTER" +} + +-- Shows dialog in the center of the screen +dlg:showxy (iup.CENTER, iup.CENTER)-- IupZbox Example in IupLua +-- An application of a zbox could be a program requesting several entries from the user according to a previous selection. In this example, a list of possible layouts ,each one consisting of an element, is presented, and according to the selected option the dialog below the list is changed. + +fill = iup.fill {} +text = iup.text {value = "Enter your text here", expand = "YES"} +lbl = iup.label {title = "This element is a label"} +btn = iup.button {title = "This button does nothing"} +zbox = iup.zbox +{ + fill, + text, + lbl, + btn ; + alignment = "ACENTER", value=text +} + +list = iup.list { "fill", "text", "lbl", "btn"; value="2"} +ilist = {fill, text, lbl, btn} + +function list:action (t, o, selected) + if selected == 1 then + -- Sets the value of the zbox to the selected element + zbox.value=ilist[o] + end + + return iup.DEFAULT +end + +frm = iup.frame +{ + iup.hbox + { + iup.fill{}, + list, + iup.fill{} + } ; + title = "Select an element" +} + +dlg = iup.dialog +{ + iup.vbox + { + frm, + zbox + } ; + size = "QUARTER", + title = "IupZbox Example" +} + +dlg:showxy (0, 0) +--[[ +JSON4Lua example script. +Demonstrates the simple functionality of the json module. +]]-- +json = require('json') + + +-- Object to JSON encode +test = { + one='first',two='second',three={2,3,5} +} + +jsonTest = json.encode(test) + +print('JSON encoded test is: ' .. jsonTest) + +-- Now JSON decode the json string +result = json.decode(jsonTest) + +print ("The decoded table result:") +table.foreach(result,print) +print ("The decoded table result.three") +table.foreach(result.three, print) +-- +-- jsonrpc.lua +-- Installed in a CGILua webserver environment (with necessary CGI Lua 5.0 patch) +-- +require ('json.rpcserver') + +-- The Lua class that is to serve JSON RPC requests +local myServer = { + echo = function (msg) return msg end, + average = function(...) + local total=0 + local count=0 + for i=1, table.getn(arg) do + total = total + arg[i] + count = count + 1 + end + return { average= total/count, sum = total, n=count } + end +} + +json.rpcserver.serve(myServer)--[[ +Some basic tests for JSON4Lua. +]]-- + +--- Compares two tables for being data-identical. +function compareData(a,b) + if (type(a)=='string' or type(a)=='number' or type(a)=='boolean' or type(a)=='nil') then return a==b end + -- After basic data types, we're only interested in tables + if (type(a)~='table') then return true end + -- Check that a has everything b has + for k,v in pairs(b) do + if (not compareData( a[k], v ) ) then return false end + end + for k,v in pairs(a) do + if (not compareData( v, b[k] ) ) then return false end + end + return true +end + +--- +-- Checks that our compareData function works properly +function testCompareData() + s = "name" + r = "name" + assert(compareData(s,r)) + assert(not compareData('fred',s)) + assert(not compareData(nil, s)) + assert(not compareData("123",123)) + assert(not compareData(false, nil)) + assert(compareData(true, true)) + assert(compareData({1,2,3},{1,2,3})) + assert(compareData({'one',2,'three'},{'one',2,'three'})) + assert(not compareData({'one',2,4},{4,2,'one'})) + assert(compareData({one='ichi',two='nichi',three='san'}, {three='san',two='nichi',one='ichi'})) + s = { one={1,2,3}, two={one='hitotsu',two='futatsu',three='mitsu'} } + assert(compareData(s,s)) + t = { one={1,2,3}, two={one='een',two='twee',three='drie'} } + assert(not compareData(s,t)) +end + +testCompareData() + +-- +-- +-- Performs some perfunctory tests on JSON module +function testJSON4Lua() + json = require('json') + + if nil then + -- Test encodeString + s = [["\" +]] + r = json._encodeString(s) + assert(r=='\\"\\\\\\"\\n') + s = [["""\\\"]] + r = json._encodeString(s) + assert(r==[[\"\"\"\\\\\\\"]]) + + end + + -- Test encode for basic strings (complicated strings) + s = [[Hello, Lua!]] + r = json.encode(s) + assert(r=='"Hello, Lua!"') + s = [["\" +]] + r = json.encode(s) + assert(r=='\"\\"\\\\\\"\\n\"') + s = [["""\\\"]] + r = json.encode(s) + assert(r==[["\"\"\"\\\\\\\""]]) + + -- Test encode for numeric values + s = 23 + r = json.encode(s) + assert(r=='23') + s=48.123 + r = json.encode(s) + assert(r=='48.123') + + -- Test encode for boolean values + assert(json.encode(true)=='true') + assert(json.encode(false)=='false') + assert(json.encode(nil)=='null') + + -- Test encode for arrays + s = {1,2,3} + r = json.encode(s) + assert(r=="[1,2,3]") + s = {9,9,9} + r = json.encode(s) + assert(r=="[9,9,9]") + + -- Complex array test + s = { 2, 'joe', false, nil, 'hi' } + r = json.encode(s) + assert(r=='[2,"joe",false,null,"hi"]') + + -- Test encode for tables + s = {Name='Craig',email='craig@lateral.co.za',age=35} + r = json.encode(s) + -- NB: This test can fail because of order: need to test further once + -- decoding is supported. + assert(r==[[{"age":35,"Name":"Craig","email":"craig@lateral.co.za"}]]) + + -- Test decode_scanWhitespace + if nil then + s = " \n \r \t " + e = json._decode_scanWhitespace(s,1) + assert(e==string.len(s)+1) + s = " \n\r\t4" + assert(json._decode_scanWhitespace(s,1)==5) + + -- Test decode_scanString + s = [["Test"]] + r,e = json._decode_scanString(s,1) + assert(r=='Test' and e==7) + s = [["This\nis a \"test"]] + r = json._decode_scanString(s,1) + assert(r=="This\nis a \"test") + + -- Test decode_scanNumber + s = [[354]] + r,e = json._decode_scanNumber(s,1) + assert(r==354 and e==4) + s = [[ 4565.23 AND OTHER THINGS ]] + r,e = json._decode_scanNumber(s,2) + assert(r==4565.23 and e==9) + s = [[ -23.22 and ]] + r,e = json._decode_scanNumber(s,2) + assert(r==-23.22 and e==8) + + -- Test decode_scanConstant + s = "true" + r,e = json._decode_scanConstant(s,1) + assert(r==true and e==5) + s = " false " + r,e = json._decode_scanConstant(s,3) + assert(r==false and e==8) + s = "1null6" + r,e = json._decode_scanConstant(s,2) + assert(r==nil and e==6) + + -- Test decode_scanArray + s = "[1,2,3]" + r,e = json._decode_scanArray(s,1) + assert(compareData(r,{1,2,3})) + s = [[[ 1 , 3 ,5 , "Fred" , true, false, null, -23 ] ]] + r,e = json._decode_scanArray(s,1) + assert(compareData(r, {1,3,5,'Fred',true,false,nil,-23} ) ) + s = "[3,5,null,7,9]" + r,e = json._decode_scanArray(s,1) + assert(compareData(r, {3,5,nil,7,9})) + s = "[3,5,null,7,9,null,null]" + r,e = json._decode_scanArray(s,1) + assert(compareData(r, {3,5,nil,7,9,nil,nil})) + + end + + -- Test decode_scanObject + s = [[ {"one":1, "two":2, "three":"three", "four":true} ]] + r,e = json.decode(s) + assert(compareData(r,{one=1,two=2,three='three',four=true})) + s = [[ { "one" : { "first":1,"second":2,"third":3}, "two":2, "three":false } ]] + r,e = json.decode(s) + assert(compareData(r, {one={first=1,second=2,third=3},two=2,three=false})) + s = [[ { "primes" : [2,3,5,7,9], "user":{"name":"craig","age":35,"programs_lua":true}, + "lua_is_great":true } ]] + r,e = json.decode(s) + assert(compareData(r, {primes={2,3,5,7,9},user={name='craig',age=35,programs_lua=true},lua_is_great=true})) + + -- Test json.null management + t = { 1,2,json.null,4 } + assert( json.encode(t)=="[1,2,null,4]" ) + t = {x=json.null } + r = json.encode(t) + assert( json.encode(t) == '{"x":null}' ) + + -- Test comment decoding + s = [[ /* A comment + that spans + a few lines + */ + "test" + ]] + r,e = json.decode(s) + assert(r=='test',"Comment decoding failed") +end + +testJSON4Lua() + +print("JSON4Lua tests completed successfully")--[[ + Some Time Trails for the JSON4Lua package +]]-- + + +require('json') +require('os') +require('table') + +local t1 = os.clock() +local jstr +local v +for i=1,100 do + local t = {} + for j=1,500 do + table.insert(t,j) + end + for j=1,500 do + table.insert(t,"VALUE") + end + jstr = json.encode(t) + v = json.decode(jstr) + --print(json.encode(t)) +end + +for i = 1,100 do + local t = {} + for j=1,500 do + local m= math.mod(j,3) + if (m==0) then + t['a'..j] = true + elseif m==1 then + t['a'..j] = json.null + else + t['a'..j] = j + end + end + jstr = json.encode(t) + v = json.decode(jstr) +end + +print (jstr) +--print(type(t1)) +local t2 = os.clock() + +print ("Elapsed time=" .. os.difftime(t2,t1) .. "s")----------------------------------------------------------------------------- +-- JSON4Lua: JSON encoding / decoding support for the Lua language. +-- json Module. +-- Author: Craig Mason-Jones +-- Homepage: http://json.luaforge.net/ +-- Version: 0.9.20 +-- This module is released under the The GNU General Public License (GPL). +-- Please see LICENCE.txt for details. +-- +-- USAGE: +-- This module exposes two functions: +-- encode(o) +-- Returns the table / string / boolean / number / nil / json.null value as a JSON-encoded string. +-- decode(json_string) +-- Returns a Lua object populated with the data encoded in the JSON string json_string. +-- +-- REQUIREMENTS: +-- compat-5.1 if using Lua 5.0 +-- +-- CHANGELOG +-- 0.9.20 Introduction of local Lua functions for private functions (removed _ function prefix). +-- Fixed Lua 5.1 compatibility issues. +-- Introduced json.null to have null values in associative arrays. +-- encode() performance improvement (more than 50%) through table.concat rather than .. +-- Introduced decode ability to ignore /**/ comments in the JSON string. +-- 0.9.10 Fix to array encoding / decoding to correctly manage nil/null values in arrays. +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Imports and dependencies +----------------------------------------------------------------------------- +local math = require('math') +local string = require("string") +local table = require("table") + +local base = _G + +----------------------------------------------------------------------------- +-- Module declaration +----------------------------------------------------------------------------- +module("json") + +-- Public functions + +-- Private functions +local decode_scanArray +local decode_scanComment +local decode_scanConstant +local decode_scanNumber +local decode_scanObject +local decode_scanString +local decode_scanWhitespace +local encodeString +local isArray +local isEncodable + +----------------------------------------------------------------------------- +-- PUBLIC FUNCTIONS +----------------------------------------------------------------------------- +--- Encodes an arbitrary Lua object / variable. +-- @param v The Lua object / variable to be JSON encoded. +-- @return String containing the JSON encoding in internal Lua string format (i.e. not unicode) +function encode (v) + -- Handle nil values + if v==nil then + return "null" + end + + local vtype = base.type(v) + + -- Handle strings + if vtype=='string' then + return '"' .. encodeString(v) .. '"' -- Need to handle encoding in string + end + + -- Handle booleans + if vtype=='number' or vtype=='boolean' then + return base.tostring(v) + end + + -- Handle tables + if vtype=='table' then + local rval = {} + -- Consider arrays separately + local bArray, maxCount = isArray(v) + if bArray then + for i = 1,maxCount do + table.insert(rval, encode(v[i])) + end + else -- An object, not an array + for i,j in base.pairs(v) do + if isEncodable(i) and isEncodable(j) then + table.insert(rval, '"' .. encodeString(i) .. '":' .. encode(j)) + end + end + end + if bArray then + return '[' .. table.concat(rval,',') ..']' + else + return '{' .. table.concat(rval,',') .. '}' + end + end + + -- Handle null values + if vtype=='function' and v==null then + return 'null' + end + + base.assert(false,'encode attempt to encode unsupported type ' .. vtype .. ':' .. base.tostring(v)) +end + + +--- Decodes a JSON string and returns the decoded value as a Lua data structure / value. +-- @param s The string to scan. +-- @param [startPos] Optional starting position where the JSON string is located. Defaults to 1. +-- @param Lua object, number The object that was scanned, as a Lua table / string / number / boolean or nil, +-- and the position of the first character after +-- the scanned JSON object. +function decode(s, startPos) + startPos = startPos and startPos or 1 + startPos = decode_scanWhitespace(s,startPos) + base.assert(startPos<=string.len(s), 'Unterminated JSON encoded object found at position in [' .. s .. ']') + local curChar = string.sub(s,startPos,startPos) + -- Object + if curChar=='{' then + return decode_scanObject(s,startPos) + end + -- Array + if curChar=='[' then + return decode_scanArray(s,startPos) + end + -- Number + if string.find("+-0123456789.e", curChar, 1, true) then + return decode_scanNumber(s,startPos) + end + -- String + if curChar==[["]] or curChar==[[']] then + return decode_scanString(s,startPos) + end + if string.sub(s,startPos,startPos+1)=='/*' then + return decode(s, decode_scanComment(s,startPos)) + end + -- Otherwise, it must be a constant + return decode_scanConstant(s,startPos) +end + +--- The null function allows one to specify a null value in an associative array (which is otherwise +-- discarded if you set the value with 'nil' in Lua. Simply set t = { first=json.null } +function null() + return null -- so json.null() will also return null ;-) +end +----------------------------------------------------------------------------- +-- Internal, PRIVATE functions. +-- Following a Python-like convention, I have prefixed all these 'PRIVATE' +-- functions with an underscore. +----------------------------------------------------------------------------- + +--- Scans an array from JSON into a Lua object +-- startPos begins at the start of the array. +-- Returns the array and the next starting position +-- @param s The string being scanned. +-- @param startPos The starting position for the scan. +-- @return table, int The scanned array as a table, and the position of the next character to scan. +function decode_scanArray(s,startPos) + local array = {} -- The return value + local stringLen = string.len(s) + base.assert(string.sub(s,startPos,startPos)=='[','decode_scanArray called but array does not start at position ' .. startPos .. ' in string:\n'..s ) + startPos = startPos + 1 + -- Infinite loop for array elements + repeat + startPos = decode_scanWhitespace(s,startPos) + base.assert(startPos<=stringLen,'JSON String ended unexpectedly scanning array.') + local curChar = string.sub(s,startPos,startPos) + if (curChar==']') then + return array, startPos+1 + end + if (curChar==',') then + startPos = decode_scanWhitespace(s,startPos+1) + end + base.assert(startPos<=stringLen, 'JSON String ended unexpectedly scanning array.') + object, startPos = decode(s,startPos) + table.insert(array,object) + until false +end + +--- Scans a comment and discards the comment. +-- Returns the position of the next character following the comment. +-- @param string s The JSON string to scan. +-- @param int startPos The starting position of the comment +function decode_scanComment(s, startPos) + base.assert( string.sub(s,startPos,startPos+1)=='/*', "decode_scanComment called but comment does not start at position " .. startPos) + local endPos = string.find(s,'*/',startPos+2) + base.assert(endPos~=nil, "Unterminated comment in string at " .. startPos) + return endPos+2 +end + +--- Scans for given constants: true, false or null +-- Returns the appropriate Lua type, and the position of the next character to read. +-- @param s The string being scanned. +-- @param startPos The position in the string at which to start scanning. +-- @return object, int The object (true, false or nil) and the position at which the next character should be +-- scanned. +function decode_scanConstant(s, startPos) + local consts = { ["true"] = true, ["false"] = false, ["null"] = nil } + local constNames = {"true","false","null"} + + for i,k in base.pairs(constNames) do + --print ("[" .. string.sub(s,startPos, startPos + string.len(k) -1) .."]", k) + if string.sub(s,startPos, startPos + string.len(k) -1 )==k then + return consts[k], startPos + string.len(k) + end + end + base.assert(nil, 'Failed to scan constant from string ' .. s .. ' at starting position ' .. startPos) +end + +--- Scans a number from the JSON encoded string. +-- (in fact, also is able to scan numeric +- eqns, which is not +-- in the JSON spec.) +-- Returns the number, and the position of the next character +-- after the number. +-- @param s The string being scanned. +-- @param startPos The position at which to start scanning. +-- @return number, int The extracted number and the position of the next character to scan. +function decode_scanNumber(s,startPos) + local endPos = startPos+1 + local stringLen = string.len(s) + local acceptableChars = "+-0123456789.e" + while (string.find(acceptableChars, string.sub(s,endPos,endPos), 1, true) + and endPos<=stringLen + ) do + endPos = endPos + 1 + end + local stringValue = 'return ' .. string.sub(s,startPos, endPos-1) + local stringEval = base.loadstring(stringValue) + base.assert(stringEval, 'Failed to scan number [ ' .. stringValue .. '] in JSON string at position ' .. startPos .. ' : ' .. endPos) + return stringEval(), endPos +end + +--- Scans a JSON object into a Lua object. +-- startPos begins at the start of the object. +-- Returns the object and the next starting position. +-- @param s The string being scanned. +-- @param startPos The starting position of the scan. +-- @return table, int The scanned object as a table and the position of the next character to scan. +function decode_scanObject(s,startPos) + local object = {} + local stringLen = string.len(s) + local key, value + base.assert(string.sub(s,startPos,startPos)=='{','decode_scanObject called but object does not start at position ' .. startPos .. ' in string:\n' .. s) + startPos = startPos + 1 + repeat + startPos = decode_scanWhitespace(s,startPos) + base.assert(startPos<=stringLen, 'JSON string ended unexpectedly while scanning object.') + local curChar = string.sub(s,startPos,startPos) + if (curChar=='}') then + return object,startPos+1 + end + if (curChar==',') then + startPos = decode_scanWhitespace(s,startPos+1) + end + base.assert(startPos<=stringLen, 'JSON string ended unexpectedly scanning object.') + -- Scan the key + key, startPos = decode(s,startPos) + base.assert(startPos<=stringLen, 'JSON string ended unexpectedly searching for value of key ' .. key) + startPos = decode_scanWhitespace(s,startPos) + base.assert(startPos<=stringLen, 'JSON string ended unexpectedly searching for value of key ' .. key) + base.assert(string.sub(s,startPos,startPos)==':','JSON object key-value assignment mal-formed at ' .. startPos) + startPos = decode_scanWhitespace(s,startPos+1) + base.assert(startPos<=stringLen, 'JSON string ended unexpectedly searching for value of key ' .. key) + value, startPos = decode(s,startPos) + object[key]=value + until false -- infinite loop while key-value pairs are found +end + +--- Scans a JSON string from the opening inverted comma or single quote to the +-- end of the string. +-- Returns the string extracted as a Lua string, +-- and the position of the next non-string character +-- (after the closing inverted comma or single quote). +-- @param s The string being scanned. +-- @param startPos The starting position of the scan. +-- @return string, int The extracted string as a Lua string, and the next character to parse. +function decode_scanString(s,startPos) + base.assert(startPos, 'decode_scanString(..) called without start position') + local startChar = string.sub(s,startPos,startPos) + base.assert(startChar==[[']] or startChar==[["]],'decode_scanString called for a non-string') + local escaped = false + local endPos = startPos + 1 + local bEnded = false + local stringLen = string.len(s) + repeat + local curChar = string.sub(s,endPos,endPos) + if not escaped then + if curChar==[[\]] then + escaped = true + else + bEnded = curChar==startChar + end + else + -- If we're escaped, we accept the current character come what may + escaped = false + end + endPos = endPos + 1 + base.assert(endPos <= stringLen+1, "String decoding failed: unterminated string at position " .. endPos) + until bEnded + local stringValue = 'return ' .. string.sub(s, startPos, endPos-1) + local stringEval = base.loadstring(stringValue) + base.assert(stringEval, 'Failed to load string [ ' .. stringValue .. '] in JSON4Lua.decode_scanString at position ' .. startPos .. ' : ' .. endPos) + return stringEval(), endPos +end + +--- Scans a JSON string skipping all whitespace from the current start position. +-- Returns the position of the first non-whitespace character, or nil if the whole end of string is reached. +-- @param s The string being scanned +-- @param startPos The starting position where we should begin removing whitespace. +-- @return int The first position where non-whitespace was encountered, or string.len(s)+1 if the end of string +-- was reached. +function decode_scanWhitespace(s,startPos) + local whitespace=" \n\r\t" + local stringLen = string.len(s) + while ( string.find(whitespace, string.sub(s,startPos,startPos), 1, true) and startPos <= stringLen) do + startPos = startPos + 1 + end + return startPos +end + +--- Encodes a string to be JSON-compatible. +-- This just involves back-quoting inverted commas, back-quotes and newlines, I think ;-) +-- @param s The string to return as a JSON encoded (i.e. backquoted string) +-- @return The string appropriately escaped. +function encodeString(s) + s = string.gsub(s,'\\','\\\\') + s = string.gsub(s,'"','\\"') + s = string.gsub(s,"'","\\'") + s = string.gsub(s,'\n','\\n') + s = string.gsub(s,'\t','\\t') + return s +end + +-- Determines whether the given Lua type is an array or a table / dictionary. +-- We consider any table an array if it has indexes 1..n for its n items, and no +-- other data in the table. +-- I think this method is currently a little 'flaky', but can't think of a good way around it yet... +-- @param t The table to evaluate as an array +-- @return boolean, number True if the table can be represented as an array, false otherwise. If true, +-- the second returned value is the maximum +-- number of indexed elements in the array. +function isArray(t) + -- Next we count all the elements, ensuring that any non-indexed elements are not-encodable + -- (with the possible exception of 'n') + local maxIndex = 0 + for k,v in base.pairs(t) do + if (base.type(k)=='number' and math.floor(k)==k and 1<=k) then -- k,v is an indexed pair + if (not isEncodable(v)) then return false end -- All array elements must be encodable + maxIndex = math.max(maxIndex,k) + else + if (k=='n') then + if v ~= table.getn(t) then return false end -- False if n does not hold the number of elements + else -- Else of (k=='n') + if isEncodable(v) then return false end + end -- End of (k~='n') + end -- End of k,v not an indexed pair + end -- End of loop across all pairs + return true, maxIndex +end + +--- Determines whether the given Lua object / table / variable can be JSON encoded. The only +-- types that are JSON encodable are: string, boolean, number, nil, table and json.null. +-- In this implementation, all other types are ignored. +-- @param o The object to examine. +-- @return boolean True if the object should be JSON encoded, false if it should be ignored. +function isEncodable(o) + local t = base.type(o) + return (t=='string' or t=='boolean' or t=='number' or t=='nil' or t=='table') or (t=='function' and o==null) +end + +----------------------------------------------------------------------------- +-- JSONRPC4Lua: JSON RPC client calls over http for the Lua language. +-- json.rpc Module. +-- Author: Craig Mason-Jones +-- Homepage: http://json.luaforge.net/ +-- Version: 0.9.10 +-- This module is released under the The GNU General Public License (GPL). +-- Please see LICENCE.txt for details. +-- +-- USAGE: +-- This module exposes two functions: +-- proxy( 'url') +-- Returns a proxy object for calling the JSON RPC Service at the given url. +-- call ( 'url', 'method', ...) +-- Calls the JSON RPC server at the given url, invokes the appropriate method, and +-- passes the remaining parameters. Returns the result and the error. If the result is nil, an error +-- should be there (or the system returned a null). If an error is there, the result should be nil. +-- +-- REQUIREMENTS: +-- Lua socket 2.0 (http://www.cs.princeton.edu/~diego/professional/luasocket/) +-- json (The JSON4Lua package with which it is bundled) +-- compat-5.1 if using Lua 5.0. +----------------------------------------------------------------------------- + +module('json.rpc') + +----------------------------------------------------------------------------- +-- Imports and dependencies +----------------------------------------------------------------------------- +local json = require('json') +local http = require("socket.http") + +----------------------------------------------------------------------------- +-- PUBLIC functions +----------------------------------------------------------------------------- + +--- Creates an RPC Proxy object for the given Url of a JSON-RPC server. +-- @param url The URL for the JSON RPC Server. +-- @return Object on which JSON-RPC remote methods can be called. +-- EXAMPLE Usage: +-- local jsolait = json.rpc.proxy('http://jsolait.net/testj.py') +-- print(jsolait.echo('This is a test of the echo method!')) +-- print(jsolait.args2String('first','second','third')) +-- table.foreachi( jsolait.args2Array(5,4,3,2,1), print) +function proxy(url) + local serverProxy = {} + local proxyMeta = { + __index = function(t, key) + return function(...) + return json.rpc.call(url, key, unpack(arg)) + end + end + } + setmetatable(serverProxy, proxyMeta) + return serverProxy +end + +--- Calls a JSON RPC method on a remote server. +-- Returns a boolean true if the call succeeded, false otherwise. +-- On success, the second returned parameter is the decoded +-- JSON object from the server. +-- On http failure, returns nil and an error message. +-- On success, returns the result and nil. +-- @param url The url of the JSON RPC server. +-- @param method The method being called. +-- @param ... Parameters to pass to the method. +-- @return result, error The JSON RPC result and error. One or the other should be nil. If both +-- are nil, this means that the result of the RPC call was nil. +-- EXAMPLE Usage: +-- print(json.rpc.call('http://jsolait.net/testj.py','echo','This string will be returned')) +function call(url, method, ...) + assert(method,'method param is nil to call') + local JSONRequestArray = { + id="httpRequest", + ["method"]=method, + params = arg + } + local httpResponse, result , code + local jsonRequest = json.encode(JSONRequestArray) + -- We use the sophisticated http.request form (with ltn12 sources and sinks) so that + -- we can set the content-type to text/plain. While this shouldn't strictly-speaking be true, + -- it seems a good idea (Xavante won't work w/out a content-type header, although a patch + -- is needed to Xavante to make it work with text/plain) + local ltn12 = require('ltn12') + local resultChunks = {} + httpResponse, code = http.request( + { ['url'] = url, + sink = ltn12.sink.table(resultChunks), + method = 'POST', + headers = { ['content-type']='text/plain', ['content-length']=string.len(jsonRequest) }, + source = ltn12.source.string(jsonRequest) + } + ) + httpResponse = table.concat(resultChunks) + -- Check the http response code + if (code~=200) then + return nil, "HTTP ERROR: " .. code + end + -- And decode the httpResponse and check the JSON RPC result code + result = json.decode( httpResponse ) + if result.result then + return result.result, nil + else + return nil, result.error + end +end +----------------------------------------------------------------------------- +-- JSONRPC4Lua: JSON RPC server for exposing Lua objects as JSON RPC callable +-- objects via http. +-- json.rpcserver Module. +-- Author: Craig Mason-Jones +-- Homepage: http://json.luaforge.net/ +-- Version: 0.9.10 +-- This module is released under the The GNU General Public License (GPL). +-- Please see LICENCE.txt for details. +-- +-- USAGE: +-- This module exposes one function: +-- server(luaClass, packReturn) +-- Manages incoming JSON RPC request forwarding the method call to the given +-- object. If packReturn is true, multiple return values are packed into an +-- array on return. +-- +-- IMPORTANT NOTES: +-- 1. This version ought really not be 0.9.10, since this particular part of the +-- JSONRPC4Lua package is very first-draft. However, the JSON4Lua package with which +-- it comes is quite solid, so there you have it :-) +-- 2. This has only been tested with Xavante webserver, with which it works +-- if you patch CGILua to accept 'text/plain' content type. See doc\cgilua_patch.html +-- for details. +---------------------------------------------------------------------------- + +module ('json.rpcserver') + +--- +-- Implements a JSON RPC Server wrapping for luaClass, exposing each of luaClass's +-- methods as JSON RPC callable methods. +-- @param luaClass The JSON RPC class to expose. +-- @param packReturn If true, the server will automatically wrap any +-- multiple-value returns into an array. Single returns remain single returns. If +-- false, when a function returns multiple values, only the first of these values will +-- be returned. +-- +function serve(luaClass, packReturn) + cgilua.contentheader('text','plain') + require('cgilua') + require ('json') + local postData = "" + + if not cgilua.servervariable('CONTENT_LENGTH') then + cgilua.put("Please access JSON Request using HTTP POST Request") + return 0 + else + postData = cgi[1] -- SAPI.Request.getpostdata() --[[{ "id":1, "method":"echo","params":["Hi there"]}]] -- + end + -- @TODO Catch an error condition on decoding the data + local jsonRequest = json.decode(postData) + local jsonResponse = {} + jsonResponse.id = jsonRequest.id + local method = luaClass[ jsonRequest.method ] + + if not method then + jsonResponse.error = 'Method ' .. jsonRequest.method .. ' does not exist at this server.' + else + local callResult = { pcall( method, unpack( jsonRequest.params ) ) } + if callResult[1] then -- Function call successfull + table.remove(callResult,1) + if packReturn and table.getn(callResult)>1 then + jsonResponse.result = callResult + else + jsonResponse.result = unpack(callResult) -- NB: Does not support multiple argument returns + end + else + jsonResponse.error = callResult[2] + end + end + + -- Output the result + -- TODO: How to be sure that the result and error tags are there even when they are nil in Lua? + -- Can force them by hand... ? + cgilua.contentheader('text','plain') + cgilua.put( json.encode( jsonResponse ) ) +end + +--[[ + Auctioneer Advanced + Version: <%version%> (<%codename%>) + Revision: $Id: CoreMain.lua 2233 2007-09-25 03:57:33Z norganna $ + URL: http://auctioneeraddon.com/ + + This is an addon for World of Warcraft that adds statistical history to the auction data that is collected + when the auction is scanned, so that you can easily determine what price + you will be able to sell an item for at auction or at a vendor whenever you + mouse-over an item in the game + + License: + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program(see GPL.txt); if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Note: + This AddOn's source code is specifically designed to work with + World of Warcraft's interpreted AddOn system. + You have an implicit licence to use this AddOn with these facilities + since that is its designated purpose as per: + http://www.fsf.org/licensing/licenses/gpl-faq.html#InterpreterIncompat +]] + + +--[[ + See CoreAPI.lua for a description of the modules API +]] + +if (not AucAdvanced) then AucAdvanced = {} end +if (not AucAdvancedData) then AucAdvancedData = {} end +if (not AucAdvancedLocal) then AucAdvancedLocal = {} end +if (not AucAdvancedConfig) then AucAdvancedConfig = {} end + +AucAdvanced.Version="<%version%>"; +if (AucAdvanced.Version == "<".."%version%>") then + AucAdvanced.Version = "5.0.DEV"; +end + +local private = {} + +-- For our modular stats system, each stats engine should add their +-- subclass to AucAdvanced.Modules.<type>.<name> and store their data into their own +-- data table in AucAdvancedData.Stats.<type><name> +if (not AucAdvanced.Modules) then AucAdvanced.Modules = {Stat={},Util={},Filter={}} end +if (not AucAdvancedData.Stats) then AucAdvancedData.Stats = {} end +if (not AucAdvancedLocal.Stats) then AucAdvancedLocal.Stats = {} end + +function private.TooltipHook(vars, ret, frame, name, hyperlink, quality, quantity, cost, additional) + if EnhTooltip.LinkType(hyperlink) ~= "item" then + return -- Auctioneer hooks into item tooltips only + end + + -- Check to see if we need to force load scandata + local getter = AucAdvanced.Settings.GetSetting + if (getter("scandata.tooltip.display") and getter("scandata.force")) then + AucAdvanced.Scan.GetImage() + end + + for system, systemMods in pairs(AucAdvanced.Modules) do + for engine, engineLib in pairs(systemMods) do + if (engineLib.Processor) then engineLib.Processor("tooltip", frame, name, hyperlink, quality, quantity, cost, additional) end + end + end +end + +function private.HookAH() + hooksecurefunc("AuctionFrameBrowse_Update", AucAdvanced.API.ListUpdate) + for system, systemMods in pairs(AucAdvanced.Modules) do + for engine, engineLib in pairs(systemMods) do + if (engineLib.Processor) then + engineLib.Processor("auctionui") + end + end + end +end + +function private.OnLoad(addon) + addon = addon:lower() + + -- Check if the actual addon itself is loading + if (addon == "auc-advanced") then + Stubby.RegisterAddOnHook("Blizzard_AuctionUi", "Auc-Advanced", private.HookAH) + Stubby.RegisterFunctionHook("EnhTooltip.AddTooltip", 600, private.TooltipHook) + for pos, module in ipairs(AucAdvanced.EmbeddedModules) do + -- These embedded modules have also just been loaded + private.OnLoad(module) + end + end + + -- Notify the actual module if it exists + local auc, sys, eng = strsplit("-", addon) + if (auc == "auc" and sys and eng) then + for system, systemMods in pairs(AucAdvanced.Modules) do + if (sys == system:lower()) then + for engine, engineLib in pairs(systemMods) do + if (eng == engine:lower() and engineLib.OnLoad) then + engineLib.OnLoad(addon) + end + end + end + end + end + + -- Check all modules' load triggers and pass event to processors + for system, systemMods in pairs(AucAdvanced.Modules) do + for engine, engineLib in pairs(systemMods) do + if (engineLib.LoadTriggers and engineLib.LoadTriggers[addon]) then + if (engineLib.OnLoad) then + engineLib.OnLoad(addon) + end + end + if (engineLib.Processor and auc == "auc" and sys and eng) then + engineLib.Processor("load", addon) + end + end + end +end + +function private.OnUnload() + for system, systemMods in pairs(AucAdvanced.Modules) do + for engine, engineLib in pairs(systemMods) do + if (engineLib.OnUnload) then + engineLib.OnUnload() + end + end + end +end + +private.Schedule = {} +function private.OnEvent(...) + local event, arg = select(2, ...) + if (event == "ADDON_LOADED") then + local addon = string.lower(arg) + if (addon:sub(1,4) == "auc-") then + private.OnLoad(addon) + end + elseif (event == "AUCTION_HOUSE_SHOW") then + -- Do Nothing for now + elseif (event == "AUCTION_HOUSE_CLOSED") then + AucAdvanced.Scan.Interrupt() + elseif (event == "PLAYER_LOGOUT") then + AucAdvanced.Scan.Commit(true) + private.OnUnload() + elseif event == "UNIT_INVENTORY_CHANGED" + or event == "ITEM_LOCK_CHANGED" + or event == "CURSOR_UPDATE" + or event == "BAG_UPDATE" + then + private.Schedule["inventory"] = GetTime() + 0.15 + end +end + +function private.OnUpdate(...) + if event == "inventory" then + AucAdvanced.Post.AlertBagsChanged() + end + + local now = GetTime() + for event, time in pairs(private.Schedule) do + if time > now then + for system, systemMods in pairs(AucAdvanced.Modules) do + for engine, engineLib in pairs(systemMods) do + if engineLib.Processor then + engineLib.Processor(event, time) + end + end + end + end + private.Schedule[event] = nil + end +end + +private.Frame = CreateFrame("Frame") +private.Frame:RegisterEvent("ADDON_LOADED") +private.Frame:RegisterEvent("AUCTION_HOUSE_SHOW") +private.Frame:RegisterEvent("AUCTION_HOUSE_CLOSED") +private.Frame:RegisterEvent("UNIT_INVENTORY_CHANGED") +private.Frame:RegisterEvent("ITEM_LOCK_CHANGED") +private.Frame:RegisterEvent("CURSOR_UPDATE") +private.Frame:RegisterEvent("BAG_UPDATE") +private.Frame:RegisterEvent("PLAYER_LOGOUT") +private.Frame:SetScript("OnEvent", private.OnEvent) +private.Frame:SetScript("OnUpdate", private.OnUpdate) + +-- Auctioneer's debug functions +AucAdvanced.Debug = {} +local addonName = "Auctioneer" -- the addon's name as it will be displayed in + -- the debug messages +------------------------------------------------------------------------------- +-- Prints the specified message to nLog. +-- +-- syntax: +-- errorCode, message = debugPrint([message][, category][, title][, errorCode][, level]) +-- +-- parameters: +-- message - (string) the error message +-- nil, no error message specified +-- category - (string) the category of the debug message +-- nil, no category specified +-- title - (string) the title for the debug message +-- nil, no title specified +-- errorCode - (number) the error code +-- nil, no error code specified +-- level - (string) nLog message level +-- Any nLog.levels string is valid. +-- nil, no level specified +-- +-- returns: +-- errorCode - (number) errorCode, if one is specified +-- nil, otherwise +-- message - (string) message, if one is specified +-- nil, otherwise +------------------------------------------------------------------------------- +function AucAdvanced.Debug.DebugPrint(message, category, title, errorCode, level) + return DebugLib.DebugPrint(addonName, message, category, title, errorCode, level) +end + +------------------------------------------------------------------------------- +-- Used to make sure that conditions are met within functions. +-- If test is false, the error message will be written to nLog and the user's +-- default chat channel. +-- +-- syntax: +-- assertion = assert(test, message) +-- +-- parameters: +-- test - (any) false/nil, if the assertion failed +-- anything else, otherwise +-- message - (string) the message which will be output to the user +-- +-- returns: +-- assertion - (boolean) true, if the test passed +-- false, otherwise +------------------------------------------------------------------------------- +function AucAdvanced.Debug.Assert(test, message) + return DebugLib.Assert(addonName, test, message) +end + + |