Newbie questions about Pliant

Newbie questions about Pliant

Some UI bugs

I will put here problems that I observe with the new UI.
Message posted by maybe Boris Reitman on 2006/05/08 20:08:08
In IE, I got a popup message that says: "unsupported ie 6 web ui", v 6.0.2800.1106.
It pops up on every refresh, and some functionality is broken.

Firefox 1.5.0.3 -- multiline edit box is not showing up.

When I paste into a text input field, it doesn't resize correctly to accomodate
the text. It fixes itself if I click inside and use the arrow keys to navigate 
in it.  

Is it possible to make the input field longer even if it is empty ? 
Message posted by hubert.tonneau on 2006/05/08 21:00:20
Please post some minimal 'ui_path' functions showing each bug.

I should fix the native frontends (X11, Windows, Linux framebuffer and VNC)
in a resonable time,
but for the HTTP proxy, it can be longer because the HTTP proxy frontent is
still missing some core features (I mean the server side rendering part),
and it has to be tested with all possible browsers, so it will probably take
quite some time, and will probably work poorly with some browsers.
Message posted by maybe Boris Reitman on 2006/05/08 21:46:05
I will post an example shortly.  I forgot to mention that the problem with firefox not showing multiline input field 
appears on windows only.  

Another issue. When I type in a text field in the standard ui client, the response
is a bit jumpy/slow. 

This is how I am starting it:
pliant 'precompile /boris_binary/ui.dump module /pliant/graphic/ui/client/main.pli module /pliantx/language/perl.pli module /pliantx/lexer/multiline_string.pli' module /boris.reitman/ui/run.pli command run_both
Message posted by maybe Boris Reitman on 2006/05/09 05:16:06
An example for the bugs is any input field and any input multiline field.
The input field doesn't resize properly upon paste. The input multiline field
just plain doesn't appear on firefox in windows.

Here is the multiline sample:
--8<------------------
module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/graphic/ui/server/api.pli"
module "/pliant/graphic/ui/server/image.pli"
module "/pliant/graphic/ui/server/draw.pli"

module "/pliant/graphic/color/gamut.pli"
module "/pliant/graphic/image/prototype.pli"
module "/pliant/graphic/image/pixmap.pli"

ui_path "/mytest"

  style_copy "" "title"
  style_copy "" "highlight"
  style_set "highlight" "standard/text/color" (color rgb 128 0 0)
  window left
    button "exit" key "alt x"
      url_return
  window main
    title "MyTest"
    para
      ovar Str description 
      input " description: " description multiline
  window bottom
    section "help"
      void
--->8-----------------
Message posted by maybe Boris Reitman on 2006/05/11 14:19:58
Thanks Hubert for your answer in the other thread.
One of the other thing that is really annoying and is probably quick to fix
is that when the buttons are pressed in the web-proxy ui, the whole page 
refreshes, instead of just an ajax request being sent.

Since the windows ui client is not ready yet, I am forced to use the web-ui proxy
for my users.
Message posted by maybe Boris Reitman on 2006/05/11 17:16:39
Another bug for web ui: input boxes don't handle html code as value. 
Here is example html I tried as a value for an input field:

----8<------------
  window main
    title "MyTest"
    ovar Str description
    ovar Str html := "<a href=[dq]http://www.sudokusplash.com/[dq]>Free Sudoku Download</a><br>[lf]Get the best, most creative sudoku puzzles on the net! A Sudoku hints and strategy gallery with links to printable sudoku puzzles, sudoku for kids, electronic sudoku, and more!<br>"
    para
      input " description: " description multiline
      eol
      input " html: " html
---->8------------

This data overflows from the field into the page, and the field doesn't
have anything after <a href=. The rest is on the page.

I am going to work on it right now, because I need this feature badly.
Let me know if you have any hints. I will post, when I'll finish.
Message posted by maybe Boris Reitman on 2006/05/11 19:02:17
A patch for HTML handling in input field + a patch for textarea not showing up on firefox.
There was a typo in textarea code (an extra [dq]), and for the input field, html_encode wasn't applied on the data.

-----8<-------------------------
--- /pliant/pliant/graphic/console/http_proxy.pli-original      2006-05-11 16:40:58.000000000 +0000
+++ /pliant/pliant/graphic/console/http_proxy.pli       2006-05-11 18:02:47.000000000 +0000
@@ -185,9 +185,9 @@
       if i2<v:len
         ny += 1
       i1 := i2+1
-    http writeline "<textarea[dq] name=[dq]"+(http_encode i:id)+"[dq] cols=[dq]"+string:nx+"[dq] rows=[dq]"+string:ny+"[dq] onChange=[dq]change(this)[dq] onKeyup=[dq]adjust2(this)[dq]>"+(html_encode i:value)+"</textarea>"
+    http writeline "<textarea name=[dq]"+(http_encode i:id)+"[dq] cols=[dq]"+string:nx+"[dq] rows=[dq]"+string:ny+"[dq] onChange=[dq]change(this)[dq] onKeyup=[dq]adjust2(this)[dq]>"+(html_encode i:value)+"</textarea>"
   else
-    http writechars "<input type=[dq]text[dq] name=[dq]"+(http_encode i:id)+"[dq] value=[dq]"+i:value+"[dq] size=[dq]"+string:(max (utf8_decode i:value):len 1)+"[dq] onChange=[dq]change(this)[dq] onKeyup=[dq]adjust(this)[dq]"
+    http writechars "<input type=[dq]text[dq] name=[dq]"+(http_encode i:id)+"[dq] value=[dq]"+(html_encode i:value)+"[dq] size=[dq]"+string:(max (utf8_decode i:value):len 1)+"[dq] onChange=[dq]change(this)[dq] onKeyup=[dq]adjust(this)[dq]"
     if (i:flags .and. 1)<>0
       http writechars " onmouseover=[dq]overon('"+(http_encode i:id)+"')[dq]"
       http writechars " onmouseout=[dq]overoff('"+(http_encode i:id)+"')[dq]"
->8------------------------------

Message posted by maybe Boris Reitman on 2006/05/12 22:07:05
Fix for ie 6 support.  In some versions of ie the way to get at the XML http request object
is via Msxml2.XMLHTTP instead of Microsoft.XMLHTTP.

I have placed the patch here: 

  http://aristotle.hypervolume.com/~boris/pliant/patches/patch002_ie_http_requester.patch

I will keep adding patches here.

  http://aristotle.hypervolume.com/~boris/pliant/patches/


Also, I think in the following, there was a typo
and http_request should have been alive_request, so I changed it to alive_request.
-----8<-------------------
   http writeline "function alive() {"
   if browser_model="ie"
-    http writeline "  http_request = new ActiveXObject('Microsoft.XMLHTTP');"
+    http writeline "  alive_request = new_ie_httprequest_object();"
   else
     http writeline "  alive_request = new XMLHttpRequest();"
   http writeline "  if (!alive_request) {"
--->8-------------------

Boris
Message posted by maybe Boris Reitman on 2006/05/13 01:00:00
Fix for auto-resizing properly when code is being pasted into text input field,
and multiline input field:

http://aristotle.hypervolume.com/~boris/pliant/patches/patch003_resize_on_paste.patch
Message posted by hubert.tonneau on 2006/05/13 11:29:21
Many thanks for the fixes. I agree with all of them.

Can you replace
http://aristotle.hypervolume.com/~boris/pliant/patches/http_proxy.pli
with the final one, so that I can apply safely.

On my side, I've written the two missing frontends (Windows and VNC server)
so I will try to publish a new release with the all things as soon as possible
(as soon as I succeed to put the storage part to something that does not
disturb other parts)
Message posted by maybe Boris Reitman on 2006/05/13 17:10:00
I placed the final http_proxy.pli here:

http://aristotle.hypervolume.com/~boris/pliant/patches/final/http_proxy.pli
Message posted by hubert.tonneau on 2006/05/13 17:31:27
Can you give me more details about this change for non IE browsers:
+    http writeline "  var tmp = f.value;"
+    http writeline "  f.value = 'x' + f.value;"
+    http writeline "  f.setAttribute('size',Math.max(f.value.length-1,1));"
+    http writeline "  f.value = tmp;"

I don't like the more complicated Javascript code you generate:
+    http writeline "function on_keyup(f,dim) {"
+    http writeline "  dim == 1 ? adjust(f) : adjust2(f);"
+    http writeline "}"
I'd prefer to have
  if browser_model="io"
    http writeline "<textarea ...
  else
    http writeline "<textarea ...
and no 'on_input' and 'on_keyup' functions.
 
Message posted by maybe Boris Reitman on 2006/05/13 18:21:30
> Can you give me more details about this change for non IE browsers:
> +    http writeline "  var tmp = f.value;"
> +    http writeline "  f.value = 'x' + f.value;"
> +    http writeline "  f.setAttribute('size',Math.max(f.value.length-1,1));"
> +    http writeline "  f.value = tmp;"

Suppose, the text field was originaly,

          [            ]

When the text "Some text to be pasted" is pasted into the field, 
and the field is resized, it looks like this:

Some text [to be pasted         ]

Basicaly, at the moment of the paste the field was short, so what happens 
with firefox (i didn't test other browsers) is that only the end of the string is visible.
After a resize, the text is not moved to fill the field.  One has to use arrow keys
to scroll towards the left edge of the field for the text to be corrected.  I figured
out that adding a character at the beginning of the string does this correction also.
I couldn't find an api method "redraw" to do this correction.  Function with 
a promisining name "normalize()" doesn't do it.


> I don't like the more complicated Javascript code you generate:
> +    http writeline "function on_keyup(f,dim) {"
> +    http writeline "  dim == 1 ? adjust(f) : adjust2(f);"
> +    http writeline "}"
> I'd prefer to have
>   if browser_model="io"
>     http writeline "<textarea ...
>   else
>     http writeline "<textarea ...
> and no 'on_input' and 'on_keyup' functions.

I thought that browser_model is not available to me at that point. If it is,
I agree, your way is better.


 
Message posted by hubert.tonneau on 2006/05/13 18:35:42
> After a resize, the text is not moved to fill the field.

Ok. Thanks for the explaination. I will add a comment in the source.

Just in case: would this be working ?
  f.setAttribute('size',Math.max(f.value.length,1));
  f.value = f.value; # force field scroll rewind

> I thought that browser_model is not available to me at that point.

The browser model is available at any time because it's sent as an option
line in the HTTP request.

Can you polish and final test the code so that I can download and include it.
Message posted by maybe Boris Reitman on 2006/05/13 19:15:08
I don't understand how to access browser_model
when I am inside this method.

------------8<-----------------
method i html a http
  oarg_rw LayoutInput i ; arg Address a ; arg_rw Stream http
  if (i:flags .and. 4)<>0
    var Int nx := 1 ; var Int ny := 1
    var Str32 v := utf8_decode i:value
    var Int i1 := 0
    while i1<v:len
      var Int i2 := ((v i1 v:len) search "[lf]" v:len-i1)+i1
      nx := max nx i2-i1
      if i2<v:len
        ny += 1
      i1 := i2+1
    if browser_model="ie"        # compile error.
      console "Got ie"
    ...
-------->8-------------------

I think I need to enable "gather_infos" and change the declaration
of 

------8<---------------------type ConsoleHttpProxyContext
  inherit CachePrototype
  field Link:UIConsole console
  field Link:LayoutStyle style
  field Link:ColorGamut gamut
  field Link:ColorGamut convert_gamut
  field ColorBuffer convert_buffer
  field Arrow convert_speedup
  field Str secret
  if gather_infos
    field Str browser ; field Float ui_release
    field Str user
    field DateTime since alive
------->8-------------------------------------
To have two fields: browser_model and browser_release instead of just 
one compound 'browser' field.  You are setting them in 'service' method,

-------8<--------------
        if gather_infos
          c browser_model := browser_model ; c browser_release := browser_release
          c since := datetime
------->8--------------
 
Message posted by maybe Boris Reitman on 2006/05/13 19:25:41
also, for the other question,  "f.value = f.value" doesn't work, i tried it :)
I am going to replace my firsh version with this one,
-------8<--------------
  function adjust(f) {
    f.setAttribute('size',Math.max(f.value.length,1));
    var tmp = f.value;
    f.value = f.value+" ";
    f.value = tmp;
  }
------>8----------------
because it also works, but looks a bit cleaner, and I can add the three
bottom lines only in the case of non-ie browsers.
Message posted by hubert.tonneau on 2006/05/13 19:51:29
> I don't understand how to access browser_model when I am inside this method.

You're right. It's not available. Sorry for the wrong advise.

> I think I need to enable "gather_infos" and change the declaration of 

Yes, please do.

Message posted by maybe Boris Reitman on 2006/05/13 20:00:01
Another question -- how would I go about making button clicks 
not to refresh the whole page, but only the relevant sections ?
Should I just follow the "/over/" code ? 
Message posted by maybe Boris Reitman on 2006/05/13 21:32:14
Hubert, I found a function "f.scrollIntoView()" that does the job.
I have reworked the patches, and updated the final 'http_proxy.pli'.
Message posted by hubert.tonneau on 2006/05/13 21:44:39
> Another question -- how would I go about making button clicks 
> not to refresh the whole page, but only the relevant sections ?
> Should I just follow the "/over/" code ? 

Yes, you can try to change 'run' function to something similar to
'change', yet issuing et 'GET' instruction like 'overrequest' does.

Then you'll have to modify
    eif command="GET" and (path eparse (pattern url_header+"/run/") any:(var Str secret) "/" any:(var Str id) "/" (var Int scroll_x) "/" (var Int scroll_y))
bloc accordingly.

The big problem you might face is that the 'upgrade' method used to send
HTML page modifications to the client might not work well if the result of
pressing the button is sending something like a very long table, so you should
switch only if some constant 'incremental_buttons' is set to true.
Message posted by hubert.tonneau on 2006/05/13 21:54:47
> I have reworked the patches, and updated the final 'http_proxy.pli'.

Applied.
Thanks.

Now I have to add the server side rendering part to get the HTTP proxy
truely usable, but I have things with higher priorities in my agenda.
Message posted by maybe Boris Reitman on 2006/05/17 15:47:29
Found out that scroollIntoView() does nothing on my version of FF on linux 
(ubuntu breezy), On the otherhand, scrollIntoView is what 
makes FF on windows work, while the hack of adding and removing a character 
does nothing there.

So we need to apply another patch,
http://aristotle.hypervolume.com/~boris/pliant/patches/patch031_resize_on_paste_linff.patch
Message posted by maybe Boris Reitman on 2006/05/21 05:20:26
Typing in a text input field inside the test sample application is slow, 
but in a text input field inside the VNC "login" window typing is 
fast and responsive.  Why does that happen ? (this is on linux ui).
Message posted by hubert.tonneau on 2006/05/21 10:29:34
> Typing in a text input field inside the test sample application is slow, 
> but in a text input field inside the VNC "login" window typing is 
> fast and responsive.

I probably have problems with the positioning engine recomputing too much
or the drawing engine redrawing too much.
Message posted by maybe Boris Reitman on 2006/05/21 14:24:56
Congrats on getting the windows ui client working. 
Here are things necessary to be done from my point of view,

- there seems to be no way to paste in the windows ui 
(in linux I paste with middle mouse button)

- in both linux ui and windows ui there is no way to select 
text and copy it into clipboard.

- is it possible to navigate to URL which is not localhost, or not yet ? 
Is this correct syntax: aristotle.hypervolume.com:8081:/flowerlinks_admin

- couldn't connect to vnc server from the windows client.
Message posted by hubert.tonneau on 2006/05/21 15:08:00
> - there seems to be no way to paste in the windows ui 
> (in linux I paste with middle mouse button)

The reason is that I have not implemented the two following methods
in /pliant/graphic/console/win32.pli

  method c clipboard_export fun param
    oarg_rw ConsolePrototype c ; arg Function fun ; arg Address param
 
  method c clipboard_import text -> status
    oarg_rw ConsolePrototype c ; arg_w Str text ; arg Status status

The first one is a bit difficult to understand. The reason is that optimal
clipboard export does not provide the content of the clipboard but just
provides a way to get it if it is pasted.
So, it is lazy evaluation.
The reason is to save bandwidth.

> - in both linux ui and windows ui there is no way to select 
> text and copy it into clipboard.

There are different possibilities to implement this.
The simplest one is to extend the 'event' method for LayoutPara defined
in /pliant/graphic/layout/text.pli to provide it cut/past capabilities
just like LayoutInput has in /pliant/graphic/layout/form.pli

The limit of this way of doing things is that it will only possible to
select part of a single paragraph, not several paragraphs at once.

Another more advanced possibility would be to select a rectangle area,
get it drawed with a special vector library driver that just intercepts
draw text instructions.

A third one is related to the missing selection capability (the ability
to select an arbitrary part of the current page tree, just like with any
word processor) that could be used to travel the page tree and turn the
selected part to text.
This is probably the best one, also I have no short term plan to work
on defining the proper selection mechanism.

> - is it possible to navigate to URL which is not localhost, or not yet ? 
> Is this correct syntax: aristotle.hypervolume.com:8081:/flowerlinks_admin

I have to test and get sure this works before providing final release 97.

> - couldn't connect to vnc server from the windows client.

You have to force the VNC client to use truecolor.
Here is the command line I use:
xvncviewer -noauto -truecolor localhost
Message posted by maybe Boris Reitman on 2006/05/21 17:06:51
>> - in both linux ui and windows ui there is no way to select 
>> text and copy it into clipboard.

> A third one is related to the missing selection capability (the ability
> to select an arbitrary part of the current page tree, just like with any
> word processor) that could be used to travel the page tree and turn the
> selected part to text.
> This is probably the best one, also I have no short term plan to work
> on defining the proper selection mechanism.

I like this one too, it should be done with a visitor/builder design pattern: 
an object that accumulates text as it gets to visit every selected 
node of the tree.

>> - couldn't connect to vnc server from the windows client.
>You have to force the VNC client to use truecolor.
>Here is the command line I use:
>xvncviewer -noauto -truecolor localhost

I meant that from the new windows ui client, the VNC test doesn't work.
From linux ui client, it works. Its not urgent, just reporting a bug.

--

I have also tried starting the VNC proxy server according your suggestion:

  pliant 'precompile /binary/ui.dump module /pliant/graphic/ui/client/main.pli' module /pliant/graphic/ui/sample/run.pli command run_vnc

I was able to connect with the options you suggested (using vncviewer),
and was able to see the front page.  Then I tried taking a screenshot of the screen,
and it hanged after that.  

Restarted the vnc server, and connected to it again, the test page worked,
but scrolling left empty areas.

I switched to a different workplace to type this message and when I switched back
to the workspace with VNC, it was handged.  It could be a ratpoison window 
manager problem, vncviewer sometimes disconnects when switch to a 
different workspace.

The dimensions of the vncwindow are not matching my screen:
 http://aristotle.hypervolume.com/~boris/pliant_ui_screenshots/vnc_start_screen.jpg
It is strange that window is thin, but there is a still a horizontal scroll-bar.