Fix #5829 - Messing around with flutter API
authorAlan Knowles <alan@roojs.com>
Wed, 16 Sep 2020 08:48:54 +0000 (16:48 +0800)
committerAlan Knowles <alan@roojs.com>
Wed, 16 Sep 2020 08:48:54 +0000 (16:48 +0800)
67 files changed:
.gitignore
INSTALL
configure.ac
debian/README [new file with mode: 0644]
debian/README.Debian [new file with mode: 0644]
debian/README.source [new file with mode: 0644]
debian/autoreconf.after [new file with mode: 0644]
debian/autoreconf.before [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/debhelper-build-stamp [new file with mode: 0644]
debian/files [new file with mode: 0644]
debian/manpage.1.ex [new file with mode: 0644]
debian/manpage.sgml.ex [new file with mode: 0644]
debian/manpage.xml.ex [new file with mode: 0644]
debian/menu.ex [new file with mode: 0644]
debian/postinst.ex [new file with mode: 0644]
debian/postrm.ex [new file with mode: 0644]
debian/preinst.ex [new file with mode: 0644]
debian/prerm.ex [new file with mode: 0644]
debian/roobuilder-docs.docs [new file with mode: 0644]
debian/roobuilder.cron.d.ex [new file with mode: 0644]
debian/roobuilder.doc-base.EX [new file with mode: 0644]
debian/roobuilder.substvars [new file with mode: 0644]
debian/roobuilder/DEBIAN/control [new file with mode: 0644]
debian/roobuilder/DEBIAN/md5sums [new file with mode: 0644]
debian/roobuilder/usr/bin/roobuilder [new file with mode: 0755]
debian/roobuilder/usr/share/applications/roobuilder.desktop [new file with mode: 0644]
debian/roobuilder/usr/share/doc/roobuilder/README.Debian [new file with mode: 0644]
debian/roobuilder/usr/share/doc/roobuilder/changelog.gz [new file with mode: 0644]
debian/roobuilder/usr/share/doc/roobuilder/copyright [new file with mode: 0644]
debian/roobuilder/usr/share/icons/hicolor/16x16/apps/roobuilder.png [new file with mode: 0644]
debian/roobuilder/usr/share/icons/hicolor/22x22/apps/roobuilder.png [new file with mode: 0644]
debian/roobuilder/usr/share/icons/hicolor/24x24/apps/roobuilder.png [new file with mode: 0644]
debian/roobuilder/usr/share/icons/hicolor/32x32/apps/roobuilder.png [new file with mode: 0644]
debian/roobuilder/usr/share/icons/hicolor/48x48/apps/roobuilder.png [new file with mode: 0644]
debian/rules [new file with mode: 0755]
debian/source/format [new file with mode: 0644]
notes/flutter.txt [new file with mode: 0644]
org.roojs.roobuilder.json [new file with mode: 0644]
src/Application.vala
src/Builder4/DialogNewComponent.bjs
src/Builder4/DialogNewComponent.vala
src/Builder4/EditProject.bjs
src/Builder4/EditProject.vala
src/Builder4/MainWindow.bjs
src/Builder4/PopoverFileDetails.bjs
src/Builder4/PopoverFileDetails.vala
src/Builder4/WindowRightPalete.bjs
src/Builder4/config1.builder
src/JsRender/Flutter.vala [new file with mode: 0644]
src/JsRender/JsRender.vala
src/Main.vala
src/Makefile.am
src/Palete/Flutter.vala [new file with mode: 0644]
src/Palete/Gtk.vala
src/Palete/Javascript.vala
src/Palete/Palete.vala
src/Palete/Roo.vala
src/Project/Flutter.vala [new file with mode: 0644]
src/Project/Project.vala
src/Resources.vala
tools/flutter_extract.php [new file with mode: 0644]
tools/flutter_nodes.php [new file with mode: 0644]
tools/flutter_sqlite.php [new file with mode: 0644]

index f09c022..ac32f85 100644 (file)
@@ -17,6 +17,7 @@ src/*.stamp
 src/*.stamp-t
 tests/*.c
 
+Makecache
 Makefile
 Makefile.in
 aclocal.m4
diff --git a/INSTALL b/INSTALL
index 2099840..8865734 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -1,8 +1,8 @@
 Installation Instructions
 *************************
 
-Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
-Inc.
+   Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software
+Foundation, Inc.
 
    Copying and distribution of this file, with or without modification,
 are permitted in any medium without royalty provided the copyright
@@ -12,97 +12,96 @@ without warranty of any kind.
 Basic Installation
 ==================
 
-   Briefly, the shell command `./configure && make && make install'
+   Briefly, the shell command './configure && make && make install'
 should configure, build, and install this package.  The following
-more-detailed instructions are generic; see the `README' file for
+more-detailed instructions are generic; see the 'README' file for
 instructions specific to this package.  Some packages provide this
-`INSTALL' file but do not implement all of the features documented
+'INSTALL' file but do not implement all of the features documented
 below.  The lack of an optional feature in a given package is not
 necessarily a bug.  More recommendations for GNU packages can be found
 in *note Makefile Conventions: (standards)Makefile Conventions.
 
-   The `configure' shell script attempts to guess correct values for
+   The 'configure' shell script attempts to guess correct values for
 various system-dependent variables used during compilation.  It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions.  Finally, it creates a shell script `config.status' that
+those values to create a 'Makefile' in each directory of the package.
+It may also create one or more '.h' files containing system-dependent
+definitions.  Finally, it creates a shell script 'config.status' that
 you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
+file 'config.log' containing compiler output (useful mainly for
+debugging 'configure').
 
-   It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring.  Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.
+   It can also use an optional file (typically called 'config.cache' and
+enabled with '--cache-file=config.cache' or simply '-C') that saves the
+results of its tests to speed up reconfiguring.  Caching is disabled by
+default to prevent problems with accidental use of stale cache files.
 
    If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
+to figure out how 'configure' could check whether to do them, and mail
+diffs or instructions to the address given in the 'README' so they can
 be considered for the next release.  If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
+some point 'config.cache' contains results you don't want to keep, you
 may remove or edit it.
 
-   The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'.  You need `configure.ac' if
-you want to change it or regenerate `configure' using a newer version
-of `autoconf'.
+   The file 'configure.ac' (or 'configure.in') is used to create
+'configure' by a program called 'autoconf'.  You need 'configure.ac' if
+you want to change it or regenerate 'configure' using a newer version of
+'autoconf'.
 
    The simplest way to compile this package is:
 
-  1. `cd' to the directory containing the package's source code and type
-     `./configure' to configure the package for your system.
+  1. 'cd' to the directory containing the package's source code and type
+     './configure' to configure the package for your system.
 
-     Running `configure' might take a while.  While running, it prints
+     Running 'configure' might take a while.  While running, it prints
      some messages telling which features it is checking for.
 
-  2. Type `make' to compile the package.
+  2. Type 'make' to compile the package.
 
-  3. Optionally, type `make check' to run any self-tests that come with
+  3. Optionally, type 'make check' to run any self-tests that come with
      the package, generally using the just-built uninstalled binaries.
 
-  4. Type `make install' to install the programs and any data files and
+  4. Type 'make install' to install the programs and any data files and
      documentation.  When installing into a prefix owned by root, it is
      recommended that the package be configured and built as a regular
-     user, and only the `make install' phase executed with root
+     user, and only the 'make install' phase executed with root
      privileges.
 
-  5. Optionally, type `make installcheck' to repeat any self-tests, but
+  5. Optionally, type 'make installcheck' to repeat any self-tests, but
      this time using the binaries in their final installed location.
      This target does not install anything.  Running this target as a
-     regular user, particularly if the prior `make install' required
+     regular user, particularly if the prior 'make install' required
      root privileges, verifies that the installation completed
      correctly.
 
   6. You can remove the program binaries and object files from the
-     source code directory by typing `make clean'.  To also remove the
-     files that `configure' created (so you can compile the package for
-     a different kind of computer), type `make distclean'.  There is
-     also a `make maintainer-clean' target, but that is intended mainly
+     source code directory by typing 'make clean'.  To also remove the
+     files that 'configure' created (so you can compile the package for
+     a different kind of computer), type 'make distclean'.  There is
+     also a 'make maintainer-clean' target, but that is intended mainly
      for the package's developers.  If you use it, you may have to get
      all sorts of other programs in order to regenerate files that came
      with the distribution.
 
-  7. Often, you can also type `make uninstall' to remove the installed
+  7. Often, you can also type 'make uninstall' to remove the installed
      files again.  In practice, not all packages have tested that
      uninstallation works correctly, even though it is required by the
      GNU Coding Standards.
 
-  8. Some packages, particularly those that use Automake, provide `make
+  8. Some packages, particularly those that use Automake, provide 'make
      distcheck', which can by used by developers to test that all other
-     targets like `make install' and `make uninstall' work correctly.
+     targets like 'make install' and 'make uninstall' work correctly.
      This target is generally not run by end users.
 
 Compilers and Options
 =====================
 
    Some systems require unusual options for compilation or linking that
-the `configure' script does not know about.  Run `./configure --help'
+the 'configure' script does not know about.  Run './configure --help'
 for details on some of the pertinent environment variables.
 
-   You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment.  Here
-is an example:
+   You can give 'configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here is
+an example:
 
      ./configure CC=c99 CFLAGS=-g LIBS=-lposix
 
@@ -113,21 +112,21 @@ Compiling For Multiple Architectures
 
    You can compile the package for more than one kind of computer at the
 same time, by placing the object files for each architecture in their
-own directory.  To do this, you can use GNU `make'.  `cd' to the
+own directory.  To do this, you can use GNU 'make'.  'cd' to the
 directory where you want the object files and executables to go and run
-the `configure' script.  `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.  This
-is known as a "VPATH" build.
+the 'configure' script.  'configure' automatically checks for the source
+code in the directory that 'configure' is in and in '..'.  This is known
+as a "VPATH" build.
 
-   With a non-GNU `make', it is safer to compile the package for one
+   With a non-GNU 'make', it is safer to compile the package for one
 architecture at a time in the source code directory.  After you have
-installed the package for one architecture, use `make distclean' before
+installed the package for one architecture, use 'make distclean' before
 reconfiguring for another architecture.
 
    On MacOS X 10.5 and later systems, you can create libraries and
 executables that work on multiple system types--known as "fat" or
-"universal" binaries--by specifying multiple `-arch' options to the
-compiler but only a single `-arch' option to the preprocessor.  Like
+"universal" binaries--by specifying multiple '-arch' options to the
+compiler but only a single '-arch' option to the preprocessor.  Like
 this:
 
      ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
@@ -136,105 +135,104 @@ this:
 
    This is not guaranteed to produce working output in all cases, you
 may have to build one architecture at a time and combine the results
-using the `lipo' tool if you have problems.
+using the 'lipo' tool if you have problems.
 
 Installation Names
 ==================
 
-   By default, `make install' installs the package's commands under
-`/usr/local/bin', include files under `/usr/local/include', etc.  You
-can specify an installation prefix other than `/usr/local' by giving
-`configure' the option `--prefix=PREFIX', where PREFIX must be an
+   By default, 'make install' installs the package's commands under
+'/usr/local/bin', include files under '/usr/local/include', etc.  You
+can specify an installation prefix other than '/usr/local' by giving
+'configure' the option '--prefix=PREFIX', where PREFIX must be an
 absolute file name.
 
    You can specify separate installation prefixes for
 architecture-specific files and architecture-independent files.  If you
-pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+pass the option '--exec-prefix=PREFIX' to 'configure', the package uses
 PREFIX as the prefix for installing programs and libraries.
 Documentation and other data files still use the regular prefix.
 
    In addition, if you use an unusual directory layout you can give
-options like `--bindir=DIR' to specify different values for particular
-kinds of files.  Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.  In general, the
-default for these options is expressed in terms of `${prefix}', so that
-specifying just `--prefix' will affect all of the other directory
+options like '--bindir=DIR' to specify different values for particular
+kinds of files.  Run 'configure --help' for a list of the directories
+you can set and what kinds of files go in them.  In general, the default
+for these options is expressed in terms of '${prefix}', so that
+specifying just '--prefix' will affect all of the other directory
 specifications that were not explicitly provided.
 
    The most portable way to affect installation locations is to pass the
-correct locations to `configure'; however, many packages provide one or
+correct locations to 'configure'; however, many packages provide one or
 both of the following shortcuts of passing variable assignments to the
-`make install' command line to change installation locations without
+'make install' command line to change installation locations without
 having to reconfigure or recompile.
 
    The first method involves providing an override variable for each
-affected directory.  For example, `make install
+affected directory.  For example, 'make install
 prefix=/alternate/directory' will choose an alternate location for all
 directory configuration variables that were expressed in terms of
-`${prefix}'.  Any directories that were specified during `configure',
-but not in terms of `${prefix}', must each be overridden at install
-time for the entire installation to be relocated.  The approach of
-makefile variable overrides for each directory variable is required by
-the GNU Coding Standards, and ideally causes no recompilation.
-However, some platforms have known limitations with the semantics of
-shared libraries that end up requiring recompilation when using this
-method, particularly noticeable in packages that use GNU Libtool.
-
-   The second method involves providing the `DESTDIR' variable.  For
-example, `make install DESTDIR=/alternate/directory' will prepend
-`/alternate/directory' before all installation names.  The approach of
-`DESTDIR' overrides is not required by the GNU Coding Standards, and
+'${prefix}'.  Any directories that were specified during 'configure',
+but not in terms of '${prefix}', must each be overridden at install time
+for the entire installation to be relocated.  The approach of makefile
+variable overrides for each directory variable is required by the GNU
+Coding Standards, and ideally causes no recompilation.  However, some
+platforms have known limitations with the semantics of shared libraries
+that end up requiring recompilation when using this method, particularly
+noticeable in packages that use GNU Libtool.
+
+   The second method involves providing the 'DESTDIR' variable.  For
+example, 'make install DESTDIR=/alternate/directory' will prepend
+'/alternate/directory' before all installation names.  The approach of
+'DESTDIR' overrides is not required by the GNU Coding Standards, and
 does not work on platforms that have drive letters.  On the other hand,
 it does better at avoiding recompilation issues, and works well even
-when some directory options were not specified in terms of `${prefix}'
-at `configure' time.
+when some directory options were not specified in terms of '${prefix}'
+at 'configure' time.
 
 Optional Features
 =================
 
    If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-   Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System).  The
-`README' should mention any `--enable-' and `--with-' options that the
+with an extra prefix or suffix on their names by giving 'configure' the
+option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'.
+
+   Some packages pay attention to '--enable-FEATURE' options to
+'configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to '--with-PACKAGE' options, where PACKAGE
+is something like 'gnu-as' or 'x' (for the X Window System).  The
+'README' should mention any '--enable-' and '--with-' options that the
 package recognizes.
 
-   For packages that use the X Window System, `configure' can usually
+   For packages that use the X Window System, 'configure' can usually
 find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
+you can use the 'configure' options '--x-includes=DIR' and
+'--x-libraries=DIR' to specify their locations.
 
    Some packages offer the ability to configure how verbose the
-execution of `make' will be.  For these packages, running `./configure
+execution of 'make' will be.  For these packages, running './configure
 --enable-silent-rules' sets the default to minimal output, which can be
-overridden with `make V=1'; while running `./configure
+overridden with 'make V=1'; while running './configure
 --disable-silent-rules' sets the default to verbose, which can be
-overridden with `make V=0'.
+overridden with 'make V=0'.
 
 Particular systems
 ==================
 
-   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU
-CC is not installed, it is recommended to use the following options in
+   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU CC
+is not installed, it is recommended to use the following options in
 order to use an ANSI C compiler:
 
      ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
 
 and if that doesn't work, install pre-built binaries of GCC for HP-UX.
 
-   HP-UX `make' updates targets which have the same time stamps as
-their prerequisites, which makes it generally unusable when shipped
-generated files such as `configure' are involved.  Use GNU `make'
-instead.
+   HP-UX 'make' updates targets which have the same time stamps as their
+prerequisites, which makes it generally unusable when shipped generated
+files such as 'configure' are involved.  Use GNU 'make' instead.
 
    On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
-parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
-a workaround.  If GNU CC is not installed, it is therefore recommended
-to try
+parse its '<wchar.h>' header file.  The option '-nodtk' can be used as a
+workaround.  If GNU CC is not installed, it is therefore recommended to
+try
 
      ./configure CC="cc"
 
@@ -242,26 +240,26 @@ and if that doesn't work, try
 
      ./configure CC="cc -nodtk"
 
-   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This
+   On Solaris, don't put '/usr/ucb' early in your 'PATH'.  This
 directory contains several dysfunctional programs; working variants of
-these programs are available in `/usr/bin'.  So, if you need `/usr/ucb'
-in your `PATH', put it _after_ `/usr/bin'.
+these programs are available in '/usr/bin'.  So, if you need '/usr/ucb'
+in your 'PATH', put it _after_ '/usr/bin'.
 
-   On Haiku, software installed for all users goes in `/boot/common',
-not `/usr/local'.  It is recommended to use the following options:
+   On Haiku, software installed for all users goes in '/boot/common',
+not '/usr/local'.  It is recommended to use the following options:
 
      ./configure --prefix=/boot/common
 
 Specifying the System Type
 ==========================
 
-   There may be some features `configure' cannot figure out
+   There may be some features 'configure' cannot figure out
 automatically, but needs to determine by the type of machine the package
 will run on.  Usually, assuming the package is built to be run on the
-_same_ architectures, `configure' can figure that out, but if it prints
+_same_ architectures, 'configure' can figure that out, but if it prints
 a message saying it cannot guess the machine type, give it the
-`--build=TYPE' option.  TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
+'--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as 'sun4', or a canonical name which has the form:
 
      CPU-COMPANY-SYSTEM
 
@@ -270,101 +268,101 @@ where SYSTEM can have one of these forms:
      OS
      KERNEL-OS
 
-   See the file `config.sub' for the possible values of each field.  If
-`config.sub' isn't included in this package, then this package doesn't
+   See the file 'config.sub' for the possible values of each field.  If
+'config.sub' isn't included in this package, then this package doesn't
 need to know the machine type.
 
    If you are _building_ compiler tools for cross-compiling, you should
-use the option `--target=TYPE' to select the type of system they will
+use the option '--target=TYPE' to select the type of system they will
 produce code for.
 
    If you want to _use_ a cross compiler, that generates code for a
 platform different from the build platform, you should specify the
 "host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
+eventually be run) with '--host=TYPE'.
 
 Sharing Defaults
 ================
 
-   If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists.  Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
+   If you want to set default values for 'configure' scripts to share,
+you can create a site shell script called 'config.site' that gives
+default values for variables like 'CC', 'cache_file', and 'prefix'.
+'configure' looks for 'PREFIX/share/config.site' if it exists, then
+'PREFIX/etc/config.site' if it exists.  Or, you can set the
+'CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all 'configure' scripts look for a site script.
 
 Defining Variables
 ==================
 
    Variables not defined in a site shell script can be set in the
-environment passed to `configure'.  However, some packages may run
+environment passed to 'configure'.  However, some packages may run
 configure again during the build, and the customized values of these
 variables may be lost.  In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'.  For example:
+them in the 'configure' command line, using 'VAR=value'.  For example:
 
      ./configure CC=/usr/local2/bin/gcc
 
-causes the specified `gcc' to be used as the C compiler (unless it is
+causes the specified 'gcc' to be used as the C compiler (unless it is
 overridden in the site shell script).
 
-Unfortunately, this technique does not work for `CONFIG_SHELL' due to
-an Autoconf limitation.  Until the limitation is lifted, you can use
-this workaround:
+Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an
+Autoconf limitation.  Until the limitation is lifted, you can use this
+workaround:
 
      CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
 
-`configure' Invocation
+'configure' Invocation
 ======================
 
-   `configure' recognizes the following options to control how it
+   'configure' recognizes the following options to control how it
 operates.
 
-`--help'
-`-h'
-     Print a summary of all of the options to `configure', and exit.
+'--help'
+'-h'
+     Print a summary of all of the options to 'configure', and exit.
 
-`--help=short'
-`--help=recursive'
+'--help=short'
+'--help=recursive'
      Print a summary of the options unique to this package's
-     `configure', and exit.  The `short' variant lists options used
-     only in the top level, while the `recursive' variant lists options
-     also present in any nested packages.
+     'configure', and exit.  The 'short' variant lists options used only
+     in the top level, while the 'recursive' variant lists options also
+     present in any nested packages.
 
-`--version'
-`-V'
-     Print the version of Autoconf used to generate the `configure'
+'--version'
+'-V'
+     Print the version of Autoconf used to generate the 'configure'
      script, and exit.
 
-`--cache-file=FILE'
+'--cache-file=FILE'
      Enable the cache: use and save the results of the tests in FILE,
-     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     traditionally 'config.cache'.  FILE defaults to '/dev/null' to
      disable caching.
 
-`--config-cache'
-`-C'
-     Alias for `--cache-file=config.cache'.
+'--config-cache'
+'-C'
+     Alias for '--cache-file=config.cache'.
 
-`--quiet'
-`--silent'
-`-q'
+'--quiet'
+'--silent'
+'-q'
      Do not print messages saying which checks are being made.  To
-     suppress all normal output, redirect it to `/dev/null' (any error
+     suppress all normal output, redirect it to '/dev/null' (any error
      messages will still be shown).
 
-`--srcdir=DIR'
+'--srcdir=DIR'
      Look for the package's source code in directory DIR.  Usually
-     `configure' can determine that directory automatically.
+     'configure' can determine that directory automatically.
 
-`--prefix=DIR'
-     Use DIR as the installation prefix.  *note Installation Names::
-     for more details, including other options available for fine-tuning
-     the installation locations.
+'--prefix=DIR'
+     Use DIR as the installation prefix.  *note Installation Names:: for
+     more details, including other options available for fine-tuning the
+     installation locations.
 
-`--no-create'
-`-n'
+'--no-create'
+'-n'
      Run the configure checks, but stop before creating any output
      files.
 
-`configure' also accepts some other, not widely useful, options.  Run
-`configure --help' for more details.
+'configure' also accepts some other, not widely useful, options.  Run
+'configure --help' for more details.
index 55d19be..7d2f12d 100644 (file)
@@ -20,8 +20,7 @@ AC_CHECK_LIB([m],[cos])
 
 dnl we need to check these exist, then it will generate a compile string for them.
 
-PKG_CHECK_MODULES(ROOBUILDER, [
-                clutter-gtk-1.0 
+PKG_CHECK_MODULES(ROOBUILDER, [  clutter-gtk-1.0
                 glib-2.0 >= 2.24.1
                 gobject-2.0 >= 2.24.1
                 gtk+-3.0 >= 3.11.3
@@ -30,7 +29,7 @@ PKG_CHECK_MODULES(ROOBUILDER, [
                 gee-0.8
                 libxml-2.0
                 libsoup-2.4,
-                roojspacker-1.1
+                roojspacker-1.2
 ])
 
 dnl --- libvala -- needs to find matching really..
diff --git a/debian/README b/debian/README
new file mode 100644 (file)
index 0000000..02b26bc
--- /dev/null
@@ -0,0 +1,6 @@
+The Debian Package roobuilder
+----------------------------
+
+Comments regarding the Package
+
+ -- Alan <alan@roojs.com>  Thu, 16 May 2019 17:47:00 +0800
diff --git a/debian/README.Debian b/debian/README.Debian
new file mode 100644 (file)
index 0000000..b2cefab
--- /dev/null
@@ -0,0 +1,6 @@
+roobuilder for Debian
+--------------------
+
+<possible notes regarding this package - if none, delete this file>
+
+ -- Alan <alan@roojs.com>  Thu, 16 May 2019 17:47:00 +0800
diff --git a/debian/README.source b/debian/README.source
new file mode 100644 (file)
index 0000000..8375732
--- /dev/null
@@ -0,0 +1,10 @@
+roobuilder for Debian
+--------------------
+
+<this file describes information about the source package, see Debian policy
+manual section 4.14. You WILL either need to modify or delete this file>
+
+
+
+ -- Alan <alan@roojs.com>  Thu, 16 May 2019 17:47:00 +0800
+
diff --git a/debian/autoreconf.after b/debian/autoreconf.after
new file mode 100644 (file)
index 0000000..bba07e9
--- /dev/null
@@ -0,0 +1,220 @@
+6eea1cef1a961dc5c2ef097725c8132b  ./roobuilder.desktop
+1347d659e83304654e25bcc1f65c9199  ./NEWS
+b991e5e96350ca96b2495eb33a13ceb9  ./README
+bac3fb7f33d1f10f02f0b6460d2eee12  ./install-sh
+5db3cf4d791f482908f0f4a158794ba0  ./notes/flutter.txt
+97f2718962a7909393f49dd4efee49df  ./Makefile.in
+d41d8cd98f00b204e9800998ecf8427e  ./ChangeLog
+dc2a3bd2e90ea29308069119e150d84c  ./src/c/jscore_object_call_as_function.c
+2c88d5ad89ce40f359e8414bfd040e45  ./src/Main.vala
+437f6610203214a814dc36114bb7b437  ./src/Builder4/WindowRooView.bjs
+7272e7972a83347b82448b2b06096e8c  ./src/Builder4/Editor.c
+9ab1eabf13565763ada54b9a7f0b5912  ./src/Builder4/DialogTemplateSelect.bjs
+70800a190a8949d7e047426fdd369747  ./src/Builder4/ProjectSettings.bjs
+f5dc979d81e74ab04bc3c900cf9156b3  ./src/Builder4/WindowLeftProps.c
+254a8daff9072d59e32f03113d02e429  ./src/Builder4/DialogTemplateSelect.vala
+c5ef3fde1b376ea73b1006e3d669edb7  ./src/Builder4/ClutterFiles.bjs
+189bc983b2dc0403b5aba0e4a609216b  ./src/Builder4/RooProjectSettings.bjs
+c2bb7577fb27ec3cef054511b0522bcd  ./src/Builder4/DialogConfirm.c
+e09dd27e29d115acecd768c13efc7633  ./src/Builder4/WindowLeftProjects.vala
+4f275dc627f27b9cf7ee985f75f0d565  ./src/Builder4/WindowLeftProjects.c
+edc8430ca864508d07046aa44624ab22  ./src/Builder4/ProjectSettings.c
+de51165527299a2c386ca4da85454b05  ./src/Builder4/ValaCompileErrors.bjs
+068e65d2956ba1ffa4261d7fcaf23a9b  ./src/Builder4/WindowAddProp.c
+94f3a77a9014c646b2b47f207378126a  ./src/Builder4/WindowLeftTree.c
+b4637d799b5e74ac3688fdaac268c8cd  ./src/Builder4/ValaCompileResults.bjs
+bcbd703da89ceddaf872c411a4c7c6ea  ./src/Builder4/WindowState.c
+8885b520fec55e22d24df7035d93e2ae  ./src/Builder4/WindowLeftTree.bjs
+4b3ca347619a75423add229246d6934b  ./src/Builder4/ValaProjectSettings.c
+0bc9d997eb1a281f42785b779ff7162d  ./src/Builder4/GtkView.bjs
+4f146ffda5805206cf3fc30c41c9bb24  ./src/Builder4/DialogSaveTemplate.bjs
+082c8b2506b9475913ed023cef26dcba  ./src/Builder4/StandardErrorDialog.c
+01f94aae4ea0d5d9b6b56f34fa5f79f4  ./src/Builder4/DialogConfirm.vala
+012a185febbfda70c1e6f47122ce6cd0  ./src/Builder4/FakeServer.c
+2ce7c191c666149680726970ebfdd655  ./src/Builder4/PopoverProperty.vala
+a927514d7a5725861a523749559447a2  ./src/Builder4/MainWindow.vala
+9005b8b5550eeff5287f8d95cd54a030  ./src/Builder4/Editor.bjs
+a755a32cc8adae70223cf843e849cc11  ./src/Builder4/ValaCompileErrors.c
+d6f4ffc749087a615b6084cefeaf0987  ./src/Builder4/PopoverFileDetails.bjs
+c9b5314660024b98a92708a49325d0f4  ./src/Builder4/ValaProjectSettings.vala
+adeacc7dd66841599cda89216128060a  ./src/Builder4/ValaCompileResults.c
+b0b017c153127530146f16d8cf6c1da9  ./src/Builder4/FakeServer.vala
+224ba6d82948ea5089d9da64f2a35502  ./src/Builder4/PopoverProperty.c
+cdf6b9e2b975731ea6a358d1b80910cc  ./src/Builder4/WindowRightPalete.c
+215dadaf4cf4d649e9010beb4103ab41  ./src/Builder4/Editor.vala
+98410f02491be156d42a51c73b20d849  ./src/Builder4/DialogSaveModule.vala
+991eba8f43356da1547fb636a6aa3f3e  ./src/Builder4/WindowRightPalete.bjs
+1fc179baf6dce16840371f35d4b2f659  ./src/Builder4/EditProject.vala
+3cd8ea2fb7f65354e434b4681d22cf63  ./src/Builder4/WindowRooView.vala
+b5e47df8732d6dce9766fcf3a077d56b  ./src/Builder4/PopoverFileDetails.c
+f97678a1fc03a8f6d3350f4bbf5bbced  ./src/Builder4/WindowLeftProjects.bjs
+6278ccc0f64f5c2757895aacda602251  ./src/Builder4/CompileState.vala
+6122186210519e090be762452501721b  ./src/Builder4/GtkView.c
+8d3de0f75a2c7a448a1356dce17a8d23  ./src/Builder4/WindowState.vala
+ce71c422abff3cc9fab85e082758417f  ./src/Builder4/EditProject.c
+3240de25cec411f70a664d60a863a5bf  ./src/Builder4/.deps/ValaProjectSettings.Po
+eac560ca8d937023d780ae709733ee95  ./src/Builder4/.deps/ProjectSettings.Po
+9e1a8765021308ba8f73802d9897224d  ./src/Builder4/ValaCompileResults.vala
+4f55a16a3c362bf5cb07cca9fe3d07aa  ./src/Builder4/About.bjs
+cbbda6c2c27159717513bd3b77066252  ./src/Builder4/DialogSaveTemplate.vala
+fd611a15189da35ea6473d62d27ccf89  ./src/Builder4/ValaProjectSettings.bjs
+b5a357fc8cb9f019b387d5da68799d6e  ./src/Builder4/WindowAddProp.bjs
+dd2c826f5916481994b8f05060e38561  ./src/Builder4/PopoverFileDetails.vala
+1d5c2aaecfb07b255ee7b55bbeb28b94  ./src/Builder4/GladeView.bjs
+dcf242bff22c4c817bc7ee67bd88a1ce  ./src/Builder4/PopoverProperty.bjs
+48da45963803c1c3ac9a3b7b25335ef5  ./src/Builder4/StandardErrorDialog.vala
+ec30fd67d2234631eff16e8cfca3b930  ./src/Builder4/ClutterFiles.c
+654440c2f4e05ed6b4b83860261246ee  ./src/Builder4/WindowLeftProps.vala
+15a0e9b11f4f9dfc8ff4cdb9a0c8f7af  ./src/Builder4/WindowRightPalete.vala
+a6d4c79785530fddc067d050b508c5c6  ./src/Builder4/GladeView.vala
+0aed6f6d1867b8191b565e8fb8d44760  ./src/Builder4/About.vala
+a3102786032699989c21897d8ab47464  ./src/Builder4/ClutterFiles.vala
+6cd0d8e30e1f09056d312997ee79d19b  ./src/Builder4/WindowAddProp.vala
+d5cacc76623a955e58cc149ae16c92ed  ./src/Builder4/MainWindow.bjs
+3fcd0fabe94561a2b70f399e217a7fb3  ./src/Builder4/DialogSaveTemplate.c
+1d5825633e811a1dda8727fa2fa5056d  ./src/Builder4/EditProject.bjs
+c37d5d443138bd1563e0e698b8610570  ./src/Builder4/WindowLeftProps.bjs
+9273edb5b24f4d231a672609f4d10f72  ./src/Builder4/GtkView.vala
+fa525dc2730059a4acf269ecc056438c  ./src/Builder4/WindowLeftTree.vala
+05bcd8817a6e30e5902c651e026e9485  ./src/Builder4/GladeExtras.vala
+5cb20f952a96b0162253c5496ed2bc0a  ./src/Builder4/DialogConfirm.bjs
+184408c7dc96918ebd93f4e687236bb6  ./src/Builder4/About.c
+4f50a2f48cdba1c5d9c4ec0e9cb0543b  ./src/Builder4/DialogNewComponent.c
+f5abeefbed7d8439d841b8eea1098ee0  ./src/Builder4/ValaCompileErrors.vala
+372d3a7d2e3792715ab89f2bb3831388  ./src/Builder4/StandardErrorDialog.bjs
+05486cb40599ea0075d3dc4e65120e78  ./src/Builder4/ValaProjectSettingsPopover.bjs
+aad50720ee14dd0ef5e7a60721833677  ./src/Builder4/ValaProjectSettingsPopover.c
+7a12ce5a0039fbfdd4744b1cf79379fe  ./src/Builder4/DialogPluginWebkit.c
+e1798d5a4a585db6006d63e4ff3b4cee  ./src/Builder4/DialogTemplateSelect.c
+5ead2660becb78a5eb4fd8bfd5e1cc69  ./src/Builder4/config1.builder
+e43ad6bdc45bd4537e63484485f354df  ./src/Builder4/MainWindow.c
+c2eb8daa2916479455d30808eedd103e  ./src/Builder4/DialogNewComponent.vala
+40989c636c2d81e95a9087300a6439f1  ./src/Builder4/DialogNewComponent.bjs
+b24d48781f2c87d7e1f2323d18a2b042  ./src/Builder4/ValaProjectSettingsPopover.vala
+87a5712c433a6ba725c5ead9a49b635e  ./src/Builder4/DialogSaveModule.c
+b70433ba324a8fb409703a195e4d90a4  ./src/Builder4/RooProjectSettings.c
+eb127adf198003d608837c990fb5a73d  ./src/Builder4/WindowRooView.c
+1f587a243cd750b83a861392add1d4e6  ./src/Builder4/DialogPluginWebkit.bjs
+885fc466b28ef592476dc060b0ec8148  ./src/Builder4/ProjectSettings.vala
+ff780fedae19e2780a259375966af977  ./src/Builder4/RooProjectSettings.vala
+898e2fc7aba201e1b3c6c5b3d8e3b7a2  ./src/Builder4/DialogSaveModule.bjs
+5b733e38e79a7c9525ac5269225fc9ab  ./src/Builder4/DialogPluginWebkit.vala
+8f97e7575b7a283a47ff5825d32ba7d0  ./src/Palete/ValaSourceCompiler.c
+7b35a871bfb84e6c46b2070249d122ce  ./src/Palete/CompletionProvider.vala
+9fa897f76b56755cca3e98dbf3530770  ./src/Palete/Flutter.vala
+ea0059f1957b5e6b17ca448dad6191c6  ./src/Palete/RooDatabase.vala
+3390066e59fda51233aa69b9d0c83a60  ./src/Palete/VapiParser.vala
+d19d498e7709fb8c9a39465a6e64ef4e  ./src/Palete/ValaSource.vala
+057a5bf7ddb3bdce1c032a2d6334109c  ./src/Palete/Roo.c
+f41ca8a737e50ed9a85d02e7cc6cf7e8  ./src/Palete/ValaSourceCompiler.vala
+caa831b61659ccfd4db5628015fe12f9  ./src/Palete/Gir.vala
+5ccf4a30083a52e1e1274ed69bc8cf98  ./src/Palete/Gir.c
+7ccea6bbb31bf0087da5dc7794fa38d7  ./src/Palete/Palete.c
+b0aed743a03ab341c9ea05c0f6aa2a07  ./src/Palete/Flutter.c
+76b0f9b6b1d79b8864bc309b8e59e4b6  ./src/Palete/CompletionProvider.c
+581fd21f70fd4084fd235284cd7d35ee  ./src/Palete/Gtk.vala
+91e2f33476f3df8c2cf2673f4550aa5f  ./src/Palete/Gtk.c
+1d5404639d887029ab380571e3aaf963  ./src/Palete/Palete.vala
+094a17ad6d135983c84ea91a4811354e  ./src/Palete/GirFile.vala
+a88233b9eb5e1ee7d8431003bf5b3212  ./src/Palete/GirObject.c
+075435f8e118605eb2889e1040591513  ./src/Palete/GirObject.vala
+e589490ee8ccd6b95b8e4d049db17de4  ./src/Palete/VapiParser.c
+2fcd8eab5b49e4a4bf5815f8e2b457c9  ./src/Palete/Javascript.vala
+9a55ce91b22b74690964eca8aa2d88fa  ./src/Palete/Javascript.c
+74e61bf448fbfe17f950130f4ed19708  ./src/Palete/Roo.vala
+0b5bb5eb10e37cf4b262ed24eb26c771  ./src/Palete/ValaSource.c
+bd26d0e4e8f61f2f74044ccfcc32b19d  ./src/Palete/RooDatabase.c
+217ae3377b326521a86b434657f5f8db  ./src/Project/Flutter.vala
+a1dfdf1a841a3c6b93df7d912cc39ec1  ./src/Project/Roo.c
+2a64befaee5f8a3ca707a23af2c4ea21  ./src/Project/Flutter.c
+aa78cf21db9316718affb2775f24a30f  ./src/Project/Project.vala
+b3064aad4efb16fba5ef720ddd1e5bd5  ./src/Project/Gtk.vala
+ff62d2b62b9f9ce77a6dc5eb3b67f879  ./src/Project/Gtk.c
+a9098fd82b26aafc388d755863233436  ./src/Project/Project.c
+5ab57539900a47c67ee131246dd5ad83  ./src/Project/Roo.vala
+f7848e4f204c76e6ecef12cd266457bd  ./src/Resources.vala
+c500cd3a11de508932df990dc4a90e03  ./src/JsRender/JsRender.c
+23a5a4cee54cb098913f4963565b3405  ./src/JsRender/NodeToJs.c
+3463fa4065b0a0e0d4e1a10a7337ad79  ./src/JsRender/Flutter.vala
+c13e885cb9c5d005596d16fba3c47fa8  ./src/JsRender/Lang.vala
+288bd9a3fda1f4200b8a9096bc44dea4  ./src/JsRender/NodeToVala.vala
+42598d76a0e67353b743eb64e678927f  ./src/JsRender/NodeToGlade.vala
+c4644cc113a7785eb8d4a6cd314fa384  ./src/JsRender/Roo.c
+cca8742ee92c401d1d773f69cec0310d  ./src/JsRender/Flutter.c
+795386e67345b780edaa1ee7c6ab76bd  ./src/JsRender/.deps/NodeToGlade.Po
+570afee9030bd29d2bd527792a683427  ./src/JsRender/Node.vala
+412a4a5d4c8546682e1c1d16ec34c158  ./src/JsRender/NodeToGtk.c
+4e62ef7f135b4e584b8ad7323e191580  ./src/JsRender/PlainFile.c
+48beb4f76709fdd459c3becc85a23522  ./src/JsRender/Gtk.vala
+6943b34ed483aff73c1782b8f67abe24  ./src/JsRender/Gtk.c
+0d2aea902b7b7ea329bf8f5a94be4f19  ./src/JsRender/NodeToJs.vala
+5bd3885eed20e3db5b50182e73e96486  ./src/JsRender/NodeToGtk.vala
+7f055e60d2c6cf048eb76d95efdf324d  ./src/JsRender/NodeToVala.c
+aa81c2be70eef717f866f7befd9c4ca6  ./src/JsRender/Node.c
+3a35080221d45b86345f4c13cb507d47  ./src/JsRender/JsRender.vala
+fc35bec99bdbb9866d3284eecba161cf  ./src/JsRender/PlainFile.vala
+66abdb6c4667f431e3b7f402bd78de3b  ./src/JsRender/NodeToGlade.c
+b0e058351254b968e8ecd242732f144b  ./src/JsRender/Lang.c
+6733448aa8ea872c16f7ada96f872670  ./src/JsRender/Roo.vala
+cd8431c45757810084dd256b824fb8bc  ./src/Makefile.in
+4ce5bbec19fa1c9ebdb13e7e77e0ed5a  ./src/Application.vala
+7092d3be746731ffe05b0b33be8dac75  ./src/Spawn.vala
+700806e5f5f7e6aa79613173c3d57f5d  ./src/vapi/webkit2gtk-3.0.vapi
+659a69a8dee9ae4f08593f514effd91f  ./src/vapi/javascriptcore.vapi
+747b7b8e9902de789177be05f50c060c  ./src/vapi/gladeui-2.0.vapi
+68cfd3e90ce15ba9dad4b7b37504f875  ./src/vapi/libgda-5.0.vapi
+1352f995b6afaa2b853dc7c0154c7b7a  ./src/vapi/test-old/clutter-1.0.vapi
+446a9caaaef7130e2dec0abacc227807  ./src/vapi/test-old/clutter-1.0.deps
+0350c769f8ba1ac10db7ccee1133fb2c  ./src/vapi/libgda-4.0.vapi
+4ac1d8541498d9e18e485f4fd9205377  ./src/vapi/webkit2gtk-4.0.vapi
+f89c0f1eef0e7c248bfe480e96439ccc  ./src/vapi/gobject-introspection-1.0.vapi
+7c0fd34de7d495cebaee5c7c5e2ed1ac  ./src/vapi/libgda-5.0.deps
+7c0fd34de7d495cebaee5c7c5e2ed1ac  ./src/vapi/libgda-4.0.deps
+a7fef8cb9bd957f2b1bb09dd5d6e5251  ./src/vapi/seed.vapi
+c798806bb294207506bbb4048b7fd5c5  ./src/Makefile.am
+38dbe56a5dded4eb2b849e1859efb18b  ./config.h.in~
+eda3c072d9f068dd891ea0986963e871  ./.gitignore
+f9352a0655e7e3060fd3a24d5f78f190  ./README.md
+959bffe2993816eb32ec4bc1ec1d5875  ./LICENSE
+91a2cbdb18360e2e8fcaec1f0f35e278  ./autom4te.cache/requests
+0f986d44210396ed4464e798b1d5ce9b  ./autom4te.cache/traces.1
+a6bd103f0a602aa369a1516f06b64440  ./autom4te.cache/output.1
+8b50b636c4e8c56a158ecfe01edb39ba  ./autom4te.cache/traces.0
+a6bd103f0a602aa369a1516f06b64440  ./autom4te.cache/output.0
+d32239bcb673463ab874e80d47fae504  ./COPYING
+94b2b1ed19e0f30985e5b242f5b92e7d  ./README.txt
+e194375eb17ee97cc2db1c3e680412a3  ./INSTALL.txt
+234ae97ddd94d5596656997f26bdd94a  ./AUTHORS
+e93be940bda9805b18b8ca846d2de2a3  ./resources/mailer.builder.html
+1a7782784d67a90e2ae208fcb4201c96  ./resources/RooUsage.txt
+372ddbd7adb4dc8a7088a619edfa0f29  ./resources/Editors/Editor.Roo.LayoutDialog.bjs
+d0f1f79d3446882d9deec05b74b41d7d  ./resources/Editors/Editor.Roo.GridPanel.bjs
+bcf4e7e1d446bd0d28964e4d36c29ea3  ./resources/Editors/Editor.Roo.GridPanel.js
+4e81e520cb233ace7f9ff17f2990277f  ./resources/Editors/Editor.Roo.LayoutDialog.js
+a9117200c74bc72db6d5c9f8a1ce5815  ./resources/Gir.overides
+f72e9f9fdb220731ee1c3ffe08a536fd  ./resources/bootstrap.builder.html
+bbc8301b56a86029440348e200099c6a  ./resources/roo.builder.js
+43132ba4eba80eb9372676e2db556fd4  ./resources/GtkUsage.txt
+8dcc309c476908ddf5eb918da5dc693c  ./resources/roo.builder.html
+ba4d941cf15b1a233f7e43a846b7eaef  ./configure.ac
+17382ef7b74816c91ee84c6544a6cefc  ./tools/flutter_sqlite.php
+a04cee5026068c7834e137a397601b7b  ./tools/flutter_extract.php
+8e994154f15ad797670a43a0d95ec053  ./tools/flutter_nodes.php
+38dbe56a5dded4eb2b849e1859efb18b  ./config.h.in
+07d430ce5391076acebaa0df9b53c740  ./config1.builder
+f5330c9945d9d4614b980c7ae34bc64c  ./Makefile.am
+28e27b0082703426127843fe36c96cc0  ./compile
+ff06331c3f16a2d526d6399dfeabf67a  ./missing
+615bc412455420ecc37d3c288b60a518  ./autogen.sh
+f2766448e74c24bd1c1c5d12466093ae  ./INSTALL
+e5f9da8b55623ead67f2bcfee03fb4d4  ./depcomp
+8fe4d7396ce59f473126cfaa971bb078  ./pixmaps/32x32/apps/roobuilder.png
+59c13b531a926680fd6ab056e52caa4b  ./pixmaps/Makefile.in
+8fe4d7396ce59f473126cfaa971bb078  ./pixmaps/22x22/apps/roobuilder.png
+8fe4d7396ce59f473126cfaa971bb078  ./pixmaps/48x48/apps/roobuilder.png
+8fe4d7396ce59f473126cfaa971bb078  ./pixmaps/16x16/apps/roobuilder.png
+93526bdbc7e5a3030f59bc53c8f48030  ./pixmaps/Makefile.am
+8fe4d7396ce59f473126cfaa971bb078  ./pixmaps/24x24/apps/roobuilder.png
+fa24c0fa97285945d72d7118b0994050  ./configure
+95f5dbbfa807632edadf7e2a12f46142  ./aclocal.m4
+0d3a87501b8bdddc6c10720883d8f0af  ./org.roojs.roobuilder.json
diff --git a/debian/autoreconf.before b/debian/autoreconf.before
new file mode 100644 (file)
index 0000000..059e7c2
--- /dev/null
@@ -0,0 +1,206 @@
+6eea1cef1a961dc5c2ef097725c8132b  ./roobuilder.desktop
+1347d659e83304654e25bcc1f65c9199  ./NEWS
+b991e5e96350ca96b2495eb33a13ceb9  ./README
+5db3cf4d791f482908f0f4a158794ba0  ./notes/flutter.txt
+d41d8cd98f00b204e9800998ecf8427e  ./ChangeLog
+dc2a3bd2e90ea29308069119e150d84c  ./src/c/jscore_object_call_as_function.c
+2c88d5ad89ce40f359e8414bfd040e45  ./src/Main.vala
+437f6610203214a814dc36114bb7b437  ./src/Builder4/WindowRooView.bjs
+7272e7972a83347b82448b2b06096e8c  ./src/Builder4/Editor.c
+9ab1eabf13565763ada54b9a7f0b5912  ./src/Builder4/DialogTemplateSelect.bjs
+70800a190a8949d7e047426fdd369747  ./src/Builder4/ProjectSettings.bjs
+f5dc979d81e74ab04bc3c900cf9156b3  ./src/Builder4/WindowLeftProps.c
+254a8daff9072d59e32f03113d02e429  ./src/Builder4/DialogTemplateSelect.vala
+c5ef3fde1b376ea73b1006e3d669edb7  ./src/Builder4/ClutterFiles.bjs
+189bc983b2dc0403b5aba0e4a609216b  ./src/Builder4/RooProjectSettings.bjs
+c2bb7577fb27ec3cef054511b0522bcd  ./src/Builder4/DialogConfirm.c
+e09dd27e29d115acecd768c13efc7633  ./src/Builder4/WindowLeftProjects.vala
+4f275dc627f27b9cf7ee985f75f0d565  ./src/Builder4/WindowLeftProjects.c
+edc8430ca864508d07046aa44624ab22  ./src/Builder4/ProjectSettings.c
+de51165527299a2c386ca4da85454b05  ./src/Builder4/ValaCompileErrors.bjs
+068e65d2956ba1ffa4261d7fcaf23a9b  ./src/Builder4/WindowAddProp.c
+94f3a77a9014c646b2b47f207378126a  ./src/Builder4/WindowLeftTree.c
+b4637d799b5e74ac3688fdaac268c8cd  ./src/Builder4/ValaCompileResults.bjs
+bcbd703da89ceddaf872c411a4c7c6ea  ./src/Builder4/WindowState.c
+8885b520fec55e22d24df7035d93e2ae  ./src/Builder4/WindowLeftTree.bjs
+4b3ca347619a75423add229246d6934b  ./src/Builder4/ValaProjectSettings.c
+0bc9d997eb1a281f42785b779ff7162d  ./src/Builder4/GtkView.bjs
+4f146ffda5805206cf3fc30c41c9bb24  ./src/Builder4/DialogSaveTemplate.bjs
+082c8b2506b9475913ed023cef26dcba  ./src/Builder4/StandardErrorDialog.c
+01f94aae4ea0d5d9b6b56f34fa5f79f4  ./src/Builder4/DialogConfirm.vala
+012a185febbfda70c1e6f47122ce6cd0  ./src/Builder4/FakeServer.c
+2ce7c191c666149680726970ebfdd655  ./src/Builder4/PopoverProperty.vala
+a927514d7a5725861a523749559447a2  ./src/Builder4/MainWindow.vala
+9005b8b5550eeff5287f8d95cd54a030  ./src/Builder4/Editor.bjs
+a755a32cc8adae70223cf843e849cc11  ./src/Builder4/ValaCompileErrors.c
+d6f4ffc749087a615b6084cefeaf0987  ./src/Builder4/PopoverFileDetails.bjs
+c9b5314660024b98a92708a49325d0f4  ./src/Builder4/ValaProjectSettings.vala
+adeacc7dd66841599cda89216128060a  ./src/Builder4/ValaCompileResults.c
+b0b017c153127530146f16d8cf6c1da9  ./src/Builder4/FakeServer.vala
+224ba6d82948ea5089d9da64f2a35502  ./src/Builder4/PopoverProperty.c
+cdf6b9e2b975731ea6a358d1b80910cc  ./src/Builder4/WindowRightPalete.c
+215dadaf4cf4d649e9010beb4103ab41  ./src/Builder4/Editor.vala
+98410f02491be156d42a51c73b20d849  ./src/Builder4/DialogSaveModule.vala
+991eba8f43356da1547fb636a6aa3f3e  ./src/Builder4/WindowRightPalete.bjs
+1fc179baf6dce16840371f35d4b2f659  ./src/Builder4/EditProject.vala
+3cd8ea2fb7f65354e434b4681d22cf63  ./src/Builder4/WindowRooView.vala
+b5e47df8732d6dce9766fcf3a077d56b  ./src/Builder4/PopoverFileDetails.c
+f97678a1fc03a8f6d3350f4bbf5bbced  ./src/Builder4/WindowLeftProjects.bjs
+6278ccc0f64f5c2757895aacda602251  ./src/Builder4/CompileState.vala
+6122186210519e090be762452501721b  ./src/Builder4/GtkView.c
+8d3de0f75a2c7a448a1356dce17a8d23  ./src/Builder4/WindowState.vala
+ce71c422abff3cc9fab85e082758417f  ./src/Builder4/EditProject.c
+3240de25cec411f70a664d60a863a5bf  ./src/Builder4/.deps/ValaProjectSettings.Po
+eac560ca8d937023d780ae709733ee95  ./src/Builder4/.deps/ProjectSettings.Po
+9e1a8765021308ba8f73802d9897224d  ./src/Builder4/ValaCompileResults.vala
+4f55a16a3c362bf5cb07cca9fe3d07aa  ./src/Builder4/About.bjs
+cbbda6c2c27159717513bd3b77066252  ./src/Builder4/DialogSaveTemplate.vala
+fd611a15189da35ea6473d62d27ccf89  ./src/Builder4/ValaProjectSettings.bjs
+b5a357fc8cb9f019b387d5da68799d6e  ./src/Builder4/WindowAddProp.bjs
+dd2c826f5916481994b8f05060e38561  ./src/Builder4/PopoverFileDetails.vala
+1d5c2aaecfb07b255ee7b55bbeb28b94  ./src/Builder4/GladeView.bjs
+dcf242bff22c4c817bc7ee67bd88a1ce  ./src/Builder4/PopoverProperty.bjs
+48da45963803c1c3ac9a3b7b25335ef5  ./src/Builder4/StandardErrorDialog.vala
+ec30fd67d2234631eff16e8cfca3b930  ./src/Builder4/ClutterFiles.c
+654440c2f4e05ed6b4b83860261246ee  ./src/Builder4/WindowLeftProps.vala
+15a0e9b11f4f9dfc8ff4cdb9a0c8f7af  ./src/Builder4/WindowRightPalete.vala
+a6d4c79785530fddc067d050b508c5c6  ./src/Builder4/GladeView.vala
+0aed6f6d1867b8191b565e8fb8d44760  ./src/Builder4/About.vala
+a3102786032699989c21897d8ab47464  ./src/Builder4/ClutterFiles.vala
+6cd0d8e30e1f09056d312997ee79d19b  ./src/Builder4/WindowAddProp.vala
+d5cacc76623a955e58cc149ae16c92ed  ./src/Builder4/MainWindow.bjs
+3fcd0fabe94561a2b70f399e217a7fb3  ./src/Builder4/DialogSaveTemplate.c
+1d5825633e811a1dda8727fa2fa5056d  ./src/Builder4/EditProject.bjs
+c37d5d443138bd1563e0e698b8610570  ./src/Builder4/WindowLeftProps.bjs
+9273edb5b24f4d231a672609f4d10f72  ./src/Builder4/GtkView.vala
+fa525dc2730059a4acf269ecc056438c  ./src/Builder4/WindowLeftTree.vala
+05bcd8817a6e30e5902c651e026e9485  ./src/Builder4/GladeExtras.vala
+5cb20f952a96b0162253c5496ed2bc0a  ./src/Builder4/DialogConfirm.bjs
+184408c7dc96918ebd93f4e687236bb6  ./src/Builder4/About.c
+4f50a2f48cdba1c5d9c4ec0e9cb0543b  ./src/Builder4/DialogNewComponent.c
+f5abeefbed7d8439d841b8eea1098ee0  ./src/Builder4/ValaCompileErrors.vala
+372d3a7d2e3792715ab89f2bb3831388  ./src/Builder4/StandardErrorDialog.bjs
+05486cb40599ea0075d3dc4e65120e78  ./src/Builder4/ValaProjectSettingsPopover.bjs
+aad50720ee14dd0ef5e7a60721833677  ./src/Builder4/ValaProjectSettingsPopover.c
+7a12ce5a0039fbfdd4744b1cf79379fe  ./src/Builder4/DialogPluginWebkit.c
+e1798d5a4a585db6006d63e4ff3b4cee  ./src/Builder4/DialogTemplateSelect.c
+5ead2660becb78a5eb4fd8bfd5e1cc69  ./src/Builder4/config1.builder
+e43ad6bdc45bd4537e63484485f354df  ./src/Builder4/MainWindow.c
+c2eb8daa2916479455d30808eedd103e  ./src/Builder4/DialogNewComponent.vala
+40989c636c2d81e95a9087300a6439f1  ./src/Builder4/DialogNewComponent.bjs
+b24d48781f2c87d7e1f2323d18a2b042  ./src/Builder4/ValaProjectSettingsPopover.vala
+87a5712c433a6ba725c5ead9a49b635e  ./src/Builder4/DialogSaveModule.c
+b70433ba324a8fb409703a195e4d90a4  ./src/Builder4/RooProjectSettings.c
+eb127adf198003d608837c990fb5a73d  ./src/Builder4/WindowRooView.c
+1f587a243cd750b83a861392add1d4e6  ./src/Builder4/DialogPluginWebkit.bjs
+885fc466b28ef592476dc060b0ec8148  ./src/Builder4/ProjectSettings.vala
+ff780fedae19e2780a259375966af977  ./src/Builder4/RooProjectSettings.vala
+898e2fc7aba201e1b3c6c5b3d8e3b7a2  ./src/Builder4/DialogSaveModule.bjs
+5b733e38e79a7c9525ac5269225fc9ab  ./src/Builder4/DialogPluginWebkit.vala
+8f97e7575b7a283a47ff5825d32ba7d0  ./src/Palete/ValaSourceCompiler.c
+7b35a871bfb84e6c46b2070249d122ce  ./src/Palete/CompletionProvider.vala
+9fa897f76b56755cca3e98dbf3530770  ./src/Palete/Flutter.vala
+ea0059f1957b5e6b17ca448dad6191c6  ./src/Palete/RooDatabase.vala
+3390066e59fda51233aa69b9d0c83a60  ./src/Palete/VapiParser.vala
+d19d498e7709fb8c9a39465a6e64ef4e  ./src/Palete/ValaSource.vala
+057a5bf7ddb3bdce1c032a2d6334109c  ./src/Palete/Roo.c
+f41ca8a737e50ed9a85d02e7cc6cf7e8  ./src/Palete/ValaSourceCompiler.vala
+caa831b61659ccfd4db5628015fe12f9  ./src/Palete/Gir.vala
+5ccf4a30083a52e1e1274ed69bc8cf98  ./src/Palete/Gir.c
+7ccea6bbb31bf0087da5dc7794fa38d7  ./src/Palete/Palete.c
+b0aed743a03ab341c9ea05c0f6aa2a07  ./src/Palete/Flutter.c
+76b0f9b6b1d79b8864bc309b8e59e4b6  ./src/Palete/CompletionProvider.c
+581fd21f70fd4084fd235284cd7d35ee  ./src/Palete/Gtk.vala
+91e2f33476f3df8c2cf2673f4550aa5f  ./src/Palete/Gtk.c
+1d5404639d887029ab380571e3aaf963  ./src/Palete/Palete.vala
+094a17ad6d135983c84ea91a4811354e  ./src/Palete/GirFile.vala
+a88233b9eb5e1ee7d8431003bf5b3212  ./src/Palete/GirObject.c
+075435f8e118605eb2889e1040591513  ./src/Palete/GirObject.vala
+e589490ee8ccd6b95b8e4d049db17de4  ./src/Palete/VapiParser.c
+2fcd8eab5b49e4a4bf5815f8e2b457c9  ./src/Palete/Javascript.vala
+9a55ce91b22b74690964eca8aa2d88fa  ./src/Palete/Javascript.c
+74e61bf448fbfe17f950130f4ed19708  ./src/Palete/Roo.vala
+0b5bb5eb10e37cf4b262ed24eb26c771  ./src/Palete/ValaSource.c
+bd26d0e4e8f61f2f74044ccfcc32b19d  ./src/Palete/RooDatabase.c
+217ae3377b326521a86b434657f5f8db  ./src/Project/Flutter.vala
+a1dfdf1a841a3c6b93df7d912cc39ec1  ./src/Project/Roo.c
+2a64befaee5f8a3ca707a23af2c4ea21  ./src/Project/Flutter.c
+aa78cf21db9316718affb2775f24a30f  ./src/Project/Project.vala
+b3064aad4efb16fba5ef720ddd1e5bd5  ./src/Project/Gtk.vala
+ff62d2b62b9f9ce77a6dc5eb3b67f879  ./src/Project/Gtk.c
+a9098fd82b26aafc388d755863233436  ./src/Project/Project.c
+5ab57539900a47c67ee131246dd5ad83  ./src/Project/Roo.vala
+f7848e4f204c76e6ecef12cd266457bd  ./src/Resources.vala
+c500cd3a11de508932df990dc4a90e03  ./src/JsRender/JsRender.c
+23a5a4cee54cb098913f4963565b3405  ./src/JsRender/NodeToJs.c
+3463fa4065b0a0e0d4e1a10a7337ad79  ./src/JsRender/Flutter.vala
+c13e885cb9c5d005596d16fba3c47fa8  ./src/JsRender/Lang.vala
+288bd9a3fda1f4200b8a9096bc44dea4  ./src/JsRender/NodeToVala.vala
+42598d76a0e67353b743eb64e678927f  ./src/JsRender/NodeToGlade.vala
+c4644cc113a7785eb8d4a6cd314fa384  ./src/JsRender/Roo.c
+cca8742ee92c401d1d773f69cec0310d  ./src/JsRender/Flutter.c
+795386e67345b780edaa1ee7c6ab76bd  ./src/JsRender/.deps/NodeToGlade.Po
+570afee9030bd29d2bd527792a683427  ./src/JsRender/Node.vala
+412a4a5d4c8546682e1c1d16ec34c158  ./src/JsRender/NodeToGtk.c
+4e62ef7f135b4e584b8ad7323e191580  ./src/JsRender/PlainFile.c
+48beb4f76709fdd459c3becc85a23522  ./src/JsRender/Gtk.vala
+6943b34ed483aff73c1782b8f67abe24  ./src/JsRender/Gtk.c
+0d2aea902b7b7ea329bf8f5a94be4f19  ./src/JsRender/NodeToJs.vala
+5bd3885eed20e3db5b50182e73e96486  ./src/JsRender/NodeToGtk.vala
+7f055e60d2c6cf048eb76d95efdf324d  ./src/JsRender/NodeToVala.c
+aa81c2be70eef717f866f7befd9c4ca6  ./src/JsRender/Node.c
+3a35080221d45b86345f4c13cb507d47  ./src/JsRender/JsRender.vala
+fc35bec99bdbb9866d3284eecba161cf  ./src/JsRender/PlainFile.vala
+66abdb6c4667f431e3b7f402bd78de3b  ./src/JsRender/NodeToGlade.c
+b0e058351254b968e8ecd242732f144b  ./src/JsRender/Lang.c
+6733448aa8ea872c16f7ada96f872670  ./src/JsRender/Roo.vala
+4ce5bbec19fa1c9ebdb13e7e77e0ed5a  ./src/Application.vala
+7092d3be746731ffe05b0b33be8dac75  ./src/Spawn.vala
+700806e5f5f7e6aa79613173c3d57f5d  ./src/vapi/webkit2gtk-3.0.vapi
+659a69a8dee9ae4f08593f514effd91f  ./src/vapi/javascriptcore.vapi
+747b7b8e9902de789177be05f50c060c  ./src/vapi/gladeui-2.0.vapi
+68cfd3e90ce15ba9dad4b7b37504f875  ./src/vapi/libgda-5.0.vapi
+1352f995b6afaa2b853dc7c0154c7b7a  ./src/vapi/test-old/clutter-1.0.vapi
+446a9caaaef7130e2dec0abacc227807  ./src/vapi/test-old/clutter-1.0.deps
+0350c769f8ba1ac10db7ccee1133fb2c  ./src/vapi/libgda-4.0.vapi
+4ac1d8541498d9e18e485f4fd9205377  ./src/vapi/webkit2gtk-4.0.vapi
+f89c0f1eef0e7c248bfe480e96439ccc  ./src/vapi/gobject-introspection-1.0.vapi
+7c0fd34de7d495cebaee5c7c5e2ed1ac  ./src/vapi/libgda-5.0.deps
+7c0fd34de7d495cebaee5c7c5e2ed1ac  ./src/vapi/libgda-4.0.deps
+a7fef8cb9bd957f2b1bb09dd5d6e5251  ./src/vapi/seed.vapi
+c798806bb294207506bbb4048b7fd5c5  ./src/Makefile.am
+eda3c072d9f068dd891ea0986963e871  ./.gitignore
+f9352a0655e7e3060fd3a24d5f78f190  ./README.md
+959bffe2993816eb32ec4bc1ec1d5875  ./LICENSE
+d32239bcb673463ab874e80d47fae504  ./COPYING
+94b2b1ed19e0f30985e5b242f5b92e7d  ./README.txt
+e194375eb17ee97cc2db1c3e680412a3  ./INSTALL.txt
+234ae97ddd94d5596656997f26bdd94a  ./AUTHORS
+e93be940bda9805b18b8ca846d2de2a3  ./resources/mailer.builder.html
+1a7782784d67a90e2ae208fcb4201c96  ./resources/RooUsage.txt
+372ddbd7adb4dc8a7088a619edfa0f29  ./resources/Editors/Editor.Roo.LayoutDialog.bjs
+d0f1f79d3446882d9deec05b74b41d7d  ./resources/Editors/Editor.Roo.GridPanel.bjs
+bcf4e7e1d446bd0d28964e4d36c29ea3  ./resources/Editors/Editor.Roo.GridPanel.js
+4e81e520cb233ace7f9ff17f2990277f  ./resources/Editors/Editor.Roo.LayoutDialog.js
+a9117200c74bc72db6d5c9f8a1ce5815  ./resources/Gir.overides
+f72e9f9fdb220731ee1c3ffe08a536fd  ./resources/bootstrap.builder.html
+bbc8301b56a86029440348e200099c6a  ./resources/roo.builder.js
+43132ba4eba80eb9372676e2db556fd4  ./resources/GtkUsage.txt
+8dcc309c476908ddf5eb918da5dc693c  ./resources/roo.builder.html
+ba4d941cf15b1a233f7e43a846b7eaef  ./configure.ac
+17382ef7b74816c91ee84c6544a6cefc  ./tools/flutter_sqlite.php
+a04cee5026068c7834e137a397601b7b  ./tools/flutter_extract.php
+8e994154f15ad797670a43a0d95ec053  ./tools/flutter_nodes.php
+38dbe56a5dded4eb2b849e1859efb18b  ./config.h.in
+07d430ce5391076acebaa0df9b53c740  ./config1.builder
+f5330c9945d9d4614b980c7ae34bc64c  ./Makefile.am
+615bc412455420ecc37d3c288b60a518  ./autogen.sh
+8fe4d7396ce59f473126cfaa971bb078  ./pixmaps/32x32/apps/roobuilder.png
+59c13b531a926680fd6ab056e52caa4b  ./pixmaps/Makefile.in
+8fe4d7396ce59f473126cfaa971bb078  ./pixmaps/22x22/apps/roobuilder.png
+8fe4d7396ce59f473126cfaa971bb078  ./pixmaps/48x48/apps/roobuilder.png
+8fe4d7396ce59f473126cfaa971bb078  ./pixmaps/16x16/apps/roobuilder.png
+93526bdbc7e5a3030f59bc53c8f48030  ./pixmaps/Makefile.am
+8fe4d7396ce59f473126cfaa971bb078  ./pixmaps/24x24/apps/roobuilder.png
+95f5dbbfa807632edadf7e2a12f46142  ./aclocal.m4
+0d3a87501b8bdddc6c10720883d8f0af  ./org.roojs.roobuilder.json
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..4b654d8
--- /dev/null
@@ -0,0 +1,5 @@
+roobuilder (4.0.0) unstable; urgency=medium
+
+  * Initial Release.
+
+ -- Alan <alan@roojs.com>  Thu, 16 May 2019 17:47:00 +0800
diff --git a/debian/compat b/debian/compat
new file mode 100644 (file)
index 0000000..b4de394
--- /dev/null
@@ -0,0 +1 @@
+11
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..e28ae0d
--- /dev/null
@@ -0,0 +1,15 @@
+Source: roobuilder
+Section: unknown
+Priority: optional
+Maintainer: Alan <alan@roojs.com>
+Build-Depends: debhelper (>= 11), autotools-dev
+Standards-Version: 4.1.3
+Homepage: <insert the upstream URL, if relevant>
+#Vcs-Browser: https://salsa.debian.org/debian/roobuilder
+#Vcs-Git: https://salsa.debian.org/debian/roobuilder.git
+
+Package: roobuilder
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: <insert up to 60 chars description>
+ <insert long description, indented with spaces>
diff --git a/debian/copyright b/debian/copyright
new file mode 100644 (file)
index 0000000..d21a951
--- /dev/null
@@ -0,0 +1,34 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: roobuilder
+Source: <url://example.com>
+
+Files: *
+Copyright: <years> <put author's name and email here>
+           <years> <likewise for another author>
+License: GPL-3.0+
+
+Files: debian/*
+Copyright: 2019 Alan <alan@roojs.com>
+License: GPL-3.0+
+
+License: GPL-3.0+
+ 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 3 of the License, or
+ (at your option) any later version.
+ .
+ This package 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. If not, see <https://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU General
+ Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
+
+# Please also look if there are files or directories which have a
+# different copyright/license attached and list them here.
+# Please avoid picking licenses with terms that are more restrictive than the
+# packaged work, as it may make Debian's contributions unacceptable upstream.
diff --git a/debian/debhelper-build-stamp b/debian/debhelper-build-stamp
new file mode 100644 (file)
index 0000000..01b6105
--- /dev/null
@@ -0,0 +1 @@
+roobuilder
diff --git a/debian/files b/debian/files
new file mode 100644 (file)
index 0000000..095cc2c
--- /dev/null
@@ -0,0 +1,3 @@
+roobuilder-dbgsym_4.0.0_amd64.ddeb debug optional
+roobuilder_4.0.0_amd64.buildinfo unknown optional
+roobuilder_4.0.0_amd64.deb unknown optional
diff --git a/debian/manpage.1.ex b/debian/manpage.1.ex
new file mode 100644 (file)
index 0000000..32e3b18
--- /dev/null
@@ -0,0 +1,56 @@
+.\"                                      Hey, EMACS: -*- nroff -*-
+.\" (C) Copyright 2019 Alan <alan@roojs.com>,
+.\"
+.\" First parameter, NAME, should be all caps
+.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
+.\" other parameters are allowed: see man(7), man(1)
+.TH Roobuilder SECTION "May 16 2019"
+.\" Please adjust this date whenever revising the manpage.
+.\"
+.\" Some roff macros, for reference:
+.\" .nh        disable hyphenation
+.\" .hy        enable hyphenation
+.\" .ad l      left justify
+.\" .ad b      justify to both left and right margins
+.\" .nf        disable filling
+.\" .fi        enable filling
+.\" .br        insert line break
+.\" .sp <n>    insert n+1 empty lines
+.\" for manpage-specific macros, see man(7)
+.SH NAME
+roobuilder \- program to do something
+.SH SYNOPSIS
+.B roobuilder
+.RI [ options ] " files" ...
+.br
+.B bar
+.RI [ options ] " files" ...
+.SH DESCRIPTION
+This manual page documents briefly the
+.B roobuilder
+and
+.B bar
+commands.
+.PP
+.\" TeX users may be more comfortable with the \fB<whatever>\fP and
+.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
+.\" respectively.
+\fBroobuilder\fP is a program that...
+.SH OPTIONS
+These programs follow the usual GNU command line syntax, with long
+options starting with two dashes (`-').
+A summary of options is included below.
+For a complete description, see the Info files.
+.TP
+.B \-h, \-\-help
+Show summary of options.
+.TP
+.B \-v, \-\-version
+Show version of program.
+.SH SEE ALSO
+.BR bar (1),
+.BR baz (1).
+.br
+The programs are documented fully by
+.IR "The Rise and Fall of a Fooish Bar" ,
+available via the Info system.
diff --git a/debian/manpage.sgml.ex b/debian/manpage.sgml.ex
new file mode 100644 (file)
index 0000000..8fd412c
--- /dev/null
@@ -0,0 +1,154 @@
+<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
+
+<!-- Process this file with docbook-to-man to generate an nroff manual
+     page: `docbook-to-man manpage.sgml > manpage.1'.  You may view
+     the manual page with: `docbook-to-man manpage.sgml | nroff -man |
+     less'.  A typical entry in a Makefile or Makefile.am is:
+
+manpage.1: manpage.sgml
+       docbook-to-man $< > $@
+
+
+       The docbook-to-man binary is found in the docbook-to-man package.
+       Please remember that if you create the nroff version in one of the
+       debian/rules file targets (such as build), you will need to include
+       docbook-to-man in your Build-Depends control field.
+
+  -->
+
+  <!-- Fill in your name for FIRSTNAME and SURNAME. -->
+  <!ENTITY dhfirstname "<firstname>FIRSTNAME</firstname>">
+  <!ENTITY dhsurname   "<surname>SURNAME</surname>">
+  <!-- Please adjust the date whenever revising the manpage. -->
+  <!ENTITY dhdate      "<date>May 16 2019</date>">
+  <!-- SECTION should be 1-8, maybe w/ subsection other parameters are
+       allowed: see man(7), man(1). -->
+  <!ENTITY dhsection   "<manvolnum>SECTION</manvolnum>">
+  <!ENTITY dhemail     "<email>alan@roojs.com</email>">
+  <!ENTITY dhusername  "Alan">
+  <!ENTITY dhucpackage "<refentrytitle>Roobuilder</refentrytitle>">
+  <!ENTITY dhpackage   "roobuilder">
+
+  <!ENTITY debian      "<productname>Debian</productname>">
+  <!ENTITY gnu         "<acronym>GNU</acronym>">
+  <!ENTITY gpl         "&gnu; <acronym>GPL</acronym>">
+]>
+
+<refentry>
+  <refentryinfo>
+    <address>
+      &dhemail;
+    </address>
+    <author>
+      &dhfirstname;
+      &dhsurname;
+    </author>
+    <copyright>
+      <year>2003</year>
+      <holder>&dhusername;</holder>
+    </copyright>
+    &dhdate;
+  </refentryinfo>
+  <refmeta>
+    &dhucpackage;
+
+    &dhsection;
+  </refmeta>
+  <refnamediv>
+    <refname>&dhpackage;</refname>
+
+    <refpurpose>program to do something</refpurpose>
+  </refnamediv>
+  <refsynopsisdiv>
+    <cmdsynopsis>
+      <command>&dhpackage;</command>
+
+      <arg><option>-e <replaceable>this</replaceable></option></arg>
+
+      <arg><option>--example <replaceable>that</replaceable></option></arg>
+    </cmdsynopsis>
+  </refsynopsisdiv>
+  <refsect1>
+    <title>DESCRIPTION</title>
+
+    <para>This manual page documents briefly the
+      <command>&dhpackage;</command> and <command>bar</command>
+      commands.</para>
+
+    <para>This manual page was written for the &debian; distribution
+      because the original program does not have a manual page.
+      Instead, it has documentation in the &gnu;
+      <application>Info</application> format; see below.</para>
+
+    <para><command>&dhpackage;</command> is a program that...</para>
+
+  </refsect1>
+  <refsect1>
+    <title>OPTIONS</title>
+
+    <para>These programs follow the usual &gnu; command line syntax,
+      with long options starting with two dashes (`-').  A summary of
+      options is included below.  For a complete description, see the
+      <application>Info</application> files.</para>
+
+    <variablelist>
+      <varlistentry>
+        <term><option>-h</option>
+          <option>--help</option>
+        </term>
+        <listitem>
+          <para>Show summary of options.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-v</option>
+          <option>--version</option>
+        </term>
+        <listitem>
+          <para>Show version of program.</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+  </refsect1>
+  <refsect1>
+    <title>SEE ALSO</title>
+
+    <para>bar (1), baz (1).</para>
+
+    <para>The programs are documented fully by <citetitle>The Rise and
+      Fall of a Fooish Bar</citetitle> available via the
+      <application>Info</application> system.</para>
+  </refsect1>
+  <refsect1>
+    <title>AUTHOR</title>
+
+    <para>This manual page was written by &dhusername; &dhemail; for
+      the &debian; system (and may be used by others).  Permission is
+      granted to copy, distribute and/or modify this document under
+      the terms of the &gnu; General Public License, Version 2 any
+      later version published by the Free Software Foundation.
+    </para>
+    <para>
+      On Debian systems, the complete text of the GNU General Public
+      License can be found in /usr/share/common-licenses/GPL.
+    </para>
+
+  </refsect1>
+</refentry>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:2
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-default-dtd-file:nil
+sgml-exposed-tags:nil
+sgml-local-catalogs:nil
+sgml-local-ecat-files:nil
+End:
+-->
diff --git a/debian/manpage.xml.ex b/debian/manpage.xml.ex
new file mode 100644 (file)
index 0000000..ecd7561
--- /dev/null
@@ -0,0 +1,291 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+
+<!--
+
+`xsltproc -''-nonet \
+          -''-param man.charmap.use.subset "0" \
+          -''-param make.year.ranges "1" \
+          -''-param make.single.year.ranges "1" \
+          /usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl \
+          manpage.xml'
+
+A manual page <package>.<section> will be generated. You may view the
+manual page with: nroff -man <package>.<section> | less'. A typical entry
+in a Makefile or Makefile.am is:
+
+DB2MAN = /usr/share/sgml/docbook/stylesheet/xsl/docbook-xsl/manpages/docbook.xsl
+XP     = xsltproc -''-nonet -''-param man.charmap.use.subset "0"
+
+manpage.1: manpage.xml
+        $(XP) $(DB2MAN) $<
+
+The xsltproc binary is found in the xsltproc package. The XSL files are in
+docbook-xsl. A description of the parameters you can use can be found in the
+docbook-xsl-doc-* packages. Please remember that if you create the nroff
+version in one of the debian/rules file targets (such as build), you will need
+to include xsltproc and docbook-xsl in your Build-Depends control field.
+Alternatively use the xmlto command/package. That will also automatically
+pull in xsltproc and docbook-xsl.
+
+Notes for using docbook2x: docbook2x-man does not automatically create the
+AUTHOR(S) and COPYRIGHT sections. In this case, please add them manually as
+<refsect1> ... </refsect1>.
+
+To disable the automatic creation of the AUTHOR(S) and COPYRIGHT sections
+read /usr/share/doc/docbook-xsl/doc/manpages/authors.html. This file can be
+found in the docbook-xsl-doc-html package.
+
+Validation can be done using: `xmllint -''-noout -''-valid manpage.xml`
+
+General documentation about man-pages and man-page-formatting:
+man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/
+
+-->
+
+  <!-- Fill in your name for FIRSTNAME and SURNAME. -->
+  <!ENTITY dhfirstname "FIRSTNAME">
+  <!ENTITY dhsurname   "SURNAME">
+  <!-- dhusername could also be set to "&dhfirstname; &dhsurname;". -->
+  <!ENTITY dhusername  "Alan">
+  <!ENTITY dhemail     "alan@roojs.com">
+  <!-- SECTION should be 1-8, maybe w/ subsection other parameters are
+       allowed: see man(7), man(1) and
+       http://www.tldp.org/HOWTO/Man-Page/q2.html. -->
+  <!ENTITY dhsection   "SECTION">
+  <!-- TITLE should be something like "User commands" or similar (see
+       http://www.tldp.org/HOWTO/Man-Page/q2.html). -->
+  <!ENTITY dhtitle     "roobuilder User Manual">
+  <!ENTITY dhucpackage "Roobuilder">
+  <!ENTITY dhpackage   "roobuilder">
+]>
+
+<refentry>
+  <refentryinfo>
+    <title>&dhtitle;</title>
+    <productname>&dhpackage;</productname>
+    <authorgroup>
+      <author>
+       <firstname>&dhfirstname;</firstname>
+        <surname>&dhsurname;</surname>
+        <contrib>Wrote this manpage for the Debian system.</contrib>
+        <address>
+          <email>&dhemail;</email>
+        </address>
+      </author>
+    </authorgroup>
+    <copyright>
+      <year>2007</year>
+      <holder>&dhusername;</holder>
+    </copyright>
+    <legalnotice>
+      <para>This manual page was written for the Debian system
+        (and may be used by others).</para>
+      <para>Permission is granted to copy, distribute and/or modify this
+        document under the terms of the GNU General Public License,
+        Version 2 or (at your option) any later version published by
+        the Free Software Foundation.</para>
+      <para>On Debian systems, the complete text of the GNU General Public
+        License can be found in
+        <filename>/usr/share/common-licenses/GPL</filename>.</para>
+    </legalnotice>
+  </refentryinfo>
+  <refmeta>
+    <refentrytitle>&dhucpackage;</refentrytitle>
+    <manvolnum>&dhsection;</manvolnum>
+  </refmeta>
+  <refnamediv>
+    <refname>&dhpackage;</refname>
+    <refpurpose>program to do something</refpurpose>
+  </refnamediv>
+  <refsynopsisdiv>
+    <cmdsynopsis>
+      <command>&dhpackage;</command>
+      <!-- These are several examples, how syntaxes could look -->
+      <arg choice="plain"><option>-e <replaceable>this</replaceable></option></arg>
+      <arg choice="opt"><option>--example=<parameter>that</parameter></option></arg>
+      <arg choice="opt">
+        <group choice="req">
+          <arg choice="plain"><option>-e</option></arg>
+          <arg choice="plain"><option>--example</option></arg>
+        </group>
+        <replaceable class="option">this</replaceable>
+      </arg>
+      <arg choice="opt">
+        <group choice="req">
+          <arg choice="plain"><option>-e</option></arg>
+          <arg choice="plain"><option>--example</option></arg>
+        </group>
+        <group choice="req">
+          <arg choice="plain"><replaceable>this</replaceable></arg>
+          <arg choice="plain"><replaceable>that</replaceable></arg>
+        </group>
+      </arg>
+    </cmdsynopsis>
+    <cmdsynopsis>
+      <command>&dhpackage;</command>
+      <!-- Normally the help and version options make the programs stop
+           right after outputting the requested information. -->
+      <group choice="opt">
+        <arg choice="plain">
+          <group choice="req">
+            <arg choice="plain"><option>-h</option></arg>
+            <arg choice="plain"><option>--help</option></arg>
+          </group>
+        </arg>
+        <arg choice="plain">
+          <group choice="req">
+            <arg choice="plain"><option>-v</option></arg>
+            <arg choice="plain"><option>--version</option></arg>
+          </group>
+        </arg>
+      </group>
+    </cmdsynopsis>
+  </refsynopsisdiv>
+  <refsect1 id="description">
+    <title>DESCRIPTION</title>
+    <para>This manual page documents briefly the
+      <command>&dhpackage;</command> and <command>bar</command>
+      commands.</para>
+    <para>This manual page was written for the Debian distribution
+      because the original program does not have a manual page.
+      Instead, it has documentation in the GNU <citerefentry>
+        <refentrytitle>info</refentrytitle>
+        <manvolnum>1</manvolnum>
+      </citerefentry> format; see below.</para>
+    <para><command>&dhpackage;</command> is a program that...</para>
+  </refsect1>
+  <refsect1 id="options">
+    <title>OPTIONS</title>
+    <para>The program follows the usual GNU command line syntax,
+      with long options starting with two dashes (`-').  A summary of
+      options is included below.  For a complete description, see the
+      <citerefentry>
+        <refentrytitle>info</refentrytitle>
+        <manvolnum>1</manvolnum>
+      </citerefentry> files.</para>
+    <variablelist>
+      <!-- Use the variablelist.term.separator and the
+           variablelist.term.break.after parameters to
+           control the term elements. -->
+      <varlistentry>
+        <term><option>-e <replaceable>this</replaceable></option></term>
+        <term><option>--example=<replaceable>that</replaceable></option></term>
+        <listitem>
+          <para>Does this and that.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-h</option></term>
+        <term><option>--help</option></term>
+        <listitem>
+          <para>Show summary of options.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-v</option></term>
+        <term><option>--version</option></term>
+        <listitem>
+          <para>Show version of program.</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+  </refsect1>
+  <refsect1 id="files">
+    <title>FILES</title>
+    <variablelist>
+      <varlistentry>
+        <term><filename>/etc/foo.conf</filename></term>
+        <listitem>
+          <para>The system-wide configuration file to control the
+            behaviour of <application>&dhpackage;</application>. See
+            <citerefentry>
+              <refentrytitle>foo.conf</refentrytitle>
+              <manvolnum>5</manvolnum>
+            </citerefentry> for further details.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><filename>${HOME}/.foo.conf</filename></term>
+        <listitem>
+          <para>The per-user configuration file to control the
+             behaviour of <application>&dhpackage;</application>. See
+             <citerefentry>
+               <refentrytitle>foo.conf</refentrytitle>
+               <manvolnum>5</manvolnum>
+             </citerefentry> for further details.</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+  </refsect1>
+  <refsect1 id="environment">
+    <title>ENVIRONMENT</title>
+    <variablelist>
+      <varlistentry>
+        <term><envar>FOO_CONF</envar></term>
+        <listitem>
+          <para>If used, the defined file is used as configuration
+            file (see also <xref linkend="files"/>).</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+  </refsect1>
+  <refsect1 id="diagnostics">
+    <title>DIAGNOSTICS</title>
+    <para>The following diagnostics may be issued
+      on <filename class="devicefile">stderr</filename>:</para>
+    <variablelist>
+      <varlistentry>
+        <term><errortext>Bad configuration file. Exiting.</errortext></term>
+        <listitem>
+          <para>The configuration file seems to contain a broken configuration
+            line. Use the <option>--verbose</option> option, to get more info.
+          </para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+    <para><command>&dhpackage;</command> provides some return codes, that can
+      be used in scripts:</para>
+    <segmentedlist>
+      <segtitle>Code</segtitle>
+      <segtitle>Diagnostic</segtitle>
+      <seglistitem>
+        <seg><errorcode>0</errorcode></seg>
+        <seg>Program exited successfully.</seg>
+      </seglistitem>
+      <seglistitem>
+        <seg><errorcode>1</errorcode></seg>
+        <seg>The configuration file seems to be broken.</seg>
+      </seglistitem>
+    </segmentedlist>
+  </refsect1>
+  <refsect1 id="bugs">
+    <!-- Or use this section to tell about upstream BTS. -->
+    <title>BUGS</title>
+    <para>The program is currently limited to only work
+      with the <package>foobar</package> library.</para>
+    <para>The upstreams <acronym>BTS</acronym> can be found
+      at <ulink url="http://bugzilla.foo.tld"/>.</para>
+  </refsect1>
+  <refsect1 id="see_also">
+    <title>SEE ALSO</title>
+    <!-- In alpabetical order. -->
+    <para><citerefentry>
+        <refentrytitle>bar</refentrytitle>
+        <manvolnum>1</manvolnum>
+      </citerefentry>, <citerefentry>
+        <refentrytitle>baz</refentrytitle>
+        <manvolnum>1</manvolnum>
+      </citerefentry>, <citerefentry>
+        <refentrytitle>foo.conf</refentrytitle>
+        <manvolnum>5</manvolnum>
+      </citerefentry></para>
+    <para>The programs are documented fully by <citetitle>The Rise and
+      Fall of a Fooish Bar</citetitle> available via the <citerefentry>
+        <refentrytitle>info</refentrytitle>
+        <manvolnum>1</manvolnum>
+      </citerefentry> system.</para>
+  </refsect1>
+</refentry>
+
diff --git a/debian/menu.ex b/debian/menu.ex
new file mode 100644 (file)
index 0000000..d86daf9
--- /dev/null
@@ -0,0 +1,2 @@
+?package(roobuilder):needs="X11|text|vc|wm" section="Applications/see-menu-manual"\
+  title="roobuilder" command="/usr/bin/roobuilder"
diff --git a/debian/postinst.ex b/debian/postinst.ex
new file mode 100644 (file)
index 0000000..c22db8c
--- /dev/null
@@ -0,0 +1,39 @@
+#!/bin/sh
+# postinst script for roobuilder
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+#        * <postinst> `configure' <most-recently-configured-version>
+#        * <old-postinst> `abort-upgrade' <new version>
+#        * <conflictor's-postinst> `abort-remove' `in-favour' <package>
+#          <new-version>
+#        * <postinst> `abort-remove'
+#        * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
+#          <failed-install-package> <version> `removing'
+#          <conflicting-package> <version>
+# for details, see https://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+case "$1" in
+    configure)
+    ;;
+
+    abort-upgrade|abort-remove|abort-deconfigure)
+    ;;
+
+    *)
+        echo "postinst called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
diff --git a/debian/postrm.ex b/debian/postrm.ex
new file mode 100644 (file)
index 0000000..e138da4
--- /dev/null
@@ -0,0 +1,37 @@
+#!/bin/sh
+# postrm script for roobuilder
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+#        * <postrm> `remove'
+#        * <postrm> `purge'
+#        * <old-postrm> `upgrade' <new-version>
+#        * <new-postrm> `failed-upgrade' <old-version>
+#        * <new-postrm> `abort-install'
+#        * <new-postrm> `abort-install' <old-version>
+#        * <new-postrm> `abort-upgrade' <old-version>
+#        * <disappearer's-postrm> `disappear' <overwriter>
+#          <overwriter-version>
+# for details, see https://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+case "$1" in
+    purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
+    ;;
+
+    *)
+        echo "postrm called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
diff --git a/debian/preinst.ex b/debian/preinst.ex
new file mode 100644 (file)
index 0000000..5ac3b31
--- /dev/null
@@ -0,0 +1,35 @@
+#!/bin/sh
+# preinst script for roobuilder
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+#        * <new-preinst> `install'
+#        * <new-preinst> `install' <old-version>
+#        * <new-preinst> `upgrade' <old-version>
+#        * <old-preinst> `abort-upgrade' <new-version>
+# for details, see https://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+case "$1" in
+    install|upgrade)
+    ;;
+
+    abort-upgrade)
+    ;;
+
+    *)
+        echo "preinst called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
diff --git a/debian/prerm.ex b/debian/prerm.ex
new file mode 100644 (file)
index 0000000..dd15411
--- /dev/null
@@ -0,0 +1,38 @@
+#!/bin/sh
+# prerm script for roobuilder
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+#        * <prerm> `remove'
+#        * <old-prerm> `upgrade' <new-version>
+#        * <new-prerm> `failed-upgrade' <old-version>
+#        * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
+#        * <deconfigured's-prerm> `deconfigure' `in-favour'
+#          <package-being-installed> <version> `removing'
+#          <conflicting-package> <version>
+# for details, see https://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+case "$1" in
+    remove|upgrade|deconfigure)
+    ;;
+
+    failed-upgrade)
+    ;;
+
+    *)
+        echo "prerm called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
diff --git a/debian/roobuilder-docs.docs b/debian/roobuilder-docs.docs
new file mode 100644 (file)
index 0000000..d6341a0
--- /dev/null
@@ -0,0 +1,3 @@
+README.source
+README
+README.Debian
diff --git a/debian/roobuilder.cron.d.ex b/debian/roobuilder.cron.d.ex
new file mode 100644 (file)
index 0000000..93d2f75
--- /dev/null
@@ -0,0 +1,4 @@
+#
+# Regular cron jobs for the roobuilder package
+#
+0 4    * * *   root    [ -x /usr/bin/roobuilder_maintenance ] && /usr/bin/roobuilder_maintenance
diff --git a/debian/roobuilder.doc-base.EX b/debian/roobuilder.doc-base.EX
new file mode 100644 (file)
index 0000000..418cfc1
--- /dev/null
@@ -0,0 +1,20 @@
+Document: roobuilder
+Title: Debian roobuilder Manual
+Author: <insert document author here>
+Abstract: This manual describes what roobuilder is
+ and how it can be used to
+ manage online manuals on Debian systems.
+Section: unknown
+
+Format: debiandoc-sgml
+Files: /usr/share/doc/roobuilder/roobuilder.sgml.gz
+
+Format: postscript
+Files: /usr/share/doc/roobuilder/roobuilder.ps.gz
+
+Format: text
+Files: /usr/share/doc/roobuilder/roobuilder.text.gz
+
+Format: HTML
+Index: /usr/share/doc/roobuilder/html/index.html
+Files: /usr/share/doc/roobuilder/html/*.html
diff --git a/debian/roobuilder.substvars b/debian/roobuilder.substvars
new file mode 100644 (file)
index 0000000..dd0fb50
--- /dev/null
@@ -0,0 +1,3 @@
+shlibs:Depends=libc6 (>= 2.14), libcairo2 (>= 1.2.4), libclutter-1.0-0 (>= 1.11.10), libclutter-gtk-1.0-0 (>= 0.91.8), libgda-5.0-4 (>= 5.0.2), libgdk-pixbuf2.0-0 (>= 2.22.0), libgee-0.8-2 (>= 0.8.3), libglib2.0-0 (>= 2.35.9), libgtk-3-0 (>= 3.16.2), libgtksourceview-3.0-1 (>= 3.10.1), libjavascriptcoregtk-4.0-18, libjson-glib-1.0-0 (>= 0.16.0), libpango-1.0-0 (>= 1.14.0), libsoup2.4-1 (>= 2.41.90), libvala-0.36-0 (>= 0.35.1), libwebkit2gtk-4.0-37 (>= 2.5.3), roojspacker
+misc:Depends=
+misc:Pre-Depends=
diff --git a/debian/roobuilder/DEBIAN/control b/debian/roobuilder/DEBIAN/control
new file mode 100644 (file)
index 0000000..b7d4626
--- /dev/null
@@ -0,0 +1,11 @@
+Package: roobuilder
+Version: 4.0.0
+Architecture: amd64
+Maintainer: Alan <alan@roojs.com>
+Installed-Size: 1176
+Depends: libc6 (>= 2.14), libcairo2 (>= 1.2.4), libclutter-1.0-0 (>= 1.11.10), libclutter-gtk-1.0-0 (>= 0.91.8), libgda-5.0-4 (>= 5.0.2), libgdk-pixbuf2.0-0 (>= 2.22.0), libgee-0.8-2 (>= 0.8.3), libglib2.0-0 (>= 2.35.9), libgtk-3-0 (>= 3.16.2), libgtksourceview-3.0-1 (>= 3.10.1), libjavascriptcoregtk-4.0-18, libjson-glib-1.0-0 (>= 0.16.0), libpango-1.0-0 (>= 1.14.0), libsoup2.4-1 (>= 2.41.90), libvala-0.36-0 (>= 0.35.1), libwebkit2gtk-4.0-37 (>= 2.5.3), roojspacker
+Section: unknown
+Priority: optional
+Homepage: <insert the upstream URL, if relevant>
+Description: <insert up to 60 chars description>
+ <insert long description, indented with spaces>
diff --git a/debian/roobuilder/DEBIAN/md5sums b/debian/roobuilder/DEBIAN/md5sums
new file mode 100644 (file)
index 0000000..4db9a86
--- /dev/null
@@ -0,0 +1,10 @@
+79c121a421c0b2329c0faa7d2192ce9d  usr/bin/roobuilder
+6eea1cef1a961dc5c2ef097725c8132b  usr/share/applications/roobuilder.desktop
+7d9c14e3aa7000aa755c80212eab3404  usr/share/doc/roobuilder/README.Debian
+965ae87b17bc3df5facdd2ced32134d4  usr/share/doc/roobuilder/changelog.gz
+fa7c793c19bbb543e862b58b47c239bd  usr/share/doc/roobuilder/copyright
+8fe4d7396ce59f473126cfaa971bb078  usr/share/icons/hicolor/16x16/apps/roobuilder.png
+8fe4d7396ce59f473126cfaa971bb078  usr/share/icons/hicolor/22x22/apps/roobuilder.png
+8fe4d7396ce59f473126cfaa971bb078  usr/share/icons/hicolor/24x24/apps/roobuilder.png
+8fe4d7396ce59f473126cfaa971bb078  usr/share/icons/hicolor/32x32/apps/roobuilder.png
+8fe4d7396ce59f473126cfaa971bb078  usr/share/icons/hicolor/48x48/apps/roobuilder.png
diff --git a/debian/roobuilder/usr/bin/roobuilder b/debian/roobuilder/usr/bin/roobuilder
new file mode 100755 (executable)
index 0000000..0bbff7b
Binary files /dev/null and b/debian/roobuilder/usr/bin/roobuilder differ
diff --git a/debian/roobuilder/usr/share/applications/roobuilder.desktop b/debian/roobuilder/usr/share/applications/roobuilder.desktop
new file mode 100644 (file)
index 0000000..3110851
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Encoding=UTF-8
+Name=Roo App Builder
+Comment=Vala and Javascript Application Builder
+Exec=roobuilder
+Icon=roobuilder
+Terminal=false
+Type=Application
+StartupNotify=true
+Categories=GNOME;GTK;Utility;
diff --git a/debian/roobuilder/usr/share/doc/roobuilder/README.Debian b/debian/roobuilder/usr/share/doc/roobuilder/README.Debian
new file mode 100644 (file)
index 0000000..b2cefab
--- /dev/null
@@ -0,0 +1,6 @@
+roobuilder for Debian
+--------------------
+
+<possible notes regarding this package - if none, delete this file>
+
+ -- Alan <alan@roojs.com>  Thu, 16 May 2019 17:47:00 +0800
diff --git a/debian/roobuilder/usr/share/doc/roobuilder/changelog.gz b/debian/roobuilder/usr/share/doc/roobuilder/changelog.gz
new file mode 100644 (file)
index 0000000..ae44b56
Binary files /dev/null and b/debian/roobuilder/usr/share/doc/roobuilder/changelog.gz differ
diff --git a/debian/roobuilder/usr/share/doc/roobuilder/copyright b/debian/roobuilder/usr/share/doc/roobuilder/copyright
new file mode 100644 (file)
index 0000000..d21a951
--- /dev/null
@@ -0,0 +1,34 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: roobuilder
+Source: <url://example.com>
+
+Files: *
+Copyright: <years> <put author's name and email here>
+           <years> <likewise for another author>
+License: GPL-3.0+
+
+Files: debian/*
+Copyright: 2019 Alan <alan@roojs.com>
+License: GPL-3.0+
+
+License: GPL-3.0+
+ 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 3 of the License, or
+ (at your option) any later version.
+ .
+ This package 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. If not, see <https://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU General
+ Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
+
+# Please also look if there are files or directories which have a
+# different copyright/license attached and list them here.
+# Please avoid picking licenses with terms that are more restrictive than the
+# packaged work, as it may make Debian's contributions unacceptable upstream.
diff --git a/debian/roobuilder/usr/share/icons/hicolor/16x16/apps/roobuilder.png b/debian/roobuilder/usr/share/icons/hicolor/16x16/apps/roobuilder.png
new file mode 100644 (file)
index 0000000..8144c1b
Binary files /dev/null and b/debian/roobuilder/usr/share/icons/hicolor/16x16/apps/roobuilder.png differ
diff --git a/debian/roobuilder/usr/share/icons/hicolor/22x22/apps/roobuilder.png b/debian/roobuilder/usr/share/icons/hicolor/22x22/apps/roobuilder.png
new file mode 100644 (file)
index 0000000..8144c1b
Binary files /dev/null and b/debian/roobuilder/usr/share/icons/hicolor/22x22/apps/roobuilder.png differ
diff --git a/debian/roobuilder/usr/share/icons/hicolor/24x24/apps/roobuilder.png b/debian/roobuilder/usr/share/icons/hicolor/24x24/apps/roobuilder.png
new file mode 100644 (file)
index 0000000..8144c1b
Binary files /dev/null and b/debian/roobuilder/usr/share/icons/hicolor/24x24/apps/roobuilder.png differ
diff --git a/debian/roobuilder/usr/share/icons/hicolor/32x32/apps/roobuilder.png b/debian/roobuilder/usr/share/icons/hicolor/32x32/apps/roobuilder.png
new file mode 100644 (file)
index 0000000..8144c1b
Binary files /dev/null and b/debian/roobuilder/usr/share/icons/hicolor/32x32/apps/roobuilder.png differ
diff --git a/debian/roobuilder/usr/share/icons/hicolor/48x48/apps/roobuilder.png b/debian/roobuilder/usr/share/icons/hicolor/48x48/apps/roobuilder.png
new file mode 100644 (file)
index 0000000..8144c1b
Binary files /dev/null and b/debian/roobuilder/usr/share/icons/hicolor/48x48/apps/roobuilder.png differ
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..e1c367c
--- /dev/null
@@ -0,0 +1,25 @@
+#!/usr/bin/make -f
+# See debhelper(7) (uncomment to enable)
+# output every command that modifies files on the build system.
+#export DH_VERBOSE = 1
+
+
+# see FEATURE AREAS in dpkg-buildflags(1)
+#export DEB_BUILD_MAINT_OPTIONS = hardening=+all
+
+# see ENVIRONMENT in dpkg-buildflags(1)
+# package maintainers to append CFLAGS
+#export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
+# package maintainers to append LDFLAGS
+#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
+
+
+%:
+       dh $@
+
+
+# dh_make generated override targets
+# This is example for Cmake (See https://bugs.debian.org/641051 )
+#override_dh_auto_configure:
+#      dh_auto_configure -- #  -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH)
+
diff --git a/debian/source/format b/debian/source/format
new file mode 100644 (file)
index 0000000..89ae9db
--- /dev/null
@@ -0,0 +1 @@
+3.0 (native)
diff --git a/notes/flutter.txt b/notes/flutter.txt
new file mode 100644 (file)
index 0000000..b17511f
--- /dev/null
@@ -0,0 +1,38 @@
+Create a project (with all the files..)
+
+flutter create /path/to/newdir
+-------
+build 
+build: (PWD== working dir)
+flutter create apk
+
+-------
+Set up emulators
+flutter emulators
+1 available emulator:
+
+Nexus_6_API_28 â€¢ Nexus 6 â€¢ Google â€¢ Nexus 6 API 28
+
+To run an emulator, run 'flutter emulators --launch <emulator id>'.
+To create a new emulator, run 'flutter emulators --create [--name xyz]'.
+
+You can find more information on managing emulators at the links below:
+  https://developer.android.com/studio/run/managing-avds
+  https://developer.android.com/studio/command-line/avdmanager
+ flutter emulator --launch Nexus_6_API_28
+-------
+test run:
+
+flutter run
+
+(press 'r') - triggers the hot reload
+
+---------------------------
+emulator embedded?
+
+Xvfb :2 -screen 0 1024x768x24 > /dev/null 2>&1 &
+x11vnc -display :2 -quiet -nopw
+DISPLAY=:2  ~/Android/Sdk/emulator/emulator -avd Nexus_6_API_28
+
+// this bti can use vnc-gtk...
+vncviewer localhost:0 
\ No newline at end of file
diff --git a/org.roojs.roobuilder.json b/org.roojs.roobuilder.json
new file mode 100644 (file)
index 0000000..0aa1338
--- /dev/null
@@ -0,0 +1,48 @@
+{
+    "id": "org.roojs.roobuilder",
+    "runtime": "org.gnome.Platform",
+    "runtime-version": "3.32",
+    "sdk": "org.gnome.Sdk",
+    "command": "roobuilder",
+    "clean": [ "/include", "*.la" ],
+    "build-options" : {
+        "cflags": "-O2 -g",
+        "cxxflags": "-O2 -g",
+        "env": {
+            "V": "1"
+        },
+        "arch": {
+            "x86_64": {
+                "cflags": "-O3 -g"
+            }
+        }
+    },
+    "modules": [
+        {
+            "name" : "gtksourceview",
+            "config-opts" : [
+                "--disable-Werror"
+            ],
+            "sources" : [
+                {
+                    "type" : "git",
+                    "branch" : "gnome-3-24",
+                    "url" : "https://gitlab.gnome.org/GNOME/gtksourceview.git"
+                }
+            ]
+        },
+        {
+            "name" : "vala",
+            "config-opts" : [
+                "--disable-Werror"
+            ],
+            "sources" : [
+                {
+                    "type" : "git",
+                    "branch" : "0.36",
+                    "url" : "https://gitlab.gnome.org/GNOME/vala.git"
+                }
+            ]
+        }
+    ]
+}
index 2892ae3..a39de4b 100644 (file)
                        { "add-file", 0, 0, OptionArg.STRING, ref opt_compile_add, "Add this file to compile list", null },
                        { "output", 0, 0, OptionArg.STRING, ref opt_compile_output, "output binary file path", null },
                        { "debug", 0, 0, OptionArg.NONE, ref opt_debug, "Show debug messages", null },
+                       { "pull-resources", 0, 0, OptionArg.NONE, ref opt_pull_resources, "Fetch the online resources", null },                 
             
             // some testing code.
             { "list-projects", 0, 0,  OptionArg.NONE, ref opt_list_projects, "List Projects", null },
             { "list-files", 0, 0,  OptionArg.NONE, ref  opt_list_files, "List Files (in a project", null},
             { "bjs", 0, 0, OptionArg.STRING, ref opt_bjs_compile, "convert bjs file", null },
             { "bjs-target", 0, 0, OptionArg.STRING, ref opt_bjs_compile_target, "convert bjs file to tareet  : vala / js", null },
-            
+            { "test", 0, 0, OptionArg.STRING, ref opt_test, "run a test use 'help' to list the available tests", null },
             
                        { null }
                };
                public static string opt_compile_output;
         public static string opt_bjs_compile;
         public static string opt_bjs_compile_target;
+        public static string opt_test;        
                public static bool opt_debug = false;
                public static bool opt_list_projects = false;
                public static bool opt_list_files = false;
+               public static bool opt_pull_resources = false;          
                
                public static string _self;
                
                                GLib.Process.exit(Posix.EXIT_FAILURE);
                                 
                        }
+                       this.initDebug();
+                       this.runTests();                        
+                       this.pullResources();
+                       
+               Project.Project.loadAll();
+                       this.listProjects();
+                       var cur_project = this.compileProject();
+                       this.listFiles(cur_project);
+                       this.compileBjs(cur_project);
+                       this.compileVala();
 
                }
 
                        return dirname;
                }
                
+               
+               // --------------- non static...
+               
+               void initDebug() 
+               {
+               
+                       if (BuilderApplication.opt_debug  || BuilderApplication.opt_compile_project == null) {
+                               GLib.Log.set_handler(null, 
+                                       GLib.LogLevelFlags.LEVEL_DEBUG | GLib.LogLevelFlags.LEVEL_WARNING, 
+                                       (dom, lvl, msg) => {
+                                       print("%s: %s\n", dom, msg);
+                               });
+                       }
+                       
+               
+               }
+               void listProjects()
+               {
+                       if (!BuilderApplication.opt_list_projects) {
+                               return;
+                       }
+                       print("Projects\n %s\n", Project.Project.listAllToString());
+                       GLib.Process.exit(Posix.EXIT_SUCCESS);
+               
+               }
+               Project.Project? compileProject()
+               {
+                       
+                       if (BuilderApplication.opt_compile_project == null) {
+                               return null;
+                        }
+                       Project.Project cur_project = null;
+                       cur_project = Project.Project.getProjectByHash( BuilderApplication.opt_compile_project);
+                       
+                       if (cur_project == null) {
+                               GLib.error("invalid project %s, use --list-projects to show project ids",BuilderApplication.opt_compile_project);
+                       }
+                       cur_project.scanDirs();
+                               
+                       return cur_project;
+               
+               }
+               void listFiles(Project.Project? cur_project)
+               {
+                       if (!BuilderApplication.opt_list_files) {
+                               return;
+                       }
+                       if (cur_project == null) {
+                               GLib.error("missing project, use --project to select which project");
+                       }
+                       print("Files for %s\n %s\n", cur_project.name, cur_project.listAllFilesToString());
+                       GLib.Process.exit(Posix.EXIT_SUCCESS);
+                       
+               }
+               void compileBjs(Project.Project? cur_project)
+               {
+                       if (BuilderApplication.opt_bjs_compile == null) {
+                               return;
+                       }
+                       if (cur_project == null) {
+                               GLib.error("missing project, use --project to select which project");
+                       }       
+                       var file = cur_project.getByName(BuilderApplication.opt_bjs_compile);
+                       if (file == null) {
+                               GLib.error("missing file %s in project %s", BuilderApplication.opt_bjs_compile, cur_project.name);
+                       }
+                       //BuilderApplication.compileBjs();
+                       file.loadItems();
+                       var str = file.toSourceCode();
+                         
+                         
+                       if (!BuilderApplication.opt_debug) {
+                               print("%s", str);
+                               GLib.Process.exit(Posix.EXIT_SUCCESS);
+                       }
+                       
+                       // dump the node tree
+                       file.tree.dumpProps();
+                       
+                       
+                       var str_ar = str.split("\n");
+                       for(var i =0;i<str_ar.length;i++) {
+                               var node = file.tree.lineToNode(i+1);
+                               var prop = node == null ? null : node.lineToProp(i+1);
+                               print("%d: %s   :  %s\n", 
+                                       i+1, 
+                                       node == null ? "......"  : (prop == null ? "????????" : prop),
+                                       str_ar[i]
+                               );
+                       }
+                       
+                       GLib.Process.exit(Posix.EXIT_SUCCESS);
+               }
+               
+               void compileVala()
+               {
+                       if (BuilderApplication.opt_compile_target == null) {
+                               return;
+                       }
+                       Palete.ValaSourceCompiler.buildApplication();
+               
+                       GLib.Process.exit(Posix.EXIT_SUCCESS);
+       
+               }
+               void pullResources()
+               {
+                       if (!opt_pull_resources) {
+                               return;
+                       }
+                       var loop = new MainLoop();
+                       Resources.singleton().updateProgress.connect((p,t) => {
+                               print("Got %d/%d", (int) p,(int)t);
+                               if (p == t) {
+                                       loop.quit();
+                               }
+                       });
+                       Resources.singleton().fetchStart();     
+                       loop.run();
+                       GLib.Process.exit(Posix.EXIT_SUCCESS);
+               }
+               
+               
+               void runTests()
+               {
+                       if (opt_test == null) {
+                               return;
+                       }
+                       switch(opt_test) {
+                               case "help":
+                                       print("""
+help             - list available tests
+flutter-project  - create a flutter project in /tmp/test-flutter
+""");          
+                                       break;
+                               case "flutter-project":
+                               Project.Project.loadAll();
+                                       var p =   Project.Project.factory("Flutter", "/tmp/test-flutter");
+                                       var pa = p.palete as Palete.Flutter;
+                                       pa.dumpusage();
+                                        var ar = pa.getChildList("material.Scaffold");
+                                       GLib.debug("childlist for material.Scaffold is %s", 
+                                               string.joinv( "\n-- ", ar)
+                                       );
+                                       ar = pa.getDropList("material.MaterialApp");
+                                       GLib.debug("droplist for material.MaterialApp is %s", 
+                                               string.joinv( "\n-- ", ar)
+                                       );
+                                       break;
+                                       
+                               default:
+                                       print("Invalid test\n");
+                                       break;
+
+
+                       }
+                       GLib.Process.exit(Posix.EXIT_SUCCESS);          
+               }
+               
+        
        } 
 
  
index 07f0445..8015afa 100644 (file)
@@ -2,7 +2,7 @@
  "name" : "DialogNewComponent",
  "parent" : "",
  "title" : "",
- "path" : "/home/alan/gitlive/app.Builder.js/src/Builder4/DialogNewComponent.bjs",
+ "path" : "/home/alan/gitlive/roobuilder/src/Builder4/DialogNewComponent.bjs",
  "permname" : "",
  "modOrder" : "",
  "build_module" : "",
     "show" : "(self)  => {\n  this.el.show_all();\n  //test\n}"
    },
    "|   void updateFileFromEntry" : "() {\n\n        _this.file.title = _this.title.el.get_text();\n        _this.file.region = _this.region.el.get_text();            \n        _this.file.parent = _this.parent.el.get_text();                        \n        _this.file.permname = _this.permname.el.get_text();                                    \n        _this.file.modOrder = _this.modOrder.el.get_text();\n        \n        if (_this.file.name.length  > 0 && _this.file.name != _this.name.el.get_text()) {\n            _this.file.renameTo(_this.name.el.get_text());\n        }\n        // store the module...\n        _this.file.build_module = \"\";        \n         Gtk.TreeIter iter; \n        if (_this.build_module.el.get_active_iter (out iter)) {\n             Value vfname;\n             this.dbmodel.el.get_value (iter, 0, out vfname);\n             if (((string)vfname).length > 0) {\n                 _this.file.build_module = (string)vfname;\n             }\n    \n        }\n        \n        \n\n                                                    \n}    ",
-   "id" : "DialogNewComponent",
    "@ void success" : "(Project.Project pr, JsRender.JsRender file)",
+   "id" : "DialogNewComponent",
    "default_width" : 500,
    "$ deletable" : true,
    "# Project.Project project" : "",
    "title" : "New Component",
    "xtype" : "Dialog",
-   "|   void show" : "(JsRender.JsRender c) \n{\n    this.project = c.project;\n    \n    //if (!this.el) {\n        //this.init();\n     //}\n    \n    _this.name.el.set_text(c.name);\n    _this.title.el.set_text(c.title);\n    _this.parent.el.set_text(c.parent);    \n    _this.region.el.set_text(c.region);\n    _this.modOrder.el.set_text(c.modOrder);\n     _this.permname.el.set_text(c.permname);\n    \n    if (c.path.length > 0) {\n        this.el.set_title(\"Edit File Details - \" + c.name);\n    } else {\n        this.el.set_title(\"Create New File\");\n    }\n    \n     var ar = new Gee.ArrayList<string>();\n     _this.dbmodel.loadData(ar,\"\");\n    // load the modules... if relivant..\n    if (this.project.xtype == \"Gtk\") {\n        var p = (Project.Gtk)c.project;\n          var cg = p.compilegroups;\n\n        var iter = cg.map_iterator();\n       while(iter.next()) {\n            var key = iter.get_key();\n            if (key == \"_default_\") {\n                continue;\n            }\n            ar.add(key);\n        };\n        _this.dbmodel.loadData(ar, c.build_module);\n\n    }\n    \n     \n    _this.file = c;\n    //console.log('show all');\n    this.el.show_all();\n    \n    //this.success = c.success;\n    \n    \n}",
+   "|   void show" : "(JsRender.JsRender c) \n{\n    this.project = c.project;\n    \n    //if (!this.el) {\n        //this.init();\n     //}\n    \n    _this.name.el.set_text(c.name);\n    _this.title.el.set_text(c.title);\n    _this.parent.el.set_text(c.parent);    \n    _this.region.el.set_text(c.region);\n    _this.modOrder.el.set_text(c.modOrder);\n     _this.permname.el.set_text(c.permname);\n    \n    if (c.path.length > 0) {\n        this.el.set_title(\"Edit File Details - \" + c.name);\n    } else {\n        this.el.set_title(\"Create New File\");\n    }\n    \n     var ar = new Gee.ArrayList<string>();\n     _this.dbmodel.loadData(ar,\"\");\n    // load the modules... if relivant..\n    if (this.project.xtype == \"Gtk\") {\n        var p = (Project.Gtk)c.project;\n          var cg = p.compilegroups;\n\n        var iter = cg.map_iterator();\n       while(iter.next()) {\n            var key = iter.get_key();\n            if (key == \"_default_\") {\n                continue;\n            }\n            ar.add(key);\n        };\n        _this.dbmodel.loadData(ar, c.build_module);\n\n    } \n     \n    _this.file = c;\n    //console.log('show all');\n    this.el.show_all();\n    \n    //this.success = c.success;\n    \n    \n}",
    "# JsRender.JsRender file" : "null",
    "default_height" : 200,
    "$ modal" : true,
@@ -75,8 +75,8 @@
         },
         {
          "label" : "Region",
-         "$ visible" : true,
          "tooltip_text" : "center, north, south, east, west",
+         "$ visible" : true,
          "xalign" : 0.90000000000000002,
          "* pack" : "attach_defaults,0,1,2,3",
          "xtype" : "Label",
          "items" : [
           {
            "id" : "dbcellrenderer",
-           "xtype" : "CellRendererText",
            "* pack" : "pack_start,true",
+           "xtype" : "CellRendererText",
            "$ xns" : "Gtk"
           },
           {
            "id" : "dbmodel",
-           "xtype" : "ListStore",
            "* pack" : "set_model",
+           "xtype" : "ListStore",
            "$ columns" : "typeof(string),typeof(string)",
            "n_columns" : 2,
            "$ xns" : "Gtk",
     },
     {
      "label" : "Cancel",
-     "xtype" : "Button",
      "* pack" : "add_action_widget,0",
+     "xtype" : "Button",
      "$ xns" : "Gtk"
     },
     {
      "label" : "OK",
-     "xtype" : "Button",
      "* pack" : "add_action_widget,1",
+     "xtype" : "Button",
      "$ xns" : "Gtk"
     }
    ]
index ff65b70..319c7f5 100644 (file)
@@ -1,6 +1,6 @@
 static Xcls_DialogNewComponent  _DialogNewComponent;
 
-public class Xcls_DialogNewComponent : Object 
+public class Xcls_DialogNewComponent : Object
 {
     public Gtk.Dialog el;
     private Xcls_DialogNewComponent  _this;
@@ -27,7 +27,7 @@ public class Xcls_DialogNewComponent : Object
     public Project.Project project;
     public JsRender.JsRender file;
 
-    // ctor 
+    // ctor
     public Xcls_DialogNewComponent()
     {
         _this = this;
@@ -52,7 +52,7 @@ public class Xcls_DialogNewComponent : Object
         child_2.ref();
         this.el.add_action_widget (  child_2.el , 1 );
 
-        // listeners 
+        //listeners
         this.el.delete_event.connect( (self, event) => {
             this.el.hide();
             return true; 
@@ -164,7 +164,7 @@ public class Xcls_DialogNewComponent : Object
         });
     }
 
-    // user defined functions 
+    // user defined functions
     public   void updateFileFromEntry () {
     
             _this.file.title = _this.title.el.get_text();
@@ -230,8 +230,7 @@ public class Xcls_DialogNewComponent : Object
             };
             _this.dbmodel.loadData(ar, c.build_module);
     
-        }
-        
+        } 
          
         _this.file = c;
         //console.log('show all');
@@ -241,7 +240,7 @@ public class Xcls_DialogNewComponent : Object
         
         
     }
-    public class Xcls_VBox2 : Object 
+    public class Xcls_VBox2 : Object
     {
         public Gtk.VBox el;
         private Xcls_DialogNewComponent  _this;
@@ -249,7 +248,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_VBox2(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -263,9 +262,9 @@ public class Xcls_DialogNewComponent : Object
             this.el.pack_start (  child_0.el , false,false,0 );
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_Table3 : Object 
+    public class Xcls_Table3 : Object
     {
         public Gtk.Table el;
         private Xcls_DialogNewComponent  _this;
@@ -273,7 +272,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_Table3(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -326,9 +325,9 @@ public class Xcls_DialogNewComponent : Object
             this.el.attach_defaults (  child_13.el , 1,2,6,7 );
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_Label4 : Object 
+    public class Xcls_Label4 : Object
     {
         public Gtk.Label el;
         private Xcls_DialogNewComponent  _this;
@@ -336,7 +335,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_Label4(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -349,9 +348,10 @@ public class Xcls_DialogNewComponent : Object
             this.el.xalign = 0.900000f;
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_name : Object 
+
+    public class Xcls_name : Object
     {
         public Gtk.Entry el;
         private Xcls_DialogNewComponent  _this;
@@ -359,7 +359,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_name(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -372,9 +372,10 @@ public class Xcls_DialogNewComponent : Object
             this.el.visible = true;
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_Label6 : Object 
+
+    public class Xcls_Label6 : Object
     {
         public Gtk.Label el;
         private Xcls_DialogNewComponent  _this;
@@ -382,7 +383,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_Label6(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -396,9 +397,10 @@ public class Xcls_DialogNewComponent : Object
             this.el.visible = true;
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_title : Object 
+
+    public class Xcls_title : Object
     {
         public Gtk.Entry el;
         private Xcls_DialogNewComponent  _this;
@@ -406,7 +408,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_title(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -419,9 +421,10 @@ public class Xcls_DialogNewComponent : Object
             this.el.visible = true;
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_Label8 : Object 
+
+    public class Xcls_Label8 : Object
     {
         public Gtk.Label el;
         private Xcls_DialogNewComponent  _this;
@@ -429,7 +432,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_Label8(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -444,9 +447,10 @@ public class Xcls_DialogNewComponent : Object
             this.el.visible = true;
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_region : Object 
+
+    public class Xcls_region : Object
     {
         public Gtk.Entry el;
         private Xcls_DialogNewComponent  _this;
@@ -454,7 +458,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_region(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -467,9 +471,10 @@ public class Xcls_DialogNewComponent : Object
             this.el.visible = true;
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_Label10 : Object 
+
+    public class Xcls_Label10 : Object
     {
         public Gtk.Label el;
         private Xcls_DialogNewComponent  _this;
@@ -477,7 +482,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_Label10(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -491,9 +496,10 @@ public class Xcls_DialogNewComponent : Object
             this.el.visible = true;
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_parent : Object 
+
+    public class Xcls_parent : Object
     {
         public Gtk.Entry el;
         private Xcls_DialogNewComponent  _this;
@@ -501,7 +507,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_parent(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -514,9 +520,10 @@ public class Xcls_DialogNewComponent : Object
             this.el.visible = true;
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_Label12 : Object 
+
+    public class Xcls_Label12 : Object
     {
         public Gtk.Label el;
         private Xcls_DialogNewComponent  _this;
@@ -524,7 +531,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_Label12(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -538,9 +545,10 @@ public class Xcls_DialogNewComponent : Object
             this.el.visible = true;
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_permname : Object 
+
+    public class Xcls_permname : Object
     {
         public Gtk.Entry el;
         private Xcls_DialogNewComponent  _this;
@@ -548,7 +556,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_permname(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -561,9 +569,10 @@ public class Xcls_DialogNewComponent : Object
             this.el.visible = true;
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_Label14 : Object 
+
+    public class Xcls_Label14 : Object
     {
         public Gtk.Label el;
         private Xcls_DialogNewComponent  _this;
@@ -571,7 +580,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_Label14(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -585,9 +594,10 @@ public class Xcls_DialogNewComponent : Object
             this.el.visible = true;
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_modOrder : Object 
+
+    public class Xcls_modOrder : Object
     {
         public Gtk.Entry el;
         private Xcls_DialogNewComponent  _this;
@@ -595,7 +605,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_modOrder(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -608,9 +618,10 @@ public class Xcls_DialogNewComponent : Object
             this.el.visible = true;
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_Label16 : Object 
+
+    public class Xcls_Label16 : Object
     {
         public Gtk.Label el;
         private Xcls_DialogNewComponent  _this;
@@ -618,7 +629,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_Label16(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -632,9 +643,10 @@ public class Xcls_DialogNewComponent : Object
             this.el.visible = true;
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_build_module : Object 
+
+    public class Xcls_build_module : Object
     {
         public Gtk.ComboBox el;
         private Xcls_DialogNewComponent  _this;
@@ -642,7 +654,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_build_module(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -659,14 +671,14 @@ public class Xcls_DialogNewComponent : Object
             child_1.ref();
             this.el.set_model (  child_1.el  );
 
-            // init method 
+            // init method
 
             this.el.add_attribute(_this.dbcellrenderer.el , "markup", 1 );
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_dbcellrenderer : Object 
+    public class Xcls_dbcellrenderer : Object
     {
         public Gtk.CellRendererText el;
         private Xcls_DialogNewComponent  _this;
@@ -674,7 +686,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_dbcellrenderer(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -686,9 +698,10 @@ public class Xcls_DialogNewComponent : Object
             // set gobject values
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_dbmodel : Object 
+
+    public class Xcls_dbmodel : Object
     {
         public Gtk.ListStore el;
         private Xcls_DialogNewComponent  _this;
@@ -696,7 +709,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_dbmodel(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -708,7 +721,7 @@ public class Xcls_DialogNewComponent : Object
             // set gobject values
         }
 
-        // user defined functions 
+        // user defined functions
         public void loadData (Gee.ArrayList<string> data, string cur) {
             this.el.clear();                                    
             Gtk.TreeIter iter;
@@ -744,7 +757,11 @@ public class Xcls_DialogNewComponent : Object
                                              
         }
     }
-    public class Xcls_Button20 : Object 
+
+
+
+
+    public class Xcls_Button20 : Object
     {
         public Gtk.Button el;
         private Xcls_DialogNewComponent  _this;
@@ -752,7 +769,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_Button20(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -764,9 +781,10 @@ public class Xcls_DialogNewComponent : Object
             this.el.label = "Cancel";
         }
 
-        // user defined functions 
+        // user defined functions
     }
-    public class Xcls_Button21 : Object 
+
+    public class Xcls_Button21 : Object
     {
         public Gtk.Button el;
         private Xcls_DialogNewComponent  _this;
@@ -774,7 +792,7 @@ public class Xcls_DialogNewComponent : Object
 
             // my vars (def)
 
-        // ctor 
+        // ctor
         public Xcls_Button21(Xcls_DialogNewComponent _owner )
         {
             _this = _owner;
@@ -786,6 +804,7 @@ public class Xcls_DialogNewComponent : Object
             this.el.label = "OK";
         }
 
-        // user defined functions 
+        // user defined functions
     }
+
 }
index b55233e..5b87580 100644 (file)
@@ -2,7 +2,7 @@
  "name" : "EditProject",
  "parent" : "",
  "title" : "",
- "path" : "/home/alan/gitlive/app.Builder.js/src/Builder4/EditProject.bjs",
+ "path" : "/home/alan/gitlive/roobuilder/src/Builder4/EditProject.bjs",
  "permname" : "",
  "modOrder" : "",
  "build_module" : "builder",
@@ -16,7 +16,7 @@
    "title" : "Project Properties",
    "xtype" : "Dialog",
    "default_height" : 500,
-   "| Project.Project? show" : "() {\n      \n\n    //[ 'xtype'  ].forEach(function(k) {\n    //    _this.get(k).setValue(typeof(c[k]) == 'undefined' ? '' : c[k]);\n    //});\n\t// shouild set path..\n    _this.model.loadData();\n    this.el.show_all();\n    \n    var err_dialog = StandardErrorDialog.singleton();\n\n    var id = -1;\n    while (id < 0) {\n         id =  this.el.run();\n         if (id < 1) {\n                this.el.hide();\n                return null;\n        }\n \n         \n          if (_this.xtype.getValue().length < 1) {\n               \n                err_dialog.show(_this.el,\"You have to set Project type\");             \n                id = -1;\n                continue;\n            }\n            if (_this.dir.el.get_filename().length < 1) {\n \n                err_dialog.show(_this.el,\"You have to select a folder\");             \n                id = -1;\n                continue;\n            }\n           \n    }\n    \n    this.el.hide();\n    \n    \n    \n \n    var fn = _this.dir.el.get_filename();\n    print(\"add %s\\n\" , fn);\n    \n    var project = Project.Project.factory(_this.xtype.getValue(), fn);\n    project.save();\n    Project.projects.set(project.name,project);\n    \n    //var pr = imports.Builder.Provider.ProjectManager.ProjectManager.update(this.project);\n    \n    return project;\n\n    \n    //this.success = c.success;\n}\n",
+   "| Project.Project? show" : "() {\n      \n\n    //[ 'xtype'  ].forEach(function(k) {\n    //    _this.get(k).setValue(typeof(c[k]) == 'undefined' ? '' : c[k]);\n    //});\n\t// shouild set path..\n    _this.model.loadData();\n    this.el.show_all();\n    \n    var err_dialog = StandardErrorDialog.singleton();\n\n    var id = -1;\n    while (id < 0) {\n         id =  this.el.run();\n         if (id < 1) {\n                this.el.hide();\n                return null;\n        }\n \n         \n      if (_this.xtype.getValue().length < 1) {\n           \n            err_dialog.show(_this.el,\"You have to set Project type\");             \n            id = -1;\n            continue;\n        }\n        if (_this.dir.el.get_filename().length < 1) {\n\n            err_dialog.show(_this.el,\"You have to select a folder\");             \n            id = -1;\n            continue;\n        }\n           \n    }\n    \n    this.el.hide();\n    \n    \n    \n \n    var fn = _this.dir.el.get_filename();\n    print(\"add %s\\n\" , fn);\n    \n    var project = Project.Project.factory(_this.xtype.getValue(), fn);\n    project.save();\n    Project.projects.set(project.name,project);\n    \n    //var pr = imports.Builder.Provider.ProjectManager.ProjectManager.update(this.project);\n    \n    return project;\n\n    \n    //this.success = c.success;\n}\n",
    "$ modal" : true,
    "$ xns" : "Gtk",
    "border_width" : 3,
@@ -44,7 +44,7 @@
          "$ xns" : "Gtk"
         },
         {
-         "| string getValue" : " () {\n     var ix = this.el.get_active();\n        if (ix < 0 ) {\n            return \"\";\n        }\n        switch(ix) {\n            case 0:\n                return \"Roo\";\n            case 1:\n                return \"Gtk\";\n        }\n        return \"\";\n}\n",
+         "| string getValue" : " () {\n     var ix = this.el.get_active();\n        if (ix < 0 ) {\n            return \"\";\n        }\n        switch(ix) {\n            case 0:\n                return \"Roo\";\n            case 1:\n                return \"Gtk\";\n           case 2:\n                return \"Flutter\";\n        }\n        return \"\";\n}\n",
          "id" : "xtype",
          "* init" : " this.el.add_attribute(_this.cellrender.el , \"markup\", 1 );  \n  ",
          "xtype" : "ComboBox",
@@ -64,7 +64,7 @@
            "$ columns" : "typeof(string),typeof(string)",
            "n_columns" : 2,
            "$ xns" : "Gtk",
-           "| void loadData" : "  ( ) {\n        this.el.clear();\n                      \n        Gtk.TreeIter iter;\n                \n        el.append(out iter);\n        \n        el.set_value(iter, 0, \"Roo\");\n        el.set_value(iter, 1, \"Roo Project\");\n         el.append(out iter);\n        \n        el.set_value(iter, 0, \"Gtk\");\n        el.set_value(iter, 1, \"Gtk Project\");\n         \n              \n                                     \n}\n"
+           "| void loadData" : "  ( ) {\n        this.el.clear();\n                      \n        Gtk.TreeIter iter;\n                \n        el.append(out iter);\n        el.set_value(iter, 0, \"Roo\");\n        el.set_value(iter, 1, \"Roo Project\");\n        \n        el.append(out iter);\n        el.set_value(iter, 0, \"Gtk\");\n        el.set_value(iter, 1, \"Gtk Project\");\n         \n        el.append(out iter);\n        el.set_value(iter, 0, \"Flutter\");\n        el.set_value(iter, 1, \"Flutter Project\");\n              \n                                     \n}\n"
           }
          ]
         }
index af62627..2baecc9 100644 (file)
@@ -75,18 +75,18 @@ public class EditProject : Object
             }
      
              
-              if (_this.xtype.getValue().length < 1) {
-                   
-                    err_dialog.show(_this.el,"You have to set Project type");             
-                    id = -1;
-                    continue;
-                }
-                if (_this.dir.el.get_filename().length < 1) {
-     
-                    err_dialog.show(_this.el,"You have to select a folder");             
-                    id = -1;
-                    continue;
-                }
+          if (_this.xtype.getValue().length < 1) {
+               
+                err_dialog.show(_this.el,"You have to set Project type");             
+                id = -1;
+                continue;
+            }
+            if (_this.dir.el.get_filename().length < 1) {
+    
+                err_dialog.show(_this.el,"You have to select a folder");             
+                id = -1;
+                continue;
+            }
                
         }
         
@@ -229,6 +229,8 @@ public class EditProject : Object
                         return "Roo";
                     case 1:
                         return "Gtk";
+                   case 2:
+                        return "Flutter";
                 }
                 return "";
         }
@@ -283,14 +285,16 @@ public class EditProject : Object
                 Gtk.TreeIter iter;
                         
                 el.append(out iter);
-                
                 el.set_value(iter, 0, "Roo");
                 el.set_value(iter, 1, "Roo Project");
-                 el.append(out iter);
                 
+                el.append(out iter);
                 el.set_value(iter, 0, "Gtk");
                 el.set_value(iter, 1, "Gtk Project");
                  
+                el.append(out iter);
+                el.set_value(iter, 0, "Flutter");
+                el.set_value(iter, 1, "Flutter Project");
                       
                                              
         }
index 058b576..5412b46 100644 (file)
@@ -33,8 +33,8 @@
    "items" : [
     {
      "id" : "headerbar",
-     "* pack" : "set_titlebar",
      "xtype" : "HeaderBar",
+     "* pack" : "set_titlebar",
      "bool show_close_button" : true,
      "$ xns" : "Gtk",
      "string title" : "Application Builder",
@@ -47,8 +47,8 @@
        "items" : [
         {
          "bool use_popover" : false,
-         "* pack" : "add",
          "xtype" : "MenuButton",
+         "* pack" : "add",
          "$ xns" : "Gtk",
          "items" : [
           {
@@ -62,9 +62,9 @@
              "listeners" : {
               "activate" : "( ) => {\n       _this.openNewWindow();\n}"
              },
+             "xtype" : "MenuItem",
              "string label" : "Open a new Window",
              "* pack" : "append",
-             "xtype" : "MenuItem",
              "$ xns" : "Gtk"
             },
             {
              "listeners" : {
               "activate" : " ( ) => {\n         Resources.singleton().fetchStart();\n}"
              },
+             "* pack" : "append",
              "xtype" : "MenuItem",
              "string label" : "Download updated Resources",
-             "* pack" : "append",
              "$ xns" : "Gtk"
             },
             {
              "listeners" : {
               "activate" : "() => {\n    About.singleton().el.show();\n    }"
              },
+             "string label" : "About the Builder",
              "* pack" : "append",
              "xtype" : "MenuItem",
-             "string label" : "About the Builder",
              "$ xns" : "Gtk"
             }
            ]
           },
           {
+           "xtype" : "Image",
            "utf8 icon_name" : "help-about",
            "* pack" : "set_image",
-           "xtype" : "Image",
            "$ xns" : "Gtk"
           }
          ]
           "clicked" : "  ( ) => {\n   _this.windowstate.switchState(WindowState.State.FILES);\n      \n\n}"
          },
          "id" : "openbtn",
-         "xtype" : "Button",
          "* pack" : "add",
+         "xtype" : "Button",
          "$ xns" : "Gtk",
          "$ tooltop_text" : "\"Open File\"",
          "items" : [
           {
+           "* pack" : "set_image",
            "xtype" : "Image",
            "utf8 icon_name" : "document-open",
-           "* pack" : "set_image",
            "$ xns" : "Gtk"
           }
          ]
          "bool visible" : false,
          "items" : [
           {
+           "utf8 icon_name" : "go-previous",
            "* pack" : "set_image",
            "xtype" : "Image",
-           "utf8 icon_name" : "go-previous",
            "$ xns" : "Gtk"
           }
          ]
     },
     {
      "id" : "vbox",
-     "xtype" : "Box",
      "* pack" : "add",
+     "xtype" : "Box",
      "$ xns" : "Gtk",
      "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL",
      "$ homogeneous" : false,
        "items" : [
         {
          "id" : "leftpane",
-         "* pack" : "add1",
          "xtype" : "Box",
+         "* pack" : "add1",
          "$ xns" : "Gtk",
          "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL",
          "items" : [
           {
            "id" : "editpane",
-           "* pack" : "pack_start,true,true,0",
            "xtype" : "Paned",
+           "* pack" : "pack_start,true,true,0",
            "$ xns" : "Gtk",
            "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL",
            "items" : [
             {
              "id" : "tree",
-             "* pack" : "add1",
              "xtype" : "Box",
+             "* pack" : "add1",
              "$ xns" : "Gtk",
              "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL"
             },
             {
              "id" : "props",
-             "* pack" : "add2",
              "xtype" : "Box",
+             "* pack" : "add2",
              "$ xns" : "Gtk",
              "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL"
             }
                "items" : [
                 {
                  "* init" : "((Gtk.Container)(this.el.get_widget())).add ( child_0.el);",
-                 "* pack" : "add_child",
                  "xtype" : "Actor",
+                 "* pack" : "add_child",
                  "$ xns" : "GtkClutter",
                  "items" : [
                   {
                     "clicked" : "  ( ) => {\n //  if (_this.windowstate.state == WindowState.State.FILEPROJECT) {\n    \n//\t     _this.windowstate.switchState(WindowState.State.FILES);\n  //   } else { \n\t    _this.windowstate.switchState(WindowState.State.PREVIEW);\n  //  }\n    \n\n}"
                    },
                    "utf8 tooltip_text" : "Back",
-                   "xtype" : "Button",
                    "* pack" : false,
+                   "xtype" : "Button",
                    "width_request" : 50,
                    "$ xns" : "Gtk",
                    "height_request" : 50,
                    "items" : [
                     {
+                     "* pack" : "set_image",
                      "xtype" : "Image",
                      "utf8 icon_name" : "go-previous",
-                     "* pack" : "set_image",
                      "$ xns" : "Gtk"
                     }
                    ]
                "items" : [
                 {
                  "* init" : "((Gtk.Container)(this.el.get_widget())).add ( child_0.el);",
-                 "xtype" : "Actor",
                  "* pack" : "add_child",
+                 "xtype" : "Actor",
                  "$ xns" : "GtkClutter",
                  "items" : [
                   {
                    "height_request" : 50,
                    "items" : [
                     {
+                     "xtype" : "Image",
                      "utf8 icon_name" : "document-properties",
                      "* pack" : "set_image",
-                     "xtype" : "Image",
                      "$ xns" : "Gtk"
                     }
                    ]
                "items" : [
                 {
                  "* init" : "((Gtk.Container)(this.el.get_widget())).add ( child_0.el);",
-                 "xtype" : "Actor",
                  "* pack" : "add_child",
+                 "xtype" : "Actor",
                  "$ xns" : "GtkClutter",
                  "items" : [
                   {
                    "height_request" : 50,
                    "items" : [
                     {
+                     "* pack" : "set_image",
                      "xtype" : "Image",
                      "utf8 icon_name" : "emblem-system",
-                     "* pack" : "set_image",
                      "$ xns" : "Gtk"
                     }
                    ]
                "items" : [
                 {
                  "* init" : "((Gtk.Container)(this.el.get_widget())).add ( child_0.el);",
-                 "xtype" : "Actor",
                  "* pack" : "add_child",
+                 "xtype" : "Actor",
                  "$ xns" : "GtkClutter",
                  "items" : [
                   {
                    "height_request" : 50,
                    "items" : [
                     {
+                     "utf8 icon_name" : "list-add",
                      "* pack" : "set_image",
                      "xtype" : "Image",
-                     "utf8 icon_name" : "list-add",
                      "$ xns" : "Gtk"
                     }
                    ]
                "items" : [
                 {
                  "* init" : "((Gtk.Container)(this.el.get_widget())).add ( child_0.el);",
-                 "xtype" : "Actor",
                  "* pack" : "add_child",
+                 "xtype" : "Actor",
                  "$ xns" : "GtkClutter",
                  "items" : [
                   {
                    "height_request" : 50,
                    "items" : [
                     {
+                     "xtype" : "Image",
                      "utf8 icon_name" : "format-justify-left",
                      "* pack" : "set_image",
-                     "xtype" : "Image",
                      "$ xns" : "Gtk"
                     }
                    ]
                "items" : [
                 {
                  "* init" : "((Gtk.Container)(this.el.get_widget())).add ( child_0.el);",
-                 "xtype" : "Actor",
                  "* pack" : "add_child",
+                 "xtype" : "Actor",
                  "$ xns" : "GtkClutter",
                  "items" : [
                   {
                    "height_request" : 50,
                    "items" : [
                     {
+                     "* pack" : "set_image",
                      "xtype" : "Image",
                      "utf8 icon_name" : "appointment-new",
-                     "* pack" : "set_image",
                      "$ xns" : "Gtk"
                     }
                    ]
                "items" : [
                 {
                  "* init" : "((Gtk.Container)(this.el.get_widget())).add ( child_0.el);",
-                 "xtype" : "Actor",
                  "* pack" : "add_child",
+                 "xtype" : "Actor",
                  "$ xns" : "GtkClutter",
                  "items" : [
                   {
                    "height_request" : 50,
                    "items" : [
                     {
+                     "xtype" : "Image",
                      "utf8 icon_name" : "folder-new",
                      "* pack" : "set_image",
-                     "xtype" : "Image",
                      "$ xns" : "Gtk"
                     }
                    ]
                "items" : [
                 {
                  "* init" : "((Gtk.Container)(this.el.get_widget())).add ( child_0.el);",
-                 "xtype" : "Actor",
                  "* pack" : "add_child",
+                 "xtype" : "Actor",
                  "$ xns" : "GtkClutter",
                  "items" : [
                   {
                    "height_request" : 50,
                    "items" : [
                     {
+                     "utf8 icon_name" : "document-new",
                      "* pack" : "set_image",
                      "xtype" : "Image",
-                     "utf8 icon_name" : "document-new",
                      "$ xns" : "Gtk"
                     }
                    ]
                "items" : [
                 {
                  "* init" : "((Gtk.Container)(this.el.get_widget())).add ( child_0.el);",
-                 "xtype" : "Actor",
                  "* pack" : "add_child",
+                 "xtype" : "Actor",
                  "$ xns" : "GtkClutter",
                  "items" : [
                   {
                    "height_request" : 50,
                    "items" : [
                     {
+                     "xtype" : "Image",
                      "utf8 icon_name" : "user-trash",
                      "* pack" : "set_image",
-                     "xtype" : "Image",
                      "$ xns" : "Gtk"
                     }
                    ]
       },
       {
        "bool homogeneous" : false,
-       "* pack" : "pack_end,false,true,0",
        "xtype" : "Box",
+       "* pack" : "pack_end,false,true,0",
        "$ xns" : "Gtk",
        "Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL",
        "items" : [
         {
+         "string label" : "   ",
          "* pack" : "pack_start,true,true,0",
          "xtype" : "Label",
-         "string label" : "   ",
          "$ xns" : "Gtk"
         },
         {
          "bool show_text" : true,
-         "ulong handler_id" : "-1",
          "id" : "statusbar",
+         "ulong handler_id" : "-1",
          "* init" : "{\n     this.handler_id = Resources.singleton().updateProgress.connect((pos,total) => {\n        if (pos < 1) {\n            this.el.hide();\n            _this.mainpane.el.set_sensitive(true);\n            \n            return;\n        }\n         _this.mainpane.el.set_sensitive(false);\n         this.el.show();\n         this.el.set_fraction ((1.0f * pos) / (1.0f * total));\n         this.el.set_text(\"Fetching Resource : %s/%s\".printf(pos.to_string(), total.to_string()));\n       \n     });\n}\n",
          "xtype" : "ProgressBar",
          "* pack" : "pack_start,true,true,0",
            "$ xns" : "Gtk",
            "items" : [
             {
+             "utf8 icon_name" : "system-search",
              "* pack" : "set_image",
              "xtype" : "Image",
-             "utf8 icon_name" : "system-search",
              "bool sensitive" : false,
              "$ xns" : "Gtk"
             }
           },
           {
            "id" : "statusbar_compilestatus_label",
-           "* pack" : "add",
            "xtype" : "MenuItem",
+           "* pack" : "add",
            "string label" : "Compile Status:",
            "$ xns" : "Gtk"
           },
            "$ xns" : "Gtk",
            "items" : [
             {
+             "* pack" : "set_image",
              "xtype" : "Image",
              "utf8 icon_name" : "dialog-error",
-             "* pack" : "set_image",
              "$ xns" : "Gtk"
             }
            ]
            "$ xns" : "Gtk",
            "items" : [
             {
+             "utf8 icon_name" : "dialog-warning",
              "* pack" : "set_image",
              "xtype" : "Image",
-             "utf8 icon_name" : "dialog-warning",
              "$ xns" : "Gtk"
             }
            ]
            "$ xns" : "Gtk",
            "items" : [
             {
+             "xtype" : "Image",
              "utf8 icon_name" : "dialog-information",
              "* pack" : "set_image",
-             "xtype" : "Image",
              "$ xns" : "Gtk"
             }
            ]
            "$ xns" : "Gtk",
            "items" : [
             {
+             "utf8 icon_name" : "media-playback-start",
              "* pack" : "set_image",
              "xtype" : "Image",
-             "utf8 icon_name" : "media-playback-start",
              "$ xns" : "Gtk"
             }
            ]
         },
         {
          "id" : "statusbar_compile_spinner",
-         "* pack" : "add",
          "xtype" : "Spinner",
+         "* pack" : "add",
          "| void stop" : "() {\n this.el.stop();\n  this.el.hide();\n}\n",
          "string tooltip_text" : "Compiling",
          "$ xns" : "Gtk",
index 85a6707..a9bcb76 100644 (file)
@@ -12,8 +12,8 @@
     "closed" : "() => {\n  if (!this.done) {\n    _this.el.show();\n  \n  }\n} "
    },
    "|   void updateFileFromEntry" : "() {\n\n        _this.file.title = _this.title.el.get_text();\n        _this.file.region = _this.region.el.get_text();            \n        _this.file.parent = _this.parent.el.get_text();                        \n        _this.file.permname = _this.permname.el.get_text();                                    \n        _this.file.modOrder = _this.modOrder.el.get_text();\n        \n        if (_this.file.name.length  > 0 && _this.file.name != _this.name.el.get_text()) {\n            _this.file.renameTo(_this.name.el.get_text());\n        }\n        // store the module...\n        _this.file.build_module = \"\";        \n         Gtk.TreeIter iter; \n        if (_this.build_module.el.get_active_iter (out iter)) {\n             Value vfname;\n             this.dbmodel.el.get_value (iter, 0, out vfname);\n             if (((string)vfname).length > 0) {\n                 _this.file.build_module = (string)vfname;\n             }\n    \n        }\n        \n        \n\n                                                    \n}    ",
-   "@ void success" : "(Project.Project pr, JsRender.JsRender file)",
    "id" : "PopoverFileDetails",
+   "@ void success" : "(Project.Project pr, JsRender.JsRender file)",
    "| void show" : "(JsRender.JsRender c, Gtk.Widget btn) \n{\n    this.project = c.project;\n    this.done = false;\n    \n    \n    //if (!this.el) {\n        //this.init();\n     //}\n    \n    _this.name.el.set_text(c.name);\n    _this.title.el.set_text(c.title);\n    _this.parent.el.set_text(c.parent);    \n    _this.region.el.set_text(c.region);\n    _this.modOrder.el.set_text(c.modOrder);\n     _this.permname.el.set_text(c.permname);\n    \n    \n    \n    \n    \n    \n    \n    \n     var ar = new Gee.ArrayList<string>();\n     _this.dbmodel.loadData(ar,\"\");\n    // load the modules... if relivant..\n    if (this.project.xtype == \"Gtk\") {\n        var p = (Project.Gtk)c.project;\n          var cg = p.compilegroups;\n\n        var iter = cg.map_iterator();\n       while(iter.next()) {\n            var key = iter.get_key();\n            if (key == \"_default_\") {\n                continue;\n            }\n            ar.add(key);\n        };\n        _this.dbmodel.loadData(ar, c.build_module);\n\n    }\n    \n     \n    _this.file = c;\n    //console.log('show all');\n   this.el.set_modal(true);\n    this.el.set_relative_to(btn);\n\n    this.el.set_position(Gtk.PositionType.RIGHT);\n    \n    // window + header?\n     print(\"SHOWALL - POPIP\\n\");\n    this.el.show_all();\n    this.name.el.grab_focus();\n    \n    \n    \n    if (c.path.length > 0) {\n\t    this.save_btn.el.set_label(\"Save\");\n\t\t_this.filetype.el.hide();\n\t\t_this.filetypelbl.el.hide();\n\t\t_this.filetype.showhide(true); // as we only work on bjs files currently\n    } else {\n        this.save_btn.el.set_label(\"Create\");\n        _this.ftdbmodel.loadData(\"bjs\"); // fixme - need to determine type..\n\t    _this.filetype.el.show();\n\t    _this.filetypelbl.el.show();\n    }\n    \n    \n    //this.success = c.success;\n    \n    \n}",
    "bool done" : false,
    "# Project.Project project" : "",
@@ -27,8 +27,8 @@
    "items" : [
     {
      "bool homogeneous" : false,
-     "xtype" : "Box",
      "$ pack" : "add",
+     "xtype" : "Box",
      "$ xns" : "Gtk",
      "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL",
      "items" : [
          "* init" : "this.el.add_attribute(_this.ftdbcellrenderer.el , \"markup\", 1 );",
          "* pack" : "attach,1,0,1,1",
          "xtype" : "ComboBox",
-         "| void showhide" : "(bool is_bjs) {\n\tfor (var i = 2; i < 9;i++) {\n\t\tvar el = _this.grid.el.get_child_at(0,i);\n\t\t\n\t\tvar showhide= is_bjs;\n\t\tif (i> 7) {\n\t\t\tshowhide = !showhide;\n\t\t}\n\t\t\n\t\tif (showhide) {\n\t\t   el.show();\n\t\t} else {\n\t\t\tel.hide();\n\t\t}\n\t\t el = _this.grid.el.get_child_at(1,i);\n\t\tif (showhide) {\n\t\t   el.show();\n\t\t} else {\n\t\t\tel.hide();\n\t\t}     \n    }\n    // load up the directories\n    //??? why can we not create bjs files in other directories??\n\tif (!is_bjs && _this.file.path.length < 1) {\n\t\t_this.dirmodel.loadData();\n\t\t\n\t\t\n\t}\n   \n    \n}\n",
+         "| void showhide" : "(bool is_bjs) {\n\n\n\tif (_this.project.xtype != \"Roo\") {\n\t \tis_bjs = false;\n \t}\n\n\tfor (var i = 2; i < 9;i++) {\n\t\tvar el = _this.grid.el.get_child_at(0,i);\n\t\t\n\t\tvar showhide= is_bjs;\n\t\tif (i> 7) {\n\t\t\tshowhide = !showhide;\n\t\t}\n\t\t\n\t\tif (showhide) {\n\t\t   el.show();\n\t\t} else {\n\t\t\tel.hide();\n\t\t}\n\t\t el = _this.grid.el.get_child_at(1,i);\n\t\tif (showhide) {\n\t\t   el.show();\n\t\t} else {\n\t\t\tel.hide();\n\t\t}     \n    }\n    // load up the directories\n    //??? why can we not create bjs files in other directories??\n\t//if (!is_bjs && _this.file.path.length < 1) {\n\t\n\t\t_this.dirmodel.loadData();\n\t\t\n\t\t\n\t//}\n   \n    \n}\n",
          "$ xns" : "Gtk",
          "items" : [
           {
            "id" : "ftdbcellrenderer",
-           "* pack" : "pack_start,true",
            "xtype" : "CellRendererText",
+           "* pack" : "pack_start,true",
            "$ xns" : "Gtk"
           },
           {
            "id" : "ftdbmodel",
-           "* pack" : "set_model",
            "xtype" : "ListStore",
+           "* pack" : "set_model",
            "$ columns" : "typeof(string),typeof(string)",
            "n_columns" : 2,
            "$ xns" : "Gtk",
         },
         {
          "label" : "Region",
-         "$ visible" : true,
          "tooltip_text" : "center, north, south, east, west",
+         "$ visible" : true,
          "xalign" : 0.90000000000000002,
          "* pack" : "attach,0,3,1,1",
          "xtype" : "Label",
          "items" : [
           {
            "id" : "dbcellrenderer",
-           "xtype" : "CellRendererText",
            "* pack" : "pack_start,true",
+           "xtype" : "CellRendererText",
            "$ xns" : "Gtk"
           },
           {
            "id" : "dbmodel",
-           "xtype" : "ListStore",
            "* pack" : "set_model",
+           "xtype" : "ListStore",
            "$ columns" : "typeof(string),typeof(string)",
            "n_columns" : 2,
            "$ xns" : "Gtk",
          "items" : [
           {
            "id" : "dircellrenderer",
-           "* pack" : "pack_start,true",
            "xtype" : "CellRendererText",
+           "* pack" : "pack_start,true",
            "$ xns" : "Gtk"
           },
           {
            "id" : "dirmodel",
-           "* pack" : "set_model",
            "xtype" : "ListStore",
+           "* pack" : "set_model",
            "$ columns" : "typeof(string),typeof(string)",
            "n_columns" : 2,
            "$ xns" : "Gtk",
          "listeners" : {
           "clicked" : "() => { \n\n  _this.done = true;\n    _this.el.hide(); \n}"
          },
+         "string label" : "Cancel",
          "* pack" : "add",
          "xtype" : "Button",
-         "string label" : "Cancel",
          "$ xns" : "Gtk"
         },
         {
           "clicked" : "( ) =>  { \n\n \n\n\n\tif (_this.name.el.get_text().length  < 1) {\n\t    StandardErrorDialog.show(\n\t        _this.mainwindow.el,\n\t        \"You have to set Component name \"\n\t    );\n\t     \n\t    return;\n\t}\n\t// what does this do?\n\t\n\tvar isNew = _this.file.name.length  > 0 ? false : true;\n\t/*\n\tif (!isNew && this.file.name != _this.name.el.get_text()) {\n\t    Xcls_StandardErrorDialog.singleton().show(\n\t        this.el,\n\t        \"Sorry changing names does not work yet. \"\n\t    );\n\t     \n\t    return;\n\t}\n\t*/\n\t \n\t\n  \n\t// FIXME - this may be more complicated...\n\t//for (var i in this.def) {\n\t//    this.file[i] =  this.get(i).el.get_text();\n\t//}\n\n\tif (!isNew) {\n\t    try {\n\t         _this.updateFileFromEntry();\n\t     } catch( JsRender.Error.RENAME_FILE_EXISTS er) {\n\t          Xcls_StandardErrorDialog.singleton().show(\n\t            _this.mainwindow.el,\n\t            \"The name you used already exists \"\n\t        );\n\t        return;\n\t         \n\t     }\n\n\t      _this.done = true;\n\t    _this.file.save();\n\t    _this.el.hide();\n\t    return;\n\t}\n\t\n\t// ---------------- NEW FILES...\n\tGtk.TreeIter iter;\n\n\tif (!_this.filetype.el.get_active_iter(out iter)) {\n\t\t// should not happen...\n\t\t// so we are jut going to return without \n\t\tStandardErrorDialog.show(\n\t        _this.mainwindow.el,\n\t        \"You must select a file type. \"\n\t    );\n\t    return;\n\t\t \n\t}\n\t\n\t\n\tvar fn = _this.name.el.get_text();\n\t\n\tValue ftypename;\n\t_this.ftdbmodel.el.get_value (iter, 0, out ftypename);\n\tvar ext = ((string)ftypename);\n\tvar dir = _this.project.firstPath(); \n\tif (ext != \"bjs\") {\n\t \n\t\tif (!_this.dir.el.get_active_iter(out iter)) {\n\t\t\t// should not happen...\n\t\t\t// so we are jut going to return without \n\t\t\tStandardErrorDialog.show(\n\t\t\t    _this.mainwindow.el,\n\t\t\t    \"You must select a directory \"\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tValue vdir;\n\t\t_this.dirmodel.el.get_value (iter, 0, out vdir);\n\t\tdir = (string)vdir;\n\t}\n\t\n\tvar targetfile = dir + \"/\" + fn;\n\t\n\t// strip the file type off the end..\n\t\n\t\n    var rx = new GLib.Regex(\"\\\\.\" + ext + \"$\",GLib.RegexCompileFlags.CASELESS);\n    targetfile = rx.replace(targetfile, targetfile.length, 0, \"\"); \n   \n\tif (GLib.FileUtils.test(targetfile + \".\" + ext, GLib.FileTest.EXISTS)) {\n\t    Xcls_StandardErrorDialog.singleton().show(\n\t        _this.mainwindow.el,\n\t        \"That file already exists\"\n\t    ); \n\t    return;\n\t}\n   \n   var f =  JsRender.JsRender.factory(\n\t\text == \"bjs\" ? _this.file.project.xtype : \"PlainFile\",  \n\t\t_this.file.project, \n\t\ttargetfile + \".\" + ext);\n\n\t_this.file = f;\n\t\n\n\t\n\t_this.updateFileFromEntry();\n\t_this.file.loaded = true;\n\t_this.file.save();\n\tif (ext == \"bjs\") {\n\t\t_this.file.project.addFile(_this.file);\n\t}\n\t\n \n\t// what about .js ?\n   _this.done = true;\n\t_this.el.hide();\n\n// hopefull this will work with bjs files..\n\t\n\t_this.success(_this.project, _this.file);\n   \n}"
          },
          "id" : "save_btn",
-         "xtype" : "Button",
          "* pack" : "add",
+         "xtype" : "Button",
          "string label" : "Save",
          "$ xns" : "Gtk"
         }
index bb186e4..3cdfce2 100644 (file)
@@ -376,6 +376,12 @@ public class Xcls_PopoverFileDetails : Object
 
         // user defined functions
         public void showhide (bool is_bjs) {
+        
+        
+               if (_this.project.xtype != "Roo") {
+                       is_bjs = false;
+               }
+        
                for (var i = 2; i < 9;i++) {
                        var el = _this.grid.el.get_child_at(0,i);
                        
@@ -398,11 +404,12 @@ public class Xcls_PopoverFileDetails : Object
             }
             // load up the directories
             //??? why can we not create bjs files in other directories??
-               if (!is_bjs && _this.file.path.length < 1) {
+               //if (!is_bjs && _this.file.path.length < 1) {
+               
                        _this.dirmodel.loadData();
                        
                        
-               }
+               //}
            
             
         }
index ee0957d..cd5eb52 100644 (file)
@@ -2,7 +2,7 @@
  "name" : "WindowRightPalete",
  "parent" : "",
  "title" : "",
- "path" : "/home/alan/gitlive/app.Builder.js/src/Builder4/WindowRightPalete.bjs",
+ "path" : "/home/alan/gitlive/roobuilder/src/Builder4/WindowRightPalete.bjs",
  "permname" : "",
  "modOrder" : "",
  "build_module" : "builder",
@@ -21,8 +21,8 @@
    "items" : [
     {
      "id" : "viewbox",
-     "* pack" : "pack_start,true,true,0",
      "xtype" : "Box",
+     "* pack" : "pack_start,true,true,0",
      "$ xns" : "Gtk",
      "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL",
      "items" : [
@@ -66,8 +66,8 @@
            "items" : [
             {
              "id" : "txtrender",
-             "xtype" : "CellRendererText",
              "* pack" : "pack_start,true",
+             "xtype" : "CellRendererText",
              "$ xns" : "Gtk"
             }
            ]
index def2961..fb1a60a 100644 (file)
             "../Palete/CompletionProvider.vala",
             "../Builder4/PopoverProperty.vala",
             "../Builder4/ValaProjectSettingsPopover.vala",
-            "../Builder4/RooProjectSettings.vala"
+            "../Builder4/RooProjectSettings.vala",
+            "../Project/Flutter.vala",
+            "../Palete/Flutter.vala",
+            "../JsRender/Flutter.vala"
         ],
         "packages" : [
         ]
diff --git a/src/JsRender/Flutter.vala b/src/JsRender/Flutter.vala
new file mode 100644 (file)
index 0000000..cc69edc
--- /dev/null
@@ -0,0 +1,185 @@
+/**
+ * 
+ *  this is the code represents a File when using the Gtk view..
+ *   
+ *  It ues NodeToGtk
+ * 
+ * 
+ */
+
+namespace JsRender {
+
+
+       
+
+  
+       public  class Flutter : JsRender
+       {
+          static int fid = 1;
+
+           public Flutter(Project.Project project, string path) {
+           
+               base( project, path);
+               this.xtype = "Flutter";
+               this.language = "dart";
+                
+               this.id = "file-flutter-%d".printf(fid++);
+          
+
+               
+               
+           }
+             
+
+               public   override void   removeFiles() {
+               /*
+                       var js = GLib.Path.get_dirname(this.path) +"/" +  name + ".js";
+                       if (FileUtils.test(js, FileTest.EXISTS)) {
+                               GLib.FileUtils.remove(js);
+                       }
+                       var vala = GLib.Path.get_dirname(this.path) +"/" + name + ".vala";
+                       if (FileUtils.test(vala, FileTest.EXISTS)) {
+                               GLib.FileUtils.remove(vala);
+                       }
+                       */
+               }
+           
+               public   override void  loadItems() throws GLib.Error // : function(cb, sync) == original was async.
+               {
+                 
+                       print("load Items!\n");
+                       if (this.tree != null) {
+                               this.loaded = true;
+                       
+                               return;
+                       }
+                       /*
+                       print("load: %s\n" , this.path);
+                       if (!GLib.FileUtils.test(this.path, GLib.FileTest.EXISTS)) {
+                               // new file?!?
+                               this.tree = null;
+                               this.loaded = true;
+                               return;
+                       }
+                       */
+
+                       var pa = new Json.Parser();
+                       pa.load_from_file(this.path);
+                       var node = pa.get_root();
+               
+                       if (node.get_node_type () != Json.NodeType.OBJECT) {
+                               throw new Error.INVALID_FORMAT ("Unexpected element type %s", node.type_name ());
+                       }
+                       var obj = node.get_object ();
+               
+                       this.name = obj.get_string_member("name");
+                       this.parent = obj.get_string_member("parent");
+                       this.title = obj.get_string_member("title");
+               
+                        
+                       // load items[0] ??? into tree...
+                       var bjs_version_str = this.jsonHasOrEmpty(obj, "bjs-version");
+                       bjs_version_str = bjs_version_str == "" ? "1" : bjs_version_str;
+
+                       if (obj.has_member("items") 
+                               && 
+                               obj.get_member("items").get_node_type() == Json.NodeType.ARRAY
+                               &&
+                               obj.get_array_member("items").get_length() > 0
+                       ) {
+                               var ar = obj.get_array_member("items");
+                               var tree_base = ar.get_object_element(0);
+                               this.tree = new Node();
+                               this.tree.loadFromJson(tree_base, int.parse(bjs_version_str));
+
+                       }
+                       //NodeToVala.mungeFile(this); // force line numbering..
+                       this.loaded = true;
+               
+               }
+            
+           
+       
+           public override string toSourcePreview()
+           {
+                       return "";
+               }
+           public override void setSource(string str) {}
+           
+           public override string toSourceCode() // no seed support currently.
+           {
+                   return  ""; ///NodeToVala.mungeFile(this);
+           }
+           
+           // this is only used by dumping code...
+           public override string toSource() // no seed support currently.
+           {
+                
+                        
+               return "";
+               
+               
+           }
+       
+           public override void save() {
+               this.saveBJS();
+               // this.saveJS(); - disabled at present.. project settings will probably enable this later..
+       
+               //this.saveVala();
+           }
+               // ignore these calls.
+           public override void saveHTML ( string html ) {}
+               
+                       
+           /** 
+            *  saveJS
+            * 
+            * save as a javascript file. - not used currently
+            * why is this not save...???
+            * 
+            
+             
+           void saveJS()
+           {
+                
+               var fn = GLib.Path.get_dirname(this.path) + "/" + this.name + ".js";
+               print("WRITE :%s\n " , fn);
+               this.writeFile(fn, this.toSource());
+               
+           }
+           */
+          void  saveVala()
+           {
+                       /*if (this.tree == null) {
+                               return;
+                       }
+                       var fn = GLib.Path.get_dirname(this.path) + "/" + this.name + ".vala";
+                       print("WRITE :%s\n " , fn);
+                       this.writeFile(fn,  NodeToVala.mungeFile(this));
+               */
+               
+           }
+        
+           
+   
+           string getHelpUrl(string cls)
+           {
+               return "http://devel.akbkhome.com/seed/" + cls + ".html";
+           }
+           public override void  findTransStrings(Node? node )
+               {
+                       // not yet..
+               }
+
+           
+         
+
+       
+
+       }
+}
+
+
+
index 26cc168..a608052 100644 (file)
@@ -124,6 +124,8 @@ namespace JsRender {
                                        return new Gtk(project, path);
                                case "Roo":
                                        return new Roo(project, path);
+                       case "Flutter":
+                                       return new Flutter(project, path);
                                case "PlainFile":
                                        return new PlainFile(project, path);
                        }
index f65ffad..16108f0 100644 (file)
@@ -9,127 +9,20 @@ int main (string[] args) {
        
        
        
-       new JsRender.Lang_Class();
+       new JsRender.Lang_Class();
 
        var app =  BuilderApplication.singleton(  args);
+         
+    Gtk.init (ref args);
+       GtkClutter.init (ref args);
        
-       if (BuilderApplication.opt_debug  || BuilderApplication.opt_compile_project == null) {
-               GLib.Log.set_handler(null, 
-                       GLib.LogLevelFlags.LEVEL_DEBUG | GLib.LogLevelFlags.LEVEL_WARNING, 
-                       (dom, lvl, msg) => {
-                       print("%s: %s\n", dom, msg);
-               });
-       }
-       
-     
-       if (BuilderApplication.opt_list_projects) {
-                
-               //BuilderApplication.compileBjs();
-        Project.Project.loadAll();
-               print("Projects\n %s\n", Project.Project.listAllToString());
-               GLib.Process.exit(Posix.EXIT_SUCCESS);
-       }
-    Project.Project.loadAll();
-    
-    if (BuilderApplication.opt_list_projects) {
-                
-               //BuilderApplication.compileBjs();
-
-               print("Projects\n %s\n", Project.Project.listAllToString());
-               GLib.Process.exit(Posix.EXIT_SUCCESS);
-       }
-       Project.Project cur_project = null;
-    if (BuilderApplication.opt_compile_project != null) {
-                
-                
-               cur_project = Project.Project.getProjectByHash( BuilderApplication.opt_compile_project);
-               
-               if (cur_project == null) {
-                       GLib.error("invalid project %s, use --list-projects to show project ids",BuilderApplication.opt_compile_project);
-               }
-               cur_project.scanDirs();
-               
-               
-       }
-       
-       if (BuilderApplication.opt_list_files) {
-               if (cur_project == null) {
-                       GLib.error("missing project, use --project to select which project");
-               }
-               print("Files for %s\n %s\n", cur_project.name, cur_project.listAllFilesToString());
-               GLib.Process.exit(Posix.EXIT_SUCCESS);
-       }
-    
-    if (BuilderApplication.opt_bjs_compile != null) {
-               if (cur_project == null) {
-                       GLib.error("missing project, use --project to select which project");
-               }       
-               var file = cur_project.getByName(BuilderApplication.opt_bjs_compile);
-               if (file == null) {
-                       GLib.error("missing file %s in project %s", BuilderApplication.opt_bjs_compile, cur_project.name);
-               }
-               //BuilderApplication.compileBjs();
-               file.loadItems();
-        var str = file.toSourceCode();
-          
-          
-        if (!BuilderApplication.opt_debug) {
-               print("%s", str);
-               GLib.Process.exit(Posix.EXIT_SUCCESS);
-               }
-               
-               // dump the node tree
-               file.tree.dumpProps();
-               
-               
-        var str_ar = str.split("\n");
-        for(var i =0;i<str_ar.length;i++) {
-               var node = file.tree.lineToNode(i+1);
-               var prop = node == null ? null : node.lineToProp(i+1);
-               print("%d: %s   :  %s\n", 
-                       i+1, 
-                       node == null ? "......"  : (prop == null ? "????????" : prop),
-                       str_ar[i]
-                       );
-        }
-               
-               GLib.Process.exit(Posix.EXIT_SUCCESS);
-       }
-       
-    
-       if (BuilderApplication.opt_compile_target != null) {
-                
-               Palete.ValaSourceCompiler.buildApplication();
-               
-               GLib.Process.exit(Posix.EXIT_SUCCESS);
-       }
-       
-        
-       
-       GLib.debug("project = %s\n", BuilderApplication.opt_compile_project);
        
-       Gtk.init (ref args);
-        
-       GtkClutter.init (ref args);
        // not sure why this was done?? - it caused crash bugs on gtk_Box_gadget so removed critical.
        // GLib.Log.set_always_fatal(LogLevelFlags.LEVEL_ERROR | LogLevelFlags.LEVEL_CRITICAL); 
        GLib.Log.set_always_fatal(LogLevelFlags.LEVEL_ERROR ); 
-       
-    
-    
-    // respond to other arguments
-    
-       /*var proj = Project.Project.getProject("Pman.Core");
-       if (proj == null) {
-               print("could not load test project Pman.Core");
-               return 0;
-       }
-       proj.scanDirs();
-       */
+        
 
        var w = Xcls_MainWindow.singleton();
-       //w.ref();
-       //w.project = proj;
        
        w.el.show_all();
        // it looks like showall after children causes segfault on ubuntu 14.4
@@ -137,6 +30,7 @@ int main (string[] args) {
        w.windowstate.switchState(WindowState.State.FILES);
        
        Gtk.main();
+       
     app = null;
        
        return 0;
index 6acaa66..e1cbd70 100644 (file)
@@ -78,8 +78,7 @@ AM_CPPFLAGS =  $(ROOBUILDER_CFLAGS) $(WEBKIT_CFLAGS) $(GDA_CFLAGS) $(LIBVALA_CFL
 bin_PROGRAMS = roobuilder
 
  
-roobuilder_PKGS = \
-               --pkg glib-2.0  \
+roobuilder_PKGS = --pkg glib-2.0  \
                --pkg gobject-2.0  \
                --pkg  gtk+-3.0 \
                --pkg  gtksourceview-3.0 \
@@ -87,20 +86,19 @@ roobuilder_PKGS = \
                --pkg json-glib-1.0 \
                --pkg gee-0.8 \
                --pkg gobject-introspection-1.0 \
-               --pkg clutter-gtk-1.0 \ 
+               --pkg clutter-gtk-1.0 \
                --pkg libsoup-2.4 \
                --pkg javascriptcore \
-               --pkg roojspacker-1.1 \
+               --pkg roojspacker-1.2 \
                $(roobuilder_LIBVALA) \
                $(roobuilder_GDA) \
                $(roobuilder_WEBKKIT) \
                $(roobuilder_JAVASCRIPTCOREGTK) \
                $(roobuilder_VTE) \
-               --pkg posix 
+               --pkg posix
 
 
-BUIDERJSRENDER = \
-               JsRender/Gtk.vala \
+BUIDERJSRENDER = JsRender/Gtk.vala \
                JsRender/PlainFile.vala \
                JsRender/JsRender.vala \
                JsRender/Lang.vala \
@@ -108,15 +106,16 @@ BUIDERJSRENDER = \
                JsRender/NodeToJs.vala \
                JsRender/NodeToVala.vala \
                JsRender/Node.vala \
+               JsRender/Flutter.vala \
                JsRender/Roo.vala 
 
 
 
-BUIDERPALETE = \
-               Palete/Gir.vala \
+BUIDERPALETE =  Palete/Gir.vala \
                Palete/GirObject.vala \
                Palete/VapiParser.vala \
                Palete/Gtk.vala \
+               Palete/Flutter.vala \
                Palete/RooDatabase.vala \
                c/jscore_object_call_as_function.c \
                Palete/Javascript.vala \
@@ -126,14 +125,13 @@ BUIDERPALETE = \
                Palete/ValaSourceCompiler.vala \
                Palete/CompletionProvider.vala
         
-BUIDERPROJECT = \
-               Project/Gtk.vala \
+BUIDERPROJECT = Project/Gtk.vala \
                Project/Project.vala \
+               Project/Flutter.vala \
                Project/Roo.vala 
 
 
-BUIDERUI = \
-               Builder4/About.vala \
+BUIDERUI =     Builder4/About.vala \
                Builder4/DialogConfirm.vala \
                Builder4/StandardErrorDialog.vala \
                Builder4/DialogSaveTemplate.vala \
@@ -161,8 +159,7 @@ BUIDERUI = \
                Builder4/ValaCompileResults.vala \
                Builder4/PopoverProperty.vala
         
-roobuilder_SOURCES = \
-               Application.vala \
+roobuilder_SOURCES =  Application.vala \
                Main.vala \
                Spawn.vala \
                Resources.vala  \
@@ -176,10 +173,9 @@ roobuilder_SOURCES = \
                
                
  
-roobuilder_VALAFLAGS = \
-        --thread -X -lm --target-glib=2.32 --vapidir=$(srcdir)/vapi -g  $(roobuilder_PKGS)
+roobuilder_VALAFLAGS =  --thread -X -lm --target-glib=2.32 --vapidir=$(srcdir)/vapi -g  $(roobuilder_PKGS)
 
-roobuilder_LDADD =  $(ROOBUILDER_LIBS) $(LIBVALA_LIBS) $(GDA_LIBS) $(WEBKIT_LIBS) $(VTE_LIBS) $(JAVASCRIPTCOREGTK_LIBS)
+roobuilder_LDADD = $(ROOBUILDER_LIBS)  $(LIBVALA_LIBS) $(GDA_LIBS) $(WEBKIT_LIBS) $(VTE_LIBS) $(JAVASCRIPTCOREGTK_LIBS)
 
  
 
diff --git a/src/Palete/Flutter.vala b/src/Palete/Flutter.vala
new file mode 100644 (file)
index 0000000..8659649
--- /dev/null
@@ -0,0 +1,270 @@
+using Gtk;
+namespace Palete {
+
+
+       public class UsageMap : Object
+       {
+               Gee.HashMap<string,Gee.ArrayList<string>> implementors;
+               Gee.HashMap<string,string> childType;
+               Gee.HashMap<string,int> no_children;
+               Gee.HashMap<string,bool> is_abstract;
+           Gee.HashMap<string,Gee.ArrayList<string>> extends;
+           
+               public UsageMap() 
+               {
+                       this.implementors = new Gee.HashMap<string,Gee.ArrayList<string>>();
+                       this.extends = new Gee.HashMap<string,Gee.ArrayList<string>>();
+                       this.childType = new Gee.HashMap<string,string>();
+                       this.no_children = new Gee.HashMap<string,int>();
+                       this.is_abstract = new Gee.HashMap<string,bool>();                      
+                       var pa = new Json.Parser();
+                       pa.load_from_file(BuilderApplication.configDirectory() + "/resources/flutter_tree.json");
+
+                       var node = pa.get_root();
+                       this.addArray(node.get_array());
+                       
+                       this.removeNonChild();
+               } 
+               
+
+               private void addArray(Json.Array ar)
+               {
+                       for(var i=0;i< ar.get_length();  i++) {
+                               this.addObject(ar.get_object_element(i));
+                       }
+               }
+               private void addObject(Json.Object o)
+               {
+                       
+                       this.addArray(o.get_array_member("cn"));
+                       
+                       var name = o.get_string_member("name");
+                       if (!o.get_boolean_member("is_class")) {
+                               return;
+                       }
+                       if (o.get_array_member("implementors").get_length() > 0) {
+                               this.implementors.set(name , this.jsonStringArray(o.get_array_member("implementors")));
+                       }
+                       if (o.get_array_member("extends").get_length() > 0) {
+                               this.extends.set(name , this.jsonStringArray(o.get_array_member("extends")));
+                       }                       
+                       if (o.get_string_member("childtype").length > 0) {
+                               this.childType.set( name, o.get_string_member("childtype"));
+                               this.no_children.set( name, (int) o.get_int_member("childtypes"));
+                       }
+                       
+               }
+               private  Gee.ArrayList<string> jsonStringArray(Json.Array ar)
+               {
+                       var ret = new Gee.ArrayList<string>();
+                       for(var i=0;i< ar.get_length();  i++)  {
+                               ret.add(ar.get_string_element(i));
+                       }
+                       return ret;
+               }
+               public void removeNonChild()
+               {
+                       // do we need to clean this up?
+                       // remove all the unrelated objects?
+               }
+               public Gee.ArrayList<string> possibleChildrenOf(string n)
+               {
+                       GLib.debug("possibleChildrenOf %s", n);
+                       var ret = new Gee.ArrayList<string>();
+                       if (!this.childType.has_key(n)) {
+                               return ret;
+                       }
+                       
+                       var ch = this.childType.get(n);
+                       GLib.debug("childType %s", ch);
+                       
+                       if (this.is_abstract.has_key(ch)  && !this.is_abstract.get(ch)) {
+                               GLib.debug("add Implementor (self) %s", ch);                    
+                               ret.add(ch); // it's not abstract...
+                       }
+
+                       if (!this.implementors.has_key(ch)) {
+                               return ret;
+                       }
+                       foreach(var k in this.implementors.get(ch)) {
+                               GLib.debug("add Implementor %s", k);
+                               ret.add(k);
+                       }
+                       return ret;
+               }
+               public Gee.ArrayList<string> possibleParentsOf(string n)
+               {
+                       
+                       // basically a list of all the types that accept this type, or it's parents..
+                       // find a list of parents.
+                       
+                       var ret = new Gee.ArrayList<string>();
+                       if (!this.extends.has_key(n)) {
+                               return ret;
+                       }
+                       var ch = this.extends.get(n);
+
+                       foreach(var k in this.childType.keys) {
+                               if (ch.contains(this.childType.get(k))) {
+                                       ret.add(k);
+                               }
+                       }
+
+                       return ret;
+               }
+               
+               
+               public Gee.ArrayList<string> implementorsOf(string n)
+               {
+                       var ret = new Gee.ArrayList<string>();
+                       foreach(var k in this.implementors.get(n)) {
+                               ret.add(k);
+                       }
+                       return ret;
+               }
+               
+               public bool is_a(string cls, string subclass) {
+                       return this.extends.get(cls).contains(subclass);
+               }
+               
+               public void dump()
+               {
+                       foreach (var k  in this.implementors.keys) {
+                               GLib.debug("cls: %s : imps: %d", k, this.implementors.get(k).size);
+                       }
+                       foreach (var k  in this.childType.keys) {
+                               GLib.debug("cls: %s : child: %s", k, this.childType.get(k));
+                       }
+                       foreach (var k  in this.extends.keys) {
+                               var s = "";
+                               foreach(var v in this.extends.get(k)) {
+                                       s+=v +", ";
+                               }
+                               GLib.debug("cls: %s : extends: %s", k,s);
+                       }
+               }
+               
+       }
+
+
+       public class Flutter : Palete {
+               
+               //public Gee.ArrayList<string> package_cache;
+               static UsageMap usagemap = null;
+               
+               public Flutter(Project.Flutter project)
+               {
+                        base(project);
+                   this.name = "Flutter";
+                   //var context = new Vala.CodeContext ();
+                        
+                   //this.package_cache = this.loadPackages(Path.get_dirname (context.get_vapi_path("glib-2.0")));
+                   //this.package_cache.add_all(
+                        //   this.loadPackages(Path.get_dirname (context.get_vapi_path("gee-0.8")))
+                   //);
+                               //this.load();
+                   // various loader methods..
+                     //this.map = [];
+                   //this.load();
+                   //this.proplist = {};
+                   //this.comments = { }; 
+                   if (Flutter.usagemap == null) {
+                       Flutter.usagemap = new UsageMap();
+               }
+                   // no parent...
+               }
+               public override void  load () {
+                       // in Roo & Gtk, usage is loaded here.. but it;s already called in the Ctor.??
+                       //GLib.error("should not get here?");
+               }
+               
+               public override GirObject? getClass(string ename)
+               {
+
+                       GLib.error("not supported");
+                
+                       return null;
+               
+               }
+               public override Gee.HashMap<string,GirObject> getPropertiesFor( string ename, string type)  
+               {
+               
+                       GLib.error("not supported");
+               
+                       return new Gee.HashMap<string,GirObject>();
+               }
+               
+               public override void fillPack(JsRender.Node node,JsRender.Node parent)
+               {   
+                       return; // flutter does not have pack...
+               }
+               public override bool  typeOptions(string fqn, string key, string type, out string[] opts) 
+               {
+                       GLib.error("not supported");
+                       opts = {};
+                       return false;
+               }
+               public override  List<SourceCompletionItem> suggestComplete(
+                               JsRender.JsRender file,
+                               JsRender.Node? node,
+                               string proptype, 
+                               string key,
+                               string complete_string
+               ) { 
+                               return new List<SourceCompletionItem>();
+               }
+               Gee.HashMap<string,Gee.ArrayList<string>> implementors;
+               void loadFlutterUsageFile()
+               {
+                       this.usagemap = new UsageMap();
+               }
+               
+               public override string[] getChildList(string in_rval)
+               {
+                       GLib.debug("getChildlist %s", in_rval);
+                        // for top level:
+                        // StatelessWidget  (or a generic 'statefull_myname extends State<myname>')
+                        //both have a single child that is a widget
+                       if (in_rval == "*top") {
+                               return { "widgets.StatelessWidget" , "widgets.StatefullWidget" };
+                       }
+                       Gee.ArrayList<string> ar = new Gee.ArrayList<string>();
+                       if (in_rval == "widgets.StatelessWidget" || in_rval == "widgets.StatefullWidget") {
+                               ar = this.usagemap.implementorsOf("widgets.Widget");
+                       } else {
+                               
+                               ar = this.usagemap.possibleChildrenOf(in_rval);
+                       }
+                        string[] ret = {};
+                        foreach(var k in ar) {
+                               ret += k;
+                        }
+                        return ret;
+                       
+               }
+               public override string[] getDropList(string rval)
+               {
+                       var ar =  this.usagemap.possibleParentsOf(rval);
+                       if (this.usagemap.is_a(rval,   "widgets.Widget")) {
+                               ar.add("widgets.StatelessWidget");
+                               ar.add( "widgets.StatefullWidget");
+                       }
+                       
+                       string[] ret = {};
+                        foreach(var k in ar) {
+                               ret += k;
+                        }
+                        return ret;
+               }       
+               
+               public void dumpusage()
+               {
+                       this.usagemap.dump();
+               
+               }
+        
+               
+       }
+}
\ No newline at end of file
index 72409a7..a2f4941 100644 (file)
@@ -543,7 +543,15 @@ namespace Palete {
                        
                        return ret;
                }
-       
+               
+               public override string[] getChildList(string in_rval)
+        {
+               return this.original_getChildList(  in_rval);
+       }
+               public override string[] getDropList(string rval)
+               {
+                       return this.default_getDropList(rval);
+               }       
     }
 }
  
index f962cbd..0b2d3fb 100644 (file)
@@ -196,7 +196,7 @@ namespace Palete {
                         return (string) buf;
                        
                }
-               
+                
                
 
        }
index 529b97f..f29cc01 100644 (file)
@@ -105,9 +105,9 @@ namespace Palete
 
             
          
-
+               // this is the old verison using 'Usage'... see flutter for a better version..
            
-               public string[] getChildList(string in_rval)
+               public string[] original_getChildList(string in_rval)
         {
 
                        if (this.map == null) {
@@ -150,7 +150,8 @@ namespace Palete
         }
 
            
-        public string[] getDropList(string rval)
+           
+        public string[] default_getDropList(string rval)
         {
 
                        if (this.map == null) {
@@ -469,6 +470,10 @@ namespace Palete
                                string key,
                                string complete_string
                );
+               public abstract string[] getChildList(string in_rval);
+               public abstract string[] getDropList(string rval);              
+               
+               
        }
 
 
index 6848c35..89c1bf0 100644 (file)
@@ -415,6 +415,14 @@ namespace Palete {
                        
                        return ret;
                }
+               public override string[] getChildList(string in_rval)
+        {
+               return this.original_getChildList(  in_rval);
+       }
+               public override string[] getDropList(string rval)
+               {
+                       return this.default_getDropList(rval);
+               }       
     }
 }
  
diff --git a/src/Project/Flutter.vala b/src/Project/Flutter.vala
new file mode 100644 (file)
index 0000000..cc9df3a
--- /dev/null
@@ -0,0 +1,66 @@
+/**
+ Deps:
+    Palete.Flutter
+    
+*/
+
+namespace Project 
+{
+       static int fl_id = 1;
+
+       public class Flutter : Project
+       {
+               /**
+               * Gir cache - it's local as we might want clear it if we modify the packages...
+               *
+               */
+               //public Gee.HashMap<string,Palete.Gir> gir_cache = null;
+               //public bool gir_cache_loaded = false;
+         
+               public Flutter(string path) {
+                 
+                 
+                       base(path);
+                        this.palete = new Palete.Flutter(this);
+                       
+                       //this.gir_cache = new Gee.HashMap<string,Palete.Gir>();
+                       this.xtype = "Flutter";
+                       var gid = "project-flutter-%d".printf(gtk_id++);
+                       this.id = gid;
+                       try {
+                               this.loadConfig();
+                       } catch (GLib.Error e )  {
+                               // is tihs ok?
+                       }
+                       //scan files..
+                       // if no 'pubspec.yml' ... then we need to run flutter create...
+                       this.scanDirs();
+               
+               }
+                
+               public void loadConfig() throws GLib.Error 
+               {
+                       // ?? read the yaml file?
+                       
+                       // ?? read the 'iml' xml files - contains librayr info?
+                       
+                
+               }
+               public void  writeConfig() {}
+               
+               public Gee.ArrayList<string> filesAll(string in_path,bool abspath = true)
+               {
+                       GLib.error("Not supported yet");
+               }
+               public Gee.ArrayList<string> filesForCompile(string in_path, bool abspath = true) {
+                       GLib.error("Not supported yet");
+               }
+               
+               public Gee.ArrayList<string> filesForOpen(string in_path)
+               {
+                       GLib.error("Not supported yet");
+               }
+       }
+}
\ No newline at end of file
index 7dac6e2..e7a098b 100644 (file)
@@ -284,6 +284,8 @@ namespace Project {
                                        return new Gtk(path);
                                case "Roo":
                                        return new Roo(path);
+                               case "Flutter":
+                                       return new Flutter(path);
                        }
                        throw new Error.INVALID_TYPE("invalid project type");
                                
@@ -514,7 +516,7 @@ namespace Project {
                        var xt = this.xtype;
                        return JsRender.JsRender.factory(xt, this, path);
                        
-               }
+               } 
                
                public JsRender.JsRender create(string filename)
                {
@@ -548,6 +550,7 @@ namespace Project {
                        this.on_changed();
                        
                }
+                
                public void  scanDirs() // cached version
                {
                        if (this.is_scanned) {
@@ -557,7 +560,7 @@ namespace Project {
                        //console.dump(this.files);
                        
                }
-               
+                
                public void  scanDirsForce()
                {
                        this.is_scanned = true;  
@@ -581,6 +584,8 @@ namespace Project {
                                return;
                        }
                        // this should be done async -- but since we are getting the proto up ...
+                       var other_files = new Gee.ArrayList<string>();
+                       var bjs_files = new Gee.ArrayList<string>();
                        
                        var subs = new GLib.List<string>();;            
                        var f = File.new_for_path(dir);
@@ -605,30 +610,12 @@ namespace Project {
                                        }
                                        
                                        if (!Regex.match_simple("\\.bjs$", fn)) {
+                                               other_files.add(fn);
                                                //print("no a bjs\n");
                                                continue;
                                        }
-                                       /*
-                                       var parent = "";
-                                       //if (dp > 0 ) {
-                                       
-                                       var sp = dir.split("/");
-                                       var parent = "";
-                                       for (var i = 0; i < sp.length; i++) {
-                                               
-                                       }
-                                       
-                                       /*
-                                       sp = sp.splice(sp.length - (dp +1), (dp +1));
-                                       parent = sp.join('.');
-                                       
-                                       
-                                       if (typeof(_this.files[dir  + '/' + fn]) != 'undefined') {
-                                               // we already have it..
-                                               _this.files[dir  + '/' + fn].parent = parent;
-                                               return;
-                                       }
-                                       */
+                                       bjs_files.add(fn.substring(0, fn.length-4));
+                                       
                                        var xt = this.xtype;
                                        var el = JsRender.JsRender.factory(xt,this, dir + "/" + fn);
                                        this.files.set( dir + "/" + fn, el);
@@ -641,8 +628,18 @@ namespace Project {
                        } catch (GLib.Error e) {
                                GLib.warning("Project::scanDirs failed : " + e.message + "\n");
                        }
+                       foreach(var fn in other_files) {
+                               var dpos = fn.last_index_of(".");
+                               var without_ext = fn.substring(0, dpos);
+                               if (bjs_files.contains(without_ext)) {
+                                       continue;
+                               }
+                               GLib.debug("Could have added %s/%s", dir, fn);
+                               //var el = JsRender.JsRender.factory("plain",this, dir + "/" + fn);
+                               //this.files.set( dir + "/" + fn, el);
+                       }
+                       
                        for (var i = 0; i < subs.length(); i++) {
-                               
                                 this.scanDir(subs.nth_data(i), dp+1);
                        }
                        
index ef10dbf..0f5644d 100644 (file)
@@ -87,6 +87,7 @@ public class Resources : Object
        {       
                string[] avail_files = { 
                        "roodata.json",
+                       "flutter_tree.json",
                        "*",
                        "Editors/*.js",
                        "vapi/*"
@@ -99,8 +100,11 @@ public class Resources : Object
                         
                        if (target == "roodata.json") {
                                src = "https://raw.githubusercontent.com/roojs/roojs1/master/docs/json/roodata.json";
-                               //src = "http://git.roojs.org/?p=roojs1;a=blob_plain;f=docs/json/roodata.json";
                        }
+                       if (target == "flutter_tree.json") {
+                               src = "https://raw.githubusercontent.com/roojs/flutter-docs-json/master/tree.json";
+                       }
+                       
                        if (target.contains("*")) {
                                var split = target.split("*");
                                
diff --git a/tools/flutter_extract.php b/tools/flutter_extract.php
new file mode 100644 (file)
index 0000000..b372b05
--- /dev/null
@@ -0,0 +1,296 @@
+<?php
+
+// in flutter - an event is actually a property..?
+
+// we have 2 types of data - the overall summary, and the 'detail one we use for docs..
+//
+/*
+ TODO:
+  Generics CompoundAnimation<T> ... or 
+      children â†’ List<Widget>  << fixed..
+    material/PopupMenuEntry-class.html     
+    http://localhost/roojs1/docs/?/flutter/#material.PopupMenuDivider
+      
+      
+  Constants on Libraries.. /? classes?
+  
+  Abstracts - no need to show them in menu?
+   
+  extends link:
+  source link?
+  generic links...
+  
+  
+  config --- constructor links...
+  
+  
+ */
+
+require_once 'flutter_nodes.php'; // the classes..
+
+define( 'FDIR', '/home/alan/Downloads/flutterdocs/flutter/');
+define( 'TDIR', '/home/alan/gitlive/flutter-docs-json/');
+
+ /*
+$c = new eClass(array(
+    'name' => 'dart:core.List',
+    'href' => 'dart-core/List-class.html',
+    'memberOf' => 'dart:core',
+    'dtype' => 'class' 
+));
+
+// let's do some testing...
+$c = new eClass(array(
+    'name' => 'dart:core.Object',
+    'href' => 'dart-core/Object-class.html',
+    'memberOf' => 'dart:core',
+    'dtype' => 'class' 
+));
+
+$c = new eClass(array(
+    'name' => 'foundation.Diagnosticable',
+    'href' => 'foundation/Diagnosticable-class.html',
+    'memberOf' => 'foundation',
+    'dtype' => 'class' 
+));
+
+$c = new eClass(array(
+    'name' => 'foundation.DiagnosticableTree',
+    'href' => 'foundation/DiagnosticableTree-class.html',
+    'memberOf' => 'foundation',
+    'dtype' => 'class' 
+));
+
+
+
+$c = new eClass(array(
+    'name' => 'widgets.Widget',
+    'href' => 'widgets/Widget-class.html',
+    'memberOf' => 'widgets',
+    'dtype' => 'class'
+));
+$c = new eClass(array(
+    'name' => 'widgets.StatelessWidget',
+    'href' => 'widgets/StatelessWidget-class.html',
+    'memberOf' => 'widgets',
+    'dtype' => 'class'
+));
+
+$c = new eClass(array(
+    'name' => 'widgets.StatelessWidget',
+    'href' => 'widgets/StatelessWidget-class.html',
+    'memberOf' => 'widgets',
+    'dtype' => 'class'
+));
+
+$c = new eClass(array(
+    'name' => 'material.AboutDialog',
+    'href' => 'material/AboutDialog-class.html',
+    'memberOf' => 'material',
+    'dtype' => 'class'
+));
+  $add =  new Prop(array(
+                'name' => 'children',
+                'href' => 'material/AboutDialog/children.html',
+                'memberOf' => 'material.AboutDialog'
+            ));
+            
+            $c->props[] = $add;
+
+$c->readDocs();
+print_r($c);
+exit;
+*/
+
+
+$js = json_decode(file_get_contents(FDIR.'index.json'));
+
+foreach($js as $o) {
+   
+    
+    switch($o->type) {
+        case 'library':
+            new Ns(array(
+                'name' => $o->name,
+                'href' => $o->href
+            ));
+            
+            break;
+            
+        case 'class':
+        case 'mixin':
+        case 'enum':
+        case 'typedef': // func sig?
+        case 'top-level property':
+            $ctor = 'e'. ucfirst(str_replace('top-level ', '', $o->type));
+            
+            
+            new $ctor(array(
+                'name' => $o->qualifiedName,
+                'href' => $o->href,
+                'isMixin' => $o->type == 'mixin',
+                'isEnum' => $o->type == 'enum',
+                'isTypedef' => $o->type == 'typedef',
+                'isConstant' => $o->type == 'top-level constant',
+                'memberOf' => $o->enclosedBy->name,
+                'dtype' => $o->type,
+            ));
+            break;
+        
+         
+        
+        case 'constructor':
+        case 'method':
+        case 'function':
+            $ar = explode('.', $o->qualifiedName);
+            array_pop($ar);
+            $cls = implode('.', $ar);
+            $ctor = 'e'. ucfirst($o->type);
+            $add = new $ctor(array(
+                'name' => $o->name,
+                'href' => $o->href,
+                'isConstructor' => $o->type == 'constructor',
+                'memberOf' => $cls,
+            ));
+            if ($o->type != 'function') {
+                eClass::$all[$cls]->methods[] = $add;
+            } else {
+                eClass::$all[$o->qualifiedName] = $add;
+            }
+            break;
+        
+        case 'top-level constant':        
+        case 'constant':
+            $ar = explode('.', $o->qualifiedName);
+            array_pop($ar);
+            $memberof= implode('.', $ar);
+            
+            $add =  new eConstant(array(
+                'name' => $o->name,
+                'href' => $o->href,
+                'memberOf' => $memberof,
+            ));
+            switch($o->enclosedBy->type) {
+                case 'class':
+                    if (empty(eClass::$all[$memberof])) {
+                        print_r($o);
+                        echo "Can not find class: $memberof to add object to";
+                        exit;
+                    }
+                    eClass::$all[$memberof]->props[] = $add;
+                    break;
+                
+                case 'library':
+                    Ns::add($add);
+                    break;
+                
+                default:
+                    print_R($o);
+                    exit;
+                
+            }
+            break;
+            
+        case 'property':
+        
+
+            $ar = explode('.', $o->qualifiedName);
+            array_pop($ar);
+            $cls = implode('.', $ar);
+            
+            
+            
+            if (substr($o->name, 0,2) == 'on' && $o->type == 'property') {
+                // presumtionus...
+                eClass::$all[$cls]->events[] = new eMethod(array(
+                    'name' => $o->name,
+                    'href' => $o->href,
+                    'isConstant' => $o->type == 'constant',
+                    
+                ));
+                break;
+            }
+            $add =  new Prop(array(
+                'name' => $o->name,
+                'href' => $o->href,
+                'memberOf' => $cls
+            ));
+            
+            eClass::$all[$cls]->props[] = $add;
+        
+            break;  
+        default:
+            print_R($o);
+            die("invalid type {$o->type}");
+    }
+    
+    
+    
+}
+
+
+
+
+$summary = array();
+if (!file_exists(TDIR .'symbols')) {
+    mkdir(FDIR .'symbols', 0755, true);
+}
+if (!file_exists(TDIR .'ns')) {
+    mkdir(FDIR .'ns', 0755, true);
+}
+
+
+
+foreach(eClass::$all as $c) {
+    
+    if (!method_exists($c, 'readDocs')) {
+        echo "missing readDocs";
+        print_R($c);exit;
+    }
+    $c->readDocs();
+    // constant's and other mixins.. 
+}
+// at this point we need to dump the whole thing.
+
+
+
+
+
+foreach(eClass::$all as $c) {
+    
+    if (!method_exists($c, 'readDocs')) {
+        echo "missing readDocs";
+        print_R($c);exit;
+    }
+    if (is_a($c, 'eClass') ||is_a($c, 'eMixin') ) {
+        $c->expandImplementors();
+    }
+    // constant's and other mixins.. 
+}
+
+// output the files..
+foreach(eClass::$all as $c) {
+    //$summary[$c->name] = $c->toSummaryArray();
+    if (is_a($c, 'eClass') ||is_a($c, 'eMixin') ) {
+        $c->realImplementors();
+        file_put_contents(TDIR .'symbols/'.$c->name. '.json', json_encode($c,JSON_PRETTY_PRINT));
+    }
+    // constant's and other mixins.. 
+}
+foreach(Ns::$tree as $c) {
+    //$summary[$c->name] = $c->toSummaryArray();
+    file_put_contents(TDIR .'ns/'.$c->name. '.json', json_encode($c,JSON_PRETTY_PRINT));
+    
+    // constant's and other mixins.. 
+}
+$tree = array();
+foreach(Ns::$tree as $e) {
+    $e->fakeTree();
+    $tree[] = $e->toTreeArray();
+}
+file_put_contents(TDIR .'tree.json', json_encode($tree, JSON_PRETTY_PRINT));
+//file_put_contents(FDIR .'json/index.json', json_encode($summary, JSON_PRETTY_PRINT)); // this is for builder.. later..
+
+//print_r(eClass::$all);
\ No newline at end of file
diff --git a/tools/flutter_nodes.php b/tools/flutter_nodes.php
new file mode 100644 (file)
index 0000000..a5fca13
--- /dev/null
@@ -0,0 +1,616 @@
+<?php
+
+class Obj {
+    
+    static $out_props = array(
+        'eClass' => array('props', 'events', 'methods'),
+        'eMixin' =>  array('props', 'events', 'methods'),
+        'eTypedef' => array('name', 'type', 'sig', 'static', 'desc','memberOf'),
+        'eProperty' => array('name', 'type', 'desc','memberOf'),
+        'eConstant' => array('name', 'type', 'desc','memberOf'),
+        'eMethod' => array('name', 'type', 'sig', 'static', 'desc','memberOf', 'isConstructor'),
+        'eConstructor' => array('name', 'type', 'sig', 'static', 'desc','memberOf', 'isConstructor'),
+        'eEnum' =>  array('name', 'type',   'desc','memberOf'), // fixme .. .values.?
+        'eFunction' =>  array('name', 'type', 'sig', 'static', 'desc','memberOf', 'isConstructor'),// fixme .. .memberof == package.
+        'Prop' => array('name', 'type', 'desc','memberOf'),
+    );
+    
+    var $href = '';
+    var $desc = '';
+    var $example = '';
+    var $isDeprecated = false;
+    
+    function __construct($ar)
+    {
+        foreach($ar as $k=>$v) {
+            $this->{$k} = $v;
+        }
+         
+    }
+    
+    
+    function parseHTML()
+    {
+        $dom = new DomDocument();
+        libxml_use_internal_errors(true);
+        echo "Reading : {$this->href}\n";
+        $dom->loadHTMLFile(FDIR . $this->href);
+        libxml_clear_errors();
+        $xp = new DomXPath($dom);
+        $desc = $this->getElementsByClassName($dom, 'desc');
+        if ($desc->length) {
+            $this->desc = $this->innerHTML($desc->item(0));
+        }
+        $sc = $this->getElementsByClassName($dom, 'source-code');
+        if ($sc->length) {
+            $this->example = $this->innerHTML($sc->item(0));
+        }
+        return $dom;
+    }
+    
+    function getElementsByClassName($dom, $class)
+    {
+        $xp = new DomXPath($dom);
+        return $xp->query("//*[contains(concat(' ', @class, ' '), ' ".$class." ')]");
+    }
+    function innerHTML($node)
+    {
+        if (!$node) {
+            print_r($this); 
+        }
+        $dom= $node->ownerDocument;
+        $ret = '';
+        foreach ($node->childNodes as $child) 
+        { 
+            $ret.= $dom->saveHTML($child);
+        }
+        return $ret;
+        
+    }
+    function parseType($sp)
+    {
+        if (!$sp) {
+            print_R($this);
+            echo "parseType got invalid value";
+         }
+        $ar = $sp->getElementsByTagName('a');
+        if (!$ar->length) {
+            $this->type = $sp->textContent;
+        }
+        if ($ar->length == 1) {
+            $this->type = eClass::$url_map[$ar->item(0)->getAttribute('href')]->name;
+            return;
+        } 
+        $this->types = array();
+        $t = '';
+        for($i =0;$i<$ar->length;$i++) {
+            $add = eClass::$url_map[$ar->item($i)->getAttribute('href')]->name;;
+            $this->types[] = $add;
+             
+            $t .= ($i == 0) ? $add : ('<'. $add );
+             
+        }
+        for($i =0;$i<$ar->length-1;$i++) {
+            $t .= '>';
+        }
+        $this->type = $t;
+        
+         
+    }
+    function toSummaryArray()
+    {
+        $ret = array();
+        if (!isset(self::$out_props[get_class($this)] )) {
+            die("don't know how to handle class: " . get_class($this));
+        }
+        foreach(self::$out_props[get_class($this)] as $k) {
+            $out = $this->{$k};
+            if (is_array($out)) {
+                $out = array();
+                foreach($this->{$k} as $v) {
+                    $out[] = $v->toSummaryArray();
+                }
+            }
+            $ret[$k] = $out;
+        }
+        return $ret;
+    }
+    function isA($str)
+    {
+        return false;
+    }
+    
+}
+
+class Ns extends Obj {
+    static $tree = array();
+    static $kv = array();
+    var $name = '';
+    var $href = '';
+    var $cn = array();
+    var $isFakeNamespace = false;
+    function __construct($ar)
+    {
+        parent::__construct($ar);
+        
+        if ($this->isFakeNamespace) {
+            return;
+        }
+        
+        $bits=  explode('.', $this->name);
+        
+        self::$kv[$this->name] = $this;
+        
+        if (count($bits) == 1 ) {
+            self::$tree[] = $this;
+            return;
+        } 
+        array_pop($bits);
+        $par = implode('.', $bits);
+        $this->memberOf = $par;
+        self::add($this);
+        
+        
+    }
+    static function add($cls)
+    {
+        self::$kv[$cls->memberOf]->cn[] = $cls;
+    }
+    
+    function fakeTree()
+    {
+         
+        foreach($this->cn as $c) {
+            if (!isset($c->shortname))  {
+                continue;
+            }
+            $map[$c->shortname] = $c;
+             
+              
+            
+        }
+        
+        $cn = array();
+        foreach($this->cn as $c) {
+            if (!isset($c->shortname))  {
+                continue;
+            }
+            $bits = preg_split('/(?<=[a-z])(?=[A-Z])|(?=[A-Z][a-z])/',
+                                 $c->shortname, -1, PREG_SPLIT_NO_EMPTY);
+            //print_r($bits);
+            if (count($bits) < 2 ) {
+                $cn[] = $c;
+                continue;   
+            }
+            if (!isset($map[$bits[0]])) {
+                $add = new Ns(array(
+                    'name' => $c->memberOf .'.'. $bits[0],
+                    'isFakeNamespace' => true,
+                    
+                ));
+                $map[$bits[0]] = $add;
+                $cn[] = $add;
+            }
+            
+            $map[$bits[0]]->cn[] = $c;
+            
+        }
+        
+        // finally remove from tree if it's saving '1'
+        $cc = array();
+        foreach($cn as $c) {
+            if (empty($c->isFakeNamespace)) {
+                $cc[] = $c;
+                continue;
+            }
+            if (count($c->cn) < 2) {
+                $cc[] = $c->cn[0];
+                continue;
+            }
+            $cc[] = $c;
+            
+        }
+        
+        $this->cn = $cc;
+        
+    }
+    
+    function toTreeArray()
+    {
+        // tidy the tree before starting...
+        
+        
+        
+        $ret = array(
+            'name' => $this->name,
+            'is_class' => false,
+            'cn' => array()
+        );
+        // in theory flutter has a flat tree... ?
+        foreach($this->cn as $e) {
+           if (in_array(get_class($e) , array('eClass', 'eMixin', 'Ns'))) {
+                $ret['cn'][] = $e->toTreeArray();
+            }
+            
+        }
+        return $ret;
+    }
+}
+
+
+class eClass extends Obj {
+    
+    static $all = array();
+    static $url_map = array();
+    var $name;
+    var $extends = array();
+    var $memberOf; /// really the package..
+    var $events = array();
+    var $methods = array();
+    var $props = array();
+    var $isMixin = false;
+    var $isEnum = false;
+    var $isTypedef = false;
+    var $isConstant = false;
+    var $isAbstract = false;
+    var $implementors = array();
+    var $realImplementors = array();
+    var $cn = array();
+    function __construct($ar)
+    {
+        parent::__construct($ar);
+        $bits = explode('.', $this->name);
+        $this->shortname  = array_pop($bits);
+        
+        self::$all[$this->name] = $this;
+        self::$url_map[$this->href] = $this;
+        Ns::add($this);
+    }
+    
+    function parseHTML()
+    {
+        // do children first..
+        
+        
+        
+        $dom = parent::parseHTML();
+        
+        $sc = $this->getElementsByClassName($dom,'self-crumb');
+        if ($sc->length) {
+            // abstracts actually impletment stuff in flutter...
+            if (preg_match('/abstract class/', $this->innerHTML($sc->item(0)))) {
+                $this->isAbstract = true;
+            }
+             
+        }
+        
+        
+        
+        $dl = $dom->getElementsByTagName('dl')->item(0);
+        if ($dl->getAttribute('class') != 'dl-horizontal') {
+            $this->extends = array();
+            return;
+        }
+        
+        if (strpos($this->innerHTML($dl), '@deprecated')) {
+             $this->isDeprecated = true;
+        }
+        
+        
+        
+        $dt = $dl->getElementsByTagName('dt');
+        if (!$dt->length) {
+            return;
+        }
+        if ($this->innerHTML($dt->item(0)) != 'Inheritance') {
+            return;
+        }
+        
+        $dd = $dl->getElementsByTagName('dd');
+        if (!$dd->length) {
+            return;
+        }
+        $as = $dd->item(0)->getElementsByTagName('a');
+        $this->extends = array();        
+        for($i = $as->length-1;$i > -1; $i--) {
+
+            if (!isset(self::$url_map[$as->item($i)->getAttribute('href')])) {
+                die("could not find " . $as->item($i)->getAttribute('href') . " when parsing" . $this->href);
+            }
+            
+            $this->extends[] = self::$url_map[$as->item($i)->getAttribute('href')]->name;
+            self::$url_map[$as->item($i)->getAttribute('href')]->addImplementor($this->name);
+        }
+        
+        
+        
+         
+        
+    }
+    function addImplementor($n)
+    {
+        if (!in_array($n, $this->implementors)) {
+            $this->implementors[] = $n;
+        }
+    }
+    function expandImplementors($exclude = array())
+    {
+        $exclude[] = $this->name;
+        $add = array();
+        $orig = $this->implementors;
+        foreach($orig as $c) {
+            if (in_array($c, $exclude)) {
+                continue;
+            }
+            $cl = self::$all[$c]->expandImplementors($exclude);
+            foreach($cl as $cc) {
+                if (!in_array($cc, $this->implementors)) {
+                    $this->implementors[]= $cc;
+                }
+            }
+        }
+        return $this->implementors;
+        
+    }
+    function realImplementors()
+    {
+        
+        $this->realImplementors  = array();
+        foreach($this->implementors as $c) {
+            if (self::$all[$c]->isAbstract) {
+                return;
+            }
+            $this->realImplementors[] = $c;
+        }
+        
+    }
+    
+    function readDocs()
+    {
+        $this->parseHTML();
+        foreach($this->events as $e) {
+            $e->parseHTML();
+        }
+        foreach($this->methods as $e) {
+            $e->parseHTML();
+        }
+        foreach($this->props as $e) {
+            $e->parseHTML();
+        }
+        // loop through children.
+        
+    }
+    function toTreeArray()
+    {
+        $cn = array();
+        foreach($this->cn as $e) {
+            if (in_array(get_class($e) , array('eClass', 'eMixin'))) {
+                $cn[] = $e->toTreeArray();
+            }
+        }
+        $child = $this->prop('child');
+        $child = $child ? $child : $this->prop('children');
+        $child = $child ? $child : $this->prop('home'); // MaterialApp??
+        // above might be a constant... - technically we could work out the type of that..
+        if ($child && !in_array(get_class($child), array( 'eProperty', 'Prop')))  {
+            $child = false;
+        }
+        $childtypes = 0;
+        $childtype = '';
+        
+        
+        // to complicated to check if these are widget children ... some are wrappers around
+        
+        if ($child ) {
+            $childtypes = $child->isA('dart:core.List') ? 2 : 1;
+            $childtype = count($child->types) ? array_pop($child->types) : $child->type;
+            
+        }  
+        
+        return array(
+            'name' => $this->name,
+            'is_class' => true,
+            'cn' => $cn,
+            'extends' => $this->extends,
+            'is_abstract' => $this->isAbstract,
+            'childtypes' => $childtypes,
+            'childtype' => $childtype,
+            'implementors' => $this->realImplementors, // this is not really complete...
+        );
+    }
+    function isA($name)
+    {
+        return in_array($name,$this->extends);
+    }
+    function prop($name)
+    {
+        foreach($this->props as $p) {
+            if ($p->name == $name) {
+                return $p;
+            }
+        }
+        return false;
+    }
+    
+    
+}
+class eMixin extends eClass
+{
+    function parseHTML()
+    {   
+        $dom = Obj::parseHTML();
+    }
+}
+class eConstant extends Obj
+{
+    var $type = '';
+    function parseHTML()
+    {   
+        $dom = Obj::parseHTML();
+    }
+    
+}
+class eEnum extends eClass // enums look alot like classes..
+{
+    var $type = '';
+    function parseHTML()
+    {   
+        $dom = Obj::parseHTML();
+    }
+}
+
+class eProperty extends Obj
+{
+     var $name = '';
+    var $type = '?';
+    var $desc = '';
+    var $memberOf = '';
+    function parseHTML()
+    {   
+        $dom = Obj::parseHTML();
+    }
+}
+
+class  Prop extends Obj {
+    var $name = '';
+    var $type = '';
+    var $types = array(); // generics...
+    var $desc = '';
+    var $memberOf = '';
+    var $isConstant = false;
+    function parseHTML()
+    {   
+        $dom = Obj::parseHTML();
+        // work out the type..
+        $rt = $this->getElementsByClassName($dom, 'returntype');
+        $this->parseType($rt->item(0));
+    }
+    function isA($name)
+    {
+        if (empty($this->types)) {
+            return $name == $this->type;
+        }
+        
+        if (in_array($name,$this->types)) {
+            return true;
+        }
+        foreach($this->types as $ty) {
+            if (!isset(eClass::$all[$ty])) {
+                print_R($this);
+                die("could not find type $ty\n");
+            }
+            if (in_array($name, eClass::$all[$ty]->extends)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
+
+
+
+class  eMethod extends Obj {  // doubles up for events? - normally 'on' is the name
+    var $name = '';
+    var $type = ''; // return...
+    var $desc = '';
+    var $static = false;
+    var $memberOf = '';
+    var $sig = '';
+    var $params  = array();
+    
+      //"isStatic" : false,
+    var $isConstructor = false;
+    //"example" : "",
+    //  "deprecated" : "",
+    //  "since" : "",
+     // "see" : "",
+    // return_desc
+    function parseHTML()
+    {
+        
+        $dom = parent::parseHTML();
+        $sp = $this->getElementsByClassName($dom,'returntype')->item(0);
+        $this->parseType($sp);
+            
+        // params...
+        $ar = $this->getElementsByClassName($dom,'parameter');
+        for($i =0;$i<$ar->length;$i++) {
+            $this->params[] = new Param( $ar->item($i) );
+        }
+        
+        return $dom;
+    }
+    
+}
+class eConstructor extends eMethod {
+    function parseHTML()
+    {
+        
+        $dom = Obj::parseHTML();
+        // doesnt have a 'type'    
+        // params...
+        $ar = $this->getElementsByClassName($dom,'parameter');
+        for($i =0;$i<$ar->length;$i++) {
+            $this->params[] = new Param( $ar->item($i) );
+        }
+        
+        return $dom;
+    }
+}
+
+
+class  eFunction extends eMethod
+{
+    function __construct($ar)
+    {
+        parent::__construct($ar);
+        eClass::$all[$this->name] = $this;
+        eClass::$url_map[$this->href] = $this;
+        Ns::add($this);
+    }
+    function readDocs()
+    {
+        $this->parseHTML();
+        // loop through children.
+        
+    }
+    function parseHTML()
+    {
+        
+        $dom = parent::parseHTML();
+    }
+}
+class eTypedef extends eFunction
+{
+     
+}
+class Param extends Obj {
+    var $name = '';
+    var $type = '';
+    var $desc = '';
+    var $isOptional = true;
+    function __construct($node)
+    {
+        
+        $ar  = $node->getElementsByTagName('span');
+        if (!$ar->length) {
+            echo "mssing paramter info", $this->innerHTML($node); exit;
+        }
+        for($i = 0; $i < $ar->length; $i++) {
+            
+            switch($ar->item($i)->getAttribute('class')) {
+                case 'parameter-name':
+                    $this->name = $ar->item($i)->textContent;
+                    break;
+                case 'type-annotation':
+                    $this->parseType($ar->item($i));
+                    break;
+                
+            }
+        }
+        
+        
+        
+    }
+}
\ No newline at end of file
diff --git a/tools/flutter_sqlite.php b/tools/flutter_sqlite.php
new file mode 100644 (file)
index 0000000..3032bd4
--- /dev/null
@@ -0,0 +1,1036 @@
+<?php
+/*
+ * files parsed from
+ * https://master-api.flutter.dev/offline/flutter.xml
+ FIXMES
+ -- contructor with generic eg. const AlwaysStoppedAnimation<T>(
+ -- classes - we need to parse the right hand column to determine which properties/ methods  are static..
+ -- enums have methods !! 
+ -- types on topLevelconstants are broken (might be able to extract it from the implementation.)
+ -- parse packages on left, and create fake libraries for them...
+ */
+
+class fsql {
+    var $pdo;
+    function __construct()
+    {
+        $this->opendb();
+        $this->create();
+    }
+    function opendb() {
+        $this->pdo = new PDO("sqlite:". TDIR . "doc.db");
+        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+      
+    }
+    function create()
+    {
+        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
+
+        $this->pdo->exec("
+              CREATE TABLE IF NOT EXISTS node (
+                    id INTEGER PRIMARY KEY AUTOINCREMENT,
+
+                    href VARCHAR (255) NOT NULL DEFAULT '',
+                    name VARCHAR (255) NOT NULL DEFAULT '',
+                    type VARCHAR (32) NOT NULL DEFAULT '',
+                    overriddenDepth INTEGER NOT NULL DEFAULT '',
+                    qualifiedName VARCHAR (255) NOT NULL DEFAULT '',
+                    enclosedBy_name VARCHAR (255) NOT NULL DEFAULT '',
+                    enclosedBy_type VARCHAR (16) NOT NULL DEFAULT '',
+                    -- derived data / html extracted...
+                    
+                    memberOf            VARCHAR (255) NOT NULL DEFAULT '',
+                    is_constructor      INTEGER NOT NULL DEFAULT 0,
+                    is_static           INTEGER NOT NULL DEFAULT 0,
+                   
+                    example TEXT,
+                    desc TEXT,
+                    
+                    is_fake_namespace  INTEGER NOT NULL DEFAULT 0,
+                    is_mixin            INTEGER NOT NULL DEFAULT 0,
+                    is_enum             INTEGER NOT NULL DEFAULT 0,
+                    is_typedef          INTEGER NOT NULL DEFAULT 0,
+                    is_constant         INTEGER NOT NULL DEFAULT 0,
+                    is_abstract         INTEGER NOT NULL DEFAULT 0,
+                    parent_id           INTEGER NOT NULL DEFAULT 0,
+                    
+                    extends VARCHAR(255)  NOT NULL DEFAULT ''
+                    
+                );
+                    
+        ");
+         
+        $this->pdo->exec("ALTER TABLE node ADD COLUMN         is_deprecated INTEGER NOT NULL DEFAULT 0");
+        // deals with param type or return type.
+        $this->pdo->exec("ALTER TABLE node ADD COLUMN         value_type VARCHAR (255) NOT NULL DEFAULT ''");
+        // for params
+        $this->pdo->exec("ALTER TABLE node ADD COLUMN         sequence_no INTEGER NOT NULL DEFAULT 0");
+         
+        $this->pdo->exec("create index lookup on node(name,qualifiedName,parent_id,type)");
+         
+        $this->pdo->exec("
+            CREATE TABLE IF NOT EXISTS extends (
+                id INTEGER PRIMARY KEY AUTOINCREMENT,
+                class_id INTEGER NOT NULL DEFAULT 0,
+                extends_id INTEGER NOT NULL DEFAULT 0
+            );
+        ");
+         
+        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+        
+        
+        
+        
+    }
+    function fixParents()
+    {
+        echo "Grouping properties/methods with parents\n";
+        $this->pdo->exec("
+            UPDATE
+                node as cn 
+              set
+                parent_id = coalesce((
+                  SELECT 
+                    id
+                  FROM
+                    node as pn 
+                  where 
+                          pn.qualifiedName = substr(cn.qualifiedName, 0, length(cn.qualifiedName) - length(cn.name)) 
+                    AND
+                    pn.type = 'class'
+                  ),0) where
+                  enclosedBy_type ='class'
+                  and parent_id = 0
+        ");
+    }
+    
+    function get($k,$v)
+    {
+        //print_R(array($k,$v));
+        $s = $this->pdo->prepare("SELECT * FROM node where $k=?");
+        $s->execute(array($v));
+        $r = $s->fetchAll(PDO::FETCH_ASSOC);
+         
+        if (count($r) != 1) {
+            print_R(array($k,$v,$r));
+            throw new Exception("not 1 record when searching");
+        }
+        return $r[0];
+    }
+    function lookup($k,$v)
+    {
+        //print_R(array($k,$v));
+        $s = $this->pdo->prepare("SELECT id FROM node where $k=?");
+        $s->execute(array($v));
+        $r = $s->fetchAll(PDO::FETCH_ASSOC);
+        //print_R($r);
+        if (count($r) > 1) {
+            print_R(array($k,$v,$r));
+            die("more than one record when calling lookup");
+        }
+        return $r ? $r[0]['id'] : 0;
+    }
+    
+    function addExtends($class_id , $extends_id)
+    {
+        $s = $this->pdo->prepare("SELECT id FROM extends where class_id=? AND extends_id=?");
+        $s->execute(array($class_id , $extends_id));
+        if ($s->fetchAll(PDO::FETCH_ASSOC)) {
+            return;
+        }
+        $s = $this->pdo->prepare("INSERT INTO extends (class_id, extends_id) VALUES (?,?)");
+        $s->execute(array($class_id , $extends_id));
+        
+        
+    }
+    
+    function update($id, $o)
+    {
+        if (empty($o)) {
+            return;
+        }
+        //echo "UPDATE";print_r($o);
+        foreach((array) $o as $k=>$v) {
+            if (is_a($v,'stdClass')) {
+                foreach((array)$v as $ik  => $iv) {
+                    $kk[] = $k . '_' . $ik;
+                    $vv[] = '?';
+                    $vvv[] = $iv;
+                    $kv[]="{$k}_{$ik}=?";
+                }
+                continue;
+            }
+            $kk[] = $k;
+            $vv[] = '?';
+            $vvv[] = $v;
+            $kv[]="{$k}=?";
+        }
+        if (!$id) {
+            $s = $this->pdo->prepare("INSERT INTO node (".
+                implode(',',$kk) . ") VALUES (".
+                implode(',',$vv) . ")");
+          //  var_dump($s);
+            $s->execute($vvv);
+            return;
+        }
+        $s = $this->pdo->prepare("UPDATE node SET ".
+                implode(',',$kv) . " WHERE id = $id");
+        $s->execute($vvv);
+    }
+    
+    
+    
+    
+    function fromIndex($o)
+    {
+        $id = $this->lookup('href', $o->href);
+        $this->update($id, $o);
+        
+    }
+    function parseIndex()
+    {
+        
+        $this->pdo = null;
+        if (file_exists(TDIR. 'docs.db')) {
+            unlink(TDIR.'docs.db');
+        }
+        $this->opendb();
+        $js = json_decode(file_get_contents(FDIR.'index.json'));
+        foreach($js as $o) {
+            $this->fromIndex($o);
+        }
+        $sq->fixParents();
+    }
+    function readDom($url)
+    {
+        $dom = new DomDocument();
+        libxml_use_internal_errors(true);
+        echo "Reading : {$url}\n";
+        $dom->loadHTMLFile(FDIR . $url);
+        libxml_clear_errors();
+        $xp = new DomXPath($dom);
+        
+        return $dom;
+    }
+    function getElementsByClassName($dom, $class, $node = null)
+    {
+        $xp = new DomXPath($dom);
+        return $xp->query("//*[contains(concat(' ', @class, ' '), ' ".$class." ')]", $node);
+    }
+    function innerHTML($node)
+    {
+        if (!$node) {
+            print_r($this); 
+        }
+        $dom= $node->ownerDocument;
+        $ret = '';
+        foreach ($node->childNodes as $child) 
+        { 
+            $ret.= $dom->saveHTML($child);
+        }
+        return $ret;
+        
+    }
+    function readDesc($dom, $id)
+    {
+        $array = array();
+        $desc = $this->getElementsByClassName($dom, 'desc');
+        if ($desc->length) {
+            $array['desc'] = $this->innerHTML($desc->item(0));
+        }
+        $sc = $this->getElementsByClassName($dom, 'source-code');
+        if ($sc->length) {
+            $array['example'] = $this->innerHTML($sc->item(0));
+        }
+        $this->update($id, $array);
+        
+    }
+    function readClassData($dom, $id)
+    {
+        $ar = array();
+        $sc = $this->getElementsByClassName($dom,'self-crumb');
+
+        if ($sc->length) {
+            // abstracts actually impletment stuff in flutter...
+            if (preg_match('/abstract class/', $this->innerHTML($sc->item(0)))) {
+                $ar['is_abstract'] = 1;
+            }
+        }
+        $this->update($id, $ar);
+        $dl = $dom->getElementsByTagName('dl')->item(0);
+        if ($dl->getAttribute('class') != 'dl-horizontal') {
+             return;
+        }
+        if (strpos($this->innerHTML($dl), '@deprecated')) {
+            $ar['is_deprecated'] = 1;
+            $this->update($id, $ar);
+        }
+        $dt = $dl->getElementsByTagName('dt');
+        if (!$dt->length || $this->innerHTML($dt->item(0)) != 'Inheritance') {
+            return;
+        }
+        $dd = $dl->getElementsByTagName('dd');
+        if (!$dd->length) {
+            return;
+        }
+        
+        $as = $dd->item(0)->getElementsByTagName('a');
+        $extends = array();        
+        for($i = $as->length-1;$i > -1; $i--) {
+
+            $ex = $this->get('href', $as->item($i)->getAttribute('href'));
+            if (!$ex) {
+                die("could not find " . $as->item($i)->getAttribute('href') . " when parsing" . $id);
+            }
+            if (empty($ex['qualifiedName'])) {
+                
+                print_r($ex);die("missing qualifiedName");
+            }
+            $this->addExtends($id, $ex['id']);
+            $extends[] = $ex['qualifiedName'];
+            
+        }
+        $ar['extends'] = implode(',', $extends);
+        $this->update($id, $ar);
+        //print_r(array($extends, $id));exit;
+        
+    }
+    
+    function readReturnType($dom, $id)
+    {
+        
+        $sp = $this->getElementsByClassName($dom,'returntype')->item(0);
+        $vt = $this->readTypeToString($sp);
+        $this->update($id, array('value_type' => $vt));
+        
+        
+    }
+    function readSignature($dom, $id)
+    {
+        // simple type:
+        // String
+        // complex type
+        // List<Widget> ... --- List -> generic type = Widget
+        // let's start by just storing the values.
+        // in where? -
+        /*
+         * node
+         *    type='param'
+         *    href='';
+         *    parent_id
+         *
+         */
+        
+         $parent = $this->get('id',$id);
+        $ar = $this->getElementsByClassName($dom,'parameter');
+        for($i =0;$i<$ar->length;$i++) {
+            // paramenters are used where methods return callbacks with their own params..
+            if ($ar->item($i)->parentNode->getAttribute('class') == 'signature') {
+                continue;
+            }
+            $this->readParam( $id,  $ar->item($i) ,  $parent['qualifiedName'] .'.param');
+        }   
+        return $dom;
+        
+    }
+    
+    function readParam($id, $node, $prefix)
+    {
+        $ar  = $node->getElementsByTagName('span');
+        if (!$ar->length) {
+            echo $this->innerHTML($node);
+            die("mssing paramter info");
+        }
+       
+        $o = array(
+            'type' => 'param',
+            'parent_id' => $id,
+            'href' => '',
+            
+        );
+        $seq = 1;
+        for($i = 0; $i < $ar->length; $i++) {
+            
+            switch($ar->item($i)->getAttribute('class')) {
+                
+                case 'parameter-name':
+                    $o['name'] = $ar->item($i)->textContent;
+                    $o['sequence_no'] = $seq++;
+                    $o['qualifiedName' ] = $prefix . '.'. $o['name'] ;
+                    break;
+                
+                case 'type-annotation':
+                    
+                    $o['value_type'] = $this->readTypeToString($ar->item($i) );
+                    break;
+                
+            }
+        }
+        if (empty($o['qualifiedName' ])) {
+            $out = $this->get('id', $id);
+            print_r($out);
+            die("missing paramenter name onn this page:" .$out['href']);
+            
+        }
+        
+        $id = $this->lookup('qualifiedName',$o['qualifiedName' ] );
+        $this->update($id,$o);
+        
+    }
+   
+    function readTypeToString($sp)
+    {
+        if (!$sp) {
+            print_R($this);
+            die("readTypeToString got invalid value");
+            
+        }
+        $type = '';
+        $ar = $sp->getElementsByTagName('a');
+        if (!$ar->length) {
+            return '<'. $sp->textContent .'>'; // guessing these are generics..
+        }
+        if ($ar->length == 1) {
+            $rt = $this->get('href',$ar->item(0)->getAttribute('href'));
+            return  $rt['qualifiedName'];
+        } 
+        $types = array();
+        $t = '';
+        for($i =0;$i<$ar->length;$i++) {
+            $rt = $this->get('href',$ar->item($i)->getAttribute('href'));
+            
+            $types[] = $rt['qualifiedName'];
+             
+            //$t .= ($i == 0) ? $rt['qualifiedName'];: ('<'. $rt['qualifiedName'];);
+             
+        }
+        //for($i =0;$i<$ar->length-1;$i++) {
+        //    $t .= '>';
+       // }
+        return implode(',', $types);
+        
+         
+        
+    }
+    
+    var $blacklist = array(
+        'dart-io/HttpOverrides/runZoned.html', // very complex method call - object with callbacks..
+        'dart-io/IOOverrides/runZoned.html',// insanly complex method call - object with callbacks..
+        'dart-async/StreamTransformer/StreamTransformer.fromBind.html', // complex ctor
+    );
+    
+    function parse($type)
+    {
+        echo "Parse $type\n";
+        $s = $this->pdo->prepare("SELECT * FROM node  WHERE type = ?");
+        $s->execute(array($type));
+        $res = $s->fetchAll(PDO::FETCH_ASSOC);
+        foreach($res as $r) {
+            if (in_array($r['href'], $this->blacklist)) {
+                continue;
+            }
+            $m  = "parse".preg_replace('/[^A-Z]/i', '', $type);
+            $this->$m($r);
+        }
+        
+    }
+    function parseClass($o)
+    {
+        $d = $this->readDom($o['href']);
+        $this->readDesc($d,$o['id']);
+        $this->readClassData($d,$o['id']);
+        
+    }
+    
+    function parseConstructor($o)
+    {
+        $d = $this->readDom($o['href']);
+        $this->readDesc($d,$o['id']);
+        $this->readSignature($d,$o['id']);
+    }
+    function parseMethod($o)
+    {
+        $d = $this->readDom($o['href']);
+        $this->readDesc($d,$o['id']);
+        $this->readReturnType($d,$o['id']);        
+        $this->readSignature($d,$o['id']);
+    }
+    function parseProperty($o)
+    {
+        $d = $this->readDom($o['href']);
+        $this->readDesc($d,$o['id']);
+        $this->readReturnType($d,$o['id']);        
+
+    }
+    function parseEnum($o)
+    {
+        $d = $this->readDom($o['href']);
+        $this->readDesc($d,$o['id']);
+        //$this->readReturnType($d,$o['id']);
+        $ct = $d->getElementById('constants');
+        $props = $this->getElementsByClassName($ct->ownerDocument,'properties',$ct)->item(0);
+        //echo $this->innerHTML($props);
+        for($i = 0; $i< $props->childNodes->length; $i++) {
+            $cn  = $props->childNodes->item($i);
+            //var_dump($cn->nodeName);
+            switch($cn->nodeName) {
+                case 'dt': // look for name
+                    
+                    $name = $cn->getElementsByTagName('span')->item(0)->textContent; //$this->getElementsByClassName($cn->ownerDocument,'name',$cn)->item(0)->textContent;
+                    //var_Dump($name);
+                    $n = array(
+                        'type' => 'enum-value',
+                        'parent_id' => $o['id'],
+                        'qualifiedName' => $o['qualifiedName'] .'.' . $name,
+                        'name' => $name,
+                        // enclosed by?? - leave?
+                    );
+                    
+                    break;
+                case 'dd': // the description
+                    //print_r($n);
+                    $n['desc']  =  $this->innerHTML($cn);
+                    
+                    $id = $this->lookup('qualifiedName', $n['qualifiedName']);
+                    if (!strlen(trim($n['name']))) {
+                        break;
+                    }
+                    $this->update($id, $n);
+                    //print_r($n);
+                    break;
+            }
+             
+        }
+        // we ignore methods???
+        //exit;
+        
+
+    }
+    function parseMixin($o)
+    {
+        // oddly enough mixin's have ctors???
+        $d = $this->readDom($o['href']);
+        $this->readDesc($d,$o['id']);
+        // methods and props should be handled ok anyway.. 
+        
+        //print_R($o);exit;
+        
+    }
+    function parsetypeDef($o)
+    {
+        // these appear to be function signatures really.
+        $d = $this->readDom($o['href']);
+        $this->readDesc($d,$o['id']);
+        // methods and props should be handled ok anyway.. 
+        
+        //print_R($o);exit;
+        
+    }
+    function parseConstant($o)
+    {
+        // these appear to be function signatures really.
+        $d = $this->readDom($o['href']);
+        $this->readDesc($d,$o['id']);
+        // methods and props should be handled ok anyway.. 
+        $this->readReturnType($d,$o['id']);  
+      
+        
+    }
+    
+    function parseTopLevelConstant($o)
+    {
+        
+       
+        // these appear to be function signatures really.
+        $d = $this->readDom($o['href']);
+        $this->readDesc($d,$o['id']);
+        // methods and props should be handled ok anyway.. 
+        //$this->readReturnType($d,$o['id']);  
+      
+    }
+    function parseTopLevelProperty($o)
+    {
+        
+        //print_r($o);exit;
+        // aliases to pre-created classes...
+        $d = $this->readDom($o['href']);
+        $this->readDesc($d,$o['id']);
+        // methods and props should be handled ok anyway.. 
+        $this->readReturnType($d,$o['id']);  
+      
+    }
+    function parseFunction($o)
+    {
+        
+      //  print_r($o);exit;
+        // these appear to be function signatures really.
+        $d = $this->readDom($o['href']);
+        $this->readDesc($d,$o['id']);
+        // methods and props should be handled ok anyway.. 
+        $this->readReturnType($d,$o['id']);
+        $this->readSignature($d,$o['id']);
+      
+        
+    }
+    /* ----------------------------- OUTPUT -----------------------------*/
+    
+    function outImplementorsToArray($id)
+    {
+        $res = $this->pdo->query("
+            SELECT
+                    qualifiedName
+                FROM
+                    node
+                where
+                    id IN (SELECT distinct(class_id) FROM extends WHERE extends_id = {$id})
+                AND
+                    is_abstract = 0
+                order by
+                    qualifiedName ASC
+        ");
+        return  $res->fetchAll(PDO::FETCH_COLUMN);
+    }
+    
+    function outTree()
+    {
+        ///make a tree of the classes, and collapse the classes that have same prefix into the prefix.
+        echo "Creating Tree.json\n";
+        // our tree should only include classes (non-abstract), and namespaces
+        $res = $this->pdo->query("
+            SELECT
+                    id,
+                    qualifiedName as name,
+                    qualifiedName,
+                    type,
+                    CASE WHEN type != 'library'  THEN 1 ELSE 0 END AS is_class,
+                    is_abstract,
+                    extends 
+                from
+                    node
+                where
+                    type IN ('class', 'library', 'enum', 'mixin')
+                
+                order by
+                    qualifiedName ASC
+        ");
+        $all = $res->fetchAll(PDO::FETCH_ASSOC);
+        $stack = array();
+        $nsmap = array();
+        foreach($all as $o) {
+            $add = (object) $o;
+            $add->cn = array();
+            $add->is_class = $add->is_class == 1;
+            unset($add->id);
+            $add->extends = strlen($add->extends) ? explode(',',$add->extends) : array();
+            if ($o['type'] == 'library') {
+                 
+                $out[] = $add;
+                $stack = array($add);
+                continue;
+            }
+            
+            $add->implementors  = $this->outImplementorsToArray($o['id']);
+            
+            // find if the element has a child or children...
+            // this is not really where this should go.. but we will add it for the time being.
+            
+            
+            $res = $this->pdo->query("
+                SELECT
+                        name, value_type
+                    FROM
+                        node
+                    where
+                        (
+                            parent_id = {$o['id']}
+                            OR
+                            parent_id IN (SELECT distinct(class_id) FROM extends WHERE extends_id = {$o['id']})
+                        )
+                    AND
+                        type = 'property'
+                    AND
+                        name IN ('child','children','home', 'body')
+                    order by
+                        name ASC
+                    limit 1
+            "); 
+            $types = $res->fetch(PDO::FETCH_ASSOC);
+            $add->childtype = '';
+            $add->childtypes = '0';
+            if ($types) {
+                $car = explode(',', $types['value_type']);
+                $add->childtype = array_pop($car);
+                $add->childtypes = (count($car) && $car[0] == 'date:core.List') ? 2 : 1;
+            }
+            
+            
+            //echo "looking for " .$o['qualifiedName'];             print_R($stack);
+            for($i = count($stack)-1; $i > -1; $i--) {
+                $last = $stack[$i];
+                //print_r(array( substr($o['qualifiedName'], 0, strlen($last->qualifiedName)), $last->qualifiedName));
+                if (substr($add->qualifiedName, 0, strlen($last->qualifiedName)) == $last->qualifiedName) {
+                    $last->cn[] = $add;
+                    $stack[$i+1] = $add;
+                    break;
+                }
+                 
+                
+            }
+        }
+        $libs = array();
+        foreach($out as $c) {
+            $this->outTreeGroups($c);
+            $bits = explode(".", $c->qualifiedName);
+            if (count($bits)< 2 || !isset($libs[$bits[0]])) {
+                $libs[$c->qualifiedName]  = $c;
+                continue;
+            }
+            $libs[$bits[0]]->cn[] = $c;
+        }
+        
+        $out = array_values($libs);
+        echo "WRITE: " .TDIR ."tree.json\n";
+        file_put_contents(TDIR .'tree.json', json_encode($out, JSON_PRETTY_PRINT));
+
+        //print_r($out);
+        
+        
+        
+    }
+    function outTreeGroups($obj)
+    {
+        $groups= array();
+        $libs = array();
+        foreach($obj->cn as $c) {
+            
+            $name = substr($c->qualifiedName, strlen($obj->qualifiedName) +1);
+            $bits = preg_split('/(?<=[a-z])(?=[A-Z])|(?=[A-Z][a-z])/',
+                                 $name, -1, PREG_SPLIT_NO_EMPTY);
+            if (!isset($groups[$bits[0]])) {
+                $groups[$bits[0]] = array();
+            }
+            $groups[$bits[0]][] = $c;
+        }
+        $obj->cn = $libs;
+        foreach($groups as $k => $list) {
+            if (count($list) < 2) {
+                $obj->cn[] = $list[0];
+                continue;
+            }
+            $obj->cn[] = (object) array(
+                'name' => $obj->qualifiedName .'.' . $k,
+                'qualifiedName' => $obj->qualifiedName .'.' . $k,
+                'cn' => $list,
+                'is_class' => 'false',
+                'type' => 'group',
+            );
+        }
+        
+    }
+    
+    function typeStringToGeneric($str)
+    {
+        $bits = explode(',', $str);
+        if (count($bits) < 2) {
+            return $str;
+        }
+        $t = '';
+        foreach($bits as $i => $add) {
+            $t .= ($i == 0) ? $add : ('<'. $add );
+             
+        }
+        for($i =0;$i<count($bits)-1;$i++) {
+            $t .= '>';
+        }
+        return $t;
+    }
+    
+     
+    function outClassSymbols()
+    {
+        echo "Writing Class Symbols\n";
+        $res = $this->pdo->query("
+            SELECT
+                    id,
+                    COALESCE(desc, '') as desc,
+                    type as dtype,
+                    COALESCE(example, '') as example,
+                    href,
+                    is_abstract as isAbstract,
+                    false as isConstant,
+                    is_deprecated as isDeprecated,
+                     
+                    enclosedBy_name as memberOf,
+                    qualifiedName as name,
+                    name as shortname,
+                    extends
+                from
+                    node
+                where
+                    type IN ('class', 'mixin', 'enum')
+                
+                order by
+                    qualifiedName ASC
+        ");
+        $all = $res->fetchAll(PDO::FETCH_ASSOC);
+        $ns = array();
+        foreach($all as $clsar) {
+            $cls = (object) $clsar;
+            unset($cls->id);
+            
+            if (!isset($ns[$cls->memberOf])) {
+                $ns[$cls->memberOf] = (object) array(
+                    'class' => array(),
+                    'mixin' => array(),
+                    //'constants' => array(), // within a class.. - we could treat as static properties..
+                    'enum' => array(),  // like a class...
+                    'typedef' => array(), // need to query these seperatly... -- look very different to classes..
+                    // functions (within a library... )
+                    // top level constant? (within a library - without a class)
+                    // top level proeprty? (predefined instances of clases) - within a library
+                );
+            }
+            
+            $cls->isConstant = $cls->isConstant == 1;
+
+            $cls->isAbstract = $cls->isAbstract == 1;
+            $cls->isDeprecated = $cls->isDeprecated == 1;
+            $cls->is_enum = $cls->dtype == 'enum';
+            $cls->is_mixin = $cls->dtype == 'mixin';
+            //$cls->is_typedef = $cls->is_typedef = 1;
+            $cls->extends = strlen($cls->extends) ? explode(',',$cls->extends) : array();
+            $cls->realImplementors  = $this->outImplementorsToArray($clsar['id']);
+            $cls->events = $this->outEventSymbols($clsar); // event's are properties that are typedefs..
+            $cls->methods = $this->outMethodSymbols($clsar);
+            $cls->props = $this->outPropertySymbols($clsar);
+            
+            echo "OUT:".TDIR .'symbols/'.$cls->name. '.json' ."\n";
+            file_put_contents(TDIR .'symbols/'.$cls->name. '.json', json_encode($cls,JSON_PRETTY_PRINT));
+            
+            
+            $ns[$cls->memberOf]->{$cls->dtype}[] = $cls;
+            
+        }
+        foreach($ns as $nm => $cls) {
+            echo "OUT:".TDIR .'ns/'.$nm. '.json' ."\n";
+            file_put_contents(TDIR .'ns/'.$nm. '.json', json_encode($cls,JSON_PRETTY_PRINT));
+        }
+        
+        
+        
+    }
+    
+    function outEventSymbols($c)
+    {
+        $res = $this->pdo->query("
+            SELECT
+                    id,
+                    COALESCE(desc, '') as desc,
+                    COALESCE(example, '') as example,
+                    href,
+                    is_deprecated as isDeprecated,
+                    value_type as type,
+                    name as name
+                from 
+                        node 
+                where 
+                        parent_id = {$c['id']}
+                        AND
+                        type IN ('property')
+                        AND
+                        'typedef' = (SELECT type from node as sc where sc.qualifiedName = (CASE 
+                        WHEN instr(node.value_type,',') > 0 
+                        THEN substr(node.value_type, 0, instr(node.value_type,',')) 
+                        ELSE node.value_type  
+                        END) limit 1) ;
+                    
+                
+                order by
+                    qualifiedName ASC
+        ");
+        $all = $res->fetchAll(PDO::FETCH_ASSOC);
+        $events = array();
+        foreach($all as $evar) {
+            $ev = (object) $evar;
+            unset($ev->id);
+            $ev->isDeprecated = $ev->isDeprecated == 1;
+            $ev->memberOf = $c['name'];
+            $ev->params = array(); // FIXME
+            $ev->type = $this->typeStringToGeneric($ev->type);
+            $events[] = $ev;
+            
+        }
+        return $events;
+        
+    }
+    
+    function outPropertySymbols($c)
+    {
+        $res = $this->pdo->query("
+            SELECT
+                    id,
+                    COALESCE(desc, '') as desc,
+                    COALESCE(example, '') as example,
+                    href,
+                    name as name,
+                    is_deprecated as isDeprecated,
+                    value_type as type,
+                    type as dtype
+                    
+                from 
+                        node 
+                where 
+                        parent_id = {$c['id']}
+                        AND
+                        (
+                            (
+                                type IN ('property')
+                                AND
+                                'typedef' != (SELECT type from node as sc where sc.qualifiedName = (CASE 
+                                WHEN instr(node.value_type,',') > 0 
+                                THEN substr(node.value_type, 0, instr(node.value_type,',')) 
+                                ELSE node.value_type  
+                                END) limit 1)
+                            ) OR (
+                                type IN ('constant', 'enum-value')
+                            )
+                            
+                        );
+                    
+                
+                order by
+                    qualifiedName ASC
+        ");
+        $all = $res->fetchAll(PDO::FETCH_ASSOC);
+        $events = array();
+        foreach($all as $evar) {
+            $ev = (object) $evar;
+            unset($ev->id);
+            $ev->isStatic = in_array($ev->dtype , array( 'constant', 'enum-value')); // since we do not know what static properties are...
+            $ev->isConstant = in_array($ev->dtype , array( 'constant', 'enum-value'));
+            $ev->memberOf = $c['name'];
+            $ev->isDeprecated = $ev->isDeprecated == 1;
+            $ev->params = array(); // FIXME
+            $ev->type = $this->typeStringToGeneric($ev->type);
+            $events[] = $ev;
+            
+        }
+        return $events;
+        
+    }
+    function outMethodSymbols($c)
+    {
+        
+          $res = $this->pdo->query("
+            SELECT
+                    id,
+                    COALESCE(desc, '') as desc,
+                    COALESCE(example, '') as example,
+                    href,
+                    is_deprecated as isDeprecated,
+                    value_type as type,
+                    name as name,
+                    type as dtype
+                from 
+                        node 
+                where 
+                        parent_id = {$c['id']}
+                        AND
+                        type IN ('method','constructor')
+                         
+                    
+                
+                order by
+                    qualifiedName ASC
+        ");
+        $all = $res->fetchAll(PDO::FETCH_ASSOC);
+        $events = array();
+        foreach($all as $evar) {
+            $ev = (object) $evar;
+            unset($ev->id);
+            $ev->isConstructor = $ev->dtype == 'constructor';
+             
+            $ev->static = false;
+            $ev->memberOf = $c['name'];
+            $ev->isDeprecated = $ev->isDeprecated == 1;            
+            $ev->params = $this->outParamSymbols($evar);
+            $ev->type = $this->typeStringToGeneric($ev->type);
+            $events[] = $ev;
+            
+        }
+        return $events;
+        
+    }
+    function outParamSymbols($c)
+    {
+        
+          $res = $this->pdo->query("
+            SELECT
+                    id,
+                    name as name,
+                    COALESCE(desc, '') as desc,
+                    COALESCE(example, '') as example,
+                    href,
+                    is_deprecated as isDeprecated,
+                    false as isOptional,
+                    value_type as type
+                from 
+                        node 
+                where 
+                        parent_id = {$c['id']}
+                        AND
+                        type IN ('param')
+                         
+                    
+                
+                order by
+                    qualifiedName ASC
+        ");
+        $all = $res->fetchAll(PDO::FETCH_ASSOC);
+        $events = array();
+        foreach($all as $evar) {
+            $ev = (object) $evar;
+            unset($ev->id);
+            $ev->isDeprecated = $ev->isDeprecated == 1;
+            $ev->isOptional = $c['dtype'] == 'constructor';
+            $ev->type = $this->typeStringToGeneric($ev->type);
+            $events[] = $ev;
+            
+        }
+        return $events;
+        
+    }
+    
+    
+}
+
+
+define( 'FDIR', '/home/alan/Downloads/flutterdocs/flutter/');
+define( 'TDIR', '/home/alan/gitlive/flutter-docs-json/'); 
+$sq = new fsql();
+print_r($_SERVER['argv']);
+if (!empty($_SERVER['argv'][1]) && $_SERVER['argv'][1] == 'index') {
+    echo "rebuilding Index" ;$sq->parseIndex();exit;
+}
+//$sq->parse('library'); // what does this achieve?
+/*
+$sq->parse('class');
+$sq->parse('constructor');
+$sq->parse('method');
+$sq->parse('property');
+$sq->parse('enum');
+$sq->parse('mixin');
+$sq->parse('typedef');
+$sq->parse('constant');
+$sq->parse('top-level constant');
+$sq->parse('function');
+$sq->parse('top-level property');
+
+
+*/
+//
+//
+//$sq->outTree();
+$sq->outClassSymbols();