There are no problems with you altering the way a window works in any way whatsoever. It's open source software and that includes the components libraries offered with the download.

The best way to make a window for yourself isn't necessarily to use the components although you can learn from them and use them whenever you'd like. Others may have other styles, but the best way to start with "windows" and the LZX philosophy is compact and short to explain IMO. May I show you a short and well commented, fully self-contained, and tweakable example of writing your own window from scratch? Alright, thanks, don't mind if I do!

 Before the actual code, some light weight LZX philosophy:

- An effective way to make a window is to remember that a "window" is just an area that contains other things. Using this concept, a <view> becomes a window, because it can contain other things. - More importantly, when you change a <view>'s x and y one way or another - say have mousedrag do that via a <handler> - everything inside of it will move with it. Just like a window does.

To make a window you're used to however, takes three things, not just one:

        - a <view> to contain things
        - some graphics that make the view look cool and thus like a window,
        - and an inner view where content goes to seperate the window "chrome"
          from what the user *puts* in the window.

Instead of being a step by step code example, the following will have most everything you need to make your own simple window. I typed this from scratch, and it's all inclusive, so you can just drop it into your project and start tweaking with it! I made a big effort to comment everything so this will read easily. The code content of this is really quite short. First - just copy and paste and compile this in your openlaszlo environment, and drag on the yellow bars when it's up! Other things it could do you can learn about:

        - how to make it resize from the lower right corner or anywhere else
- how to add scroll bars that only show up if the inner content overflows
        - how to hide/show/make more/remove windows programmatically
- how to make better window chrome, like using images placed around the border of a window - how to package things like this so that you can distribute libraries of your own finished components

If after some study you want to ask questions more specifically, I think you'd get better understanding of how to work and play with LZX and it's really cool design patterns.

<canvas>

    <!-- make a window class and document it all the way.

         Pleas note the:

            - exact nesting of elements, which help identify what
              does what to what

            - the use of constraints to position things relative to
each other and to pass on attribute from the class defintion
              to things inside the class

- the use of recursive defaultplacement attributes to make inner
              content of the window go anywhere else in the hierarchy

            - the use of a dragstate (its in the documentation) to
              make a view move relative to the mouse when the state is
              applied (there is a resizestate too, not shown here!)

            - the two examples of using this simple window class below

    -->

    <class name="mywindow" defaultplacement="content" clip="true">
        <!-- make an attribute to hold the window's title -->
        <attribute name="title" type="string" value="My Window"/>

<!-- make a dragger object (logic only) that will on "this.apply(true)" move the parent when the mouse moves and stop when "this.apply(false)". Trigger it from the menubar's onmousedown and onmouseup -->
        <dragstate name="dragger"/>

        <!-- the menubar should be after the bkgnd area below, so let's
             arrange the two vertically. really, this is preferable to
setting x's and y's manually on each element IF you can get
             away with it, which I can here because i'm only ordering
two things on top of each other. Makes it easier to use and
             understand -->
        <simplelayout axis="y" spacing="0"/>

        <!-- a menu bar runs the width of the top of the window -->
<view name="menubar" width="${parent.width}" height="20" bgcolor="0xffff77">

<!-- use the menubar's mousedown event to move the whole window -->
            <handler name="onmousedown">
//we want the window to jump to the front of it's siblings when clicked!
                classroot.bringToFront();

//and we want to apply the dragstate on the classroot that makes the window //move (a dragstate is from the state tag and it's pretty easy to
                //make your own - no magic going on here)
                classroot.dragger.apply();
            </handler>

<!-- use the menubar's mouseup event to stop moving the whole window -->
            <handler name="onmouseup">
//remove the dragstate from affecting the classroot; the window will
                //no longer move with the mouse
                classroot.dragger.remove();
            </handler>

<!-- make an area for a window title and fill it with the classroot's
                 "title" attribute -->
            <text name="title" text="${classroot.title}"/>

<!-- make a "button" over to the right (just a square for now) to close the window --> <view x="${parent.width-this.width-5}" valign="middle" bgcolor="red" width="10" height="10">
                <handler name="onmousedown">
                    classroot.setAttribute('visible', false);
                </handler>
            </view>
        </view>

<!-- any inner content of this class supplied by a third party goes here! see the placement attribute on the class definition.. note that i'm for no good reason (artistic) including a black bordered view below the
             content -->
<view name="content" defaultplacement="content" bgcolor="0xdddddd" opacity="0.9" width="${parent.width}" height="${parent.height- parent.menubar.height}">

<!-- the inner view that holds the content, finally! note it's offset 1,1,1,1 around the
                 sides to give it that border effect -->
<view name="content" x="1" y="1" width="$ {parent.width-2}" height="${parent.height-2}"/>
        </view>
    </class>

    <!-- actually make some windows -->

    <mywindow title="Window 1" x="30" y="30" width="300" height="300">
        <!-- inner content of the first window -->
        <text text="this is my first window"/>
    </mywindow>

<mywindow title="Window 2" x="100" y="150" width="300" height="300">
        <!-- inner content of the second window -->
<text bgcolor="white" text="this is my second window" align="center" valign="middle"/>
    </mywindow>

</canvas>












On Jan 4, 2008, at 12:43 PM, Greg Denton wrote:

This is a newbie question about how to customize windows. Seems like the look of a window cannot be modified much via subclassing (or any other way) due to the graphics being drilled into the library code in windowpanel.lzx . Is this true? I'm just trying to create a lighter-weight looking window. Are there any licensing problems with copying/modifying the library code to produce a different looking window? Thanks.

Reply via email to