home mail me! syndication

overthinkings

by Ruben Daniels

Javeline Platform 101

Skinning

Just like a human skin the skin of the application covers the internal workings of an application. It gives a face to your application with which a human can communicate. Skinning can be used for branding and for optimizing the user experience. As said earlier Platform has a strict seperation of style. It allows a designer/developer to create skins with absolute freedom (limited to the reach of XHTML/CSS).

Javeline Platform comes with two sets of predefined skins. One is a standard Windows like skin. The other is a more original Javeline skin called Perspex. When creating an application I usually don’t want to be bothered with skinning. What I love about the clear seperation is that at any point in time I can choose to change the skin without affecting the application itself. I can work together with a designer on the same application without getting in eachothers way.

How to define a skin in Javeline Platform
A skin for Javeline components is defined in an xml file. This xml file contains skins for multiple components. Each component has its own skin definition which tells it how to draw itself on the screen. A skin is defined by a skin name. You can specify a default skin for a component by giving it the component’s tagName. Each skin consists of a <Style> section which contains the css, and a <Presentation> section which holds the XHTML definition. Let me give you an example of a simple skin for a Button (I left estethics out of this example):

<Button>
   <style><![CDATA[
      .button{
         border : 1px solid black;
         background-color : blue;
      }
      .buttonDown{
         background-color : green;
      }
      .buttonOver{
         border : 1px dotted black;
      }
      .buttonFocus{
         background-color : red;
      }
      .buttonDisabled{
         background-color : gray;
      }
   ]]></style>   

   <Presentation>
      <Main
         caption="./text()"
         icon="."
         background=".">
         <div class='button'>-</div>
      </Main>
   </Presentation>
</Button>


The controller of the widget, in this case the Button, will set the appropriate classes on the div element that is created. It uses the class of the div to set new classnames to define the button’s state. These states differ per component. In a later example I will show you the skin of a Tree which has more than 20 states. The states of the button are quite self-explanatory. The controller needs to know certain things about the XHTML you’ve specified. In the case of the button it wants to know which textnode to set for the caption, where to set the icon (either on an img tag, or as a background of an XHTML element) and where to set the background. These are set by attributes on the Main tag using Xpath expressions to point to the XHTML nodes.

The skin for a Tree element is fairly advanced. Only the skin of the datagrid has more parts. For clarity i’ve left out the CSS rules in the next example.

<Tree>
   <style><![CDATA[
      .tree{}
      .treeFocus{}
      .treeDisabled{}

      .tree .loading{}
      .tree .empty{}

      /* States of the plusmin button */
      .tree LI.last{}
      .tree LI.pluslast{}
      .tree LI.minlast{}
      .tree LI.plus{}
      .tree LI.min{}
      .tree LI.root{}

      /* Same states on the container */
      .tree UL.last{}
      .tree UL.pluslast{}
      .tree UL.minlast{}
      .tree UL.pluslast{}
      .tree UL.minlast{}
      .tree UL.last{}
      .tree UL.root{}

      /* Selection states */
      .tree .selected{}
      .treeFocus .selected{}
      .tree .indicate{}
      .treeFocus .indicate{}

      /* Drag&Drop states */
      .dragtree{}
      .tree .dragAppend{}
      .treeFocus .dragAppend{}
      .tree .dragInsert{}
      .tree .dragDenied{}
   ]]></style>

   <Presentation>
      <Main container="." startclosed="false">
         <ul class="tree">

         </ul>
      </Main>
      <Item
         class         = "."
         caption      = "text()"
         icon         = "."
         openclose   = "span"
         select      = "."
         container   = "ul"
      >
         <li><span></span>-
            <ul> </ul>
         </li>
      </Item>
      <DragIndicator>
         <div class='dragtree'><span></span>-</div>
      </DragIndicator>
      <Loading>
         <li class="loading">
            <span> </span>
            Loading...
         </div>
      </Loading>
      <Empty container=".">
         <li class="empty"></li>
      </Empty>
   </Presentation>
</Tree>

The Tree component has numerous states. Besides the basic ones, the controller sets states for selection, drag&drop and to specify wether or not an item is collapsed. Lets take a look at the Presentation part. Besides the Main part which we saw before in the button skin, there are four other parts. A tree can be filled with items. The <Item> tag specifies how an item is rendered and which elements take on which functionality. An item can have child items. Each item can have a caption, icon, and a openclose button to collapse it’s children. This example renders a simple tree from ul and li elements. The Javeline windows skin package has a more advanced skin, which uses more XHTML/CSS elements. The other elements describe how other states are rendered; DragIndicator, Loading and the Empty state.

Pages: 1 2 3 4 5 6 7 8 9 10 11

11 Comments »

  Kai Tischler wrote @ October 4th, 2007 at 12:12 am

Hello Ruben !

I have already sent two emails to the Javeline team via the “info@javeline.nl” email
address, but unfortunately I got no response :-(

So I am contacting You directly here via this blog entry; because I have fallen in love with Your layout engine almost immediately :-) ! I am currently doing some research with regard to layout in the native contemporary browsers, and Your approach seems to be really unique ! I have played around with it a little bit and am so impressed right now that I want to leverage Your layout engine ! I know that I can use the packager to extract only parts out of all the Javeline SDK stuff; but I couldn’t make it extract the layout parts … in fact I couldn’t get it to work at all …

I am also very much excited about Javeline in its whole glory, but this particular blog comment shall address the issue of leveraging Your layout engine separately. Is there a technical way to do it ? And what about licensing then ? Or do You know of other layout engines for browsers which are as capable as Yours seems to be ?

I am looking forward to the comments to come !

Cheers

Kai

  Ruben wrote @ October 4th, 2007 at 9:45 am

Hi Kai,

I just found your e-mail. It got lost in the spam box somehow. You will get a reply from me on that. It is possible to extract the layout engine using the packager. For what purpose would you like to use it? Please register to the internals mailinglist at http://developer.javeline.net/mailinglists.php and sent your answers there so the community can follow them as well.

Kind Regards,

Ruben

  overthinkings » Contextmagic and Repeat wrote @ October 22nd, 2007 at 2:49 pm

[…] this was the first time you read about Javeline PlatForm, this article is a good place to start learning more about this Web Application […]

  Mehmet KURT wrote @ January 2nd, 2008 at 4:27 pm

Please ! Help Me…

Using for Framework Javeline… Help Me??

  bharath wrote @ February 9th, 2008 at 3:25 pm

hi , my name is bharath
i have a doubt in ajax connectivity

how to connect an ajax application to database using jdbc…
can u plz clarify my doubt.. with sample example with coding.
thanx & regards.

  Ruben wrote @ February 14th, 2008 at 8:32 am

Hi Bharath,

Ajax applications connect to a backend. Most popular nowadays is to use REST to connect to a backend. This backend can be written in PHP, Perl, ASP, JSP or any other language. It’s the responsibility of that language to connect to a database using jdbc.

In Javeline PlatForm you would do something like this:

<j:teleport>
   <j:rpc id="comm" protocol="POST">
      <j:method name="getUsers" url="http://example.com/users.php">
         <j:variable name="group_id" />
      </j:method>
   </j:rpc>
</j:teleport>

<j:model id="myUsers" load="rpc:comm.getUsers(10)" />

<j:list model="myUsers">
   <j:bindings>
     <j:caption select="@username" />
     <j:icon select="@icon" />
     <j:traverse select="user" />
   </j:bindings>
</j:list>

or if you want to use the javascript approach with Javeline PlatForm you’d do:


var http = new jpf.http();
var data = http.getXml(”http://example.com/users.php?group_id=10″, function(data, state, extra){
   if(state == __HTTP_SUCCESS__){
      alert(”My XML: ” + data.xml);
   }else{
      alert(”An error has occurred”);
   }
});

Please note that these code examples are for v0.9.8 of Javeline PlatForm which will be released shortly.

Kind Regards,

Ruben

[…] early version of Javeline PlatForm and up untill that moment I had only positioned elements using anchoring. I did remember a nice feature that Visual Basic had, where I could align an element to one of the […]

[…] supports Anchoring, Alignment and position using a grid (similar to a table in […]

  Michal wrote @ January 29th, 2009 at 4:19 pm

Hi There,

Guys, I have gone thru the documentation available on javeline.com website nevertheless I am still unable to start with it. There are several examples which I have browse as well but would you have something like tutorial or learn by example so, I can quickly adopt and use your framework?

Thank you,
Michal

  Martijn wrote @ July 6th, 2009 at 1:14 pm

I’m trying to send a form in JPF. I use a set of form elements checkbox, textbox, etc. I would like to send all these elements with Teleport to a php-script to put the values in a database. I get it to work if I declare the variables within the tags. This seems not very efficient to me.

Is it possible (like plain HTML), to submit all the form elements in one, without declaring them again within the Teleport-tags?

I.e.:

  Ruben wrote @ July 6th, 2009 at 2:51 pm

Hi Martijn,

Yes of course. There is a demo on this online here:
http://www.ajax.org/#demos/elements.s.submission

It uses a list bound to the data, but I’m sure you can see that it works the same with form elements bound to the xml.

Kind Regards,
Ruben

Your comment

HTML-Tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>