Writing a Simple Program

First, some prerequisites. You'll need a Java development tool such as Sun's JDK, Microsoft's SDK for Java, Microsoft's Visual J++, Symantec's Cafe, IBM's Visual Age or similar.

Next, you'll need to download the Waba SDK, available from this web site. It contains the bridge classes that allow you to run Waba programs under Java.

You don't need any tools other than a Java development tool and the WabaSDK to write Waba programs.

After downloading and extracting the files in the Waba SDK, you should find a "classes" subdirectory in the SDK distribution. This directory contains the Waba bridge classes that can be used to develop and debug Waba programs with standard Java development tools.

To get started, you should set your CLASSPATH to include the classes directory.

Here is an example CLASSPATH setting under Windows that includes the WabaSDK classes directory as well as the current directory. The CLASSPATH tells Java where to look for classes:

    > set CLASSPATH=\wabasdk.10\classes;.

This example assumes you are developing programs from the command line. If you are using a graphical development tool, you'll need to find the CLASSPATH setting in the development tool's options and set it to include the "classes" directory.

You should include the current directory (by using a . as in the above example) if you are going to be running Waba programs from the command line using Java. If you are running under UNIX, remember that the delimiter for the Java CLASSPATH setting is a colon and not a semi-colon as it is under Windows.

Starting Out

To get started, let's write a simple "HelloWorld" program. Every Waba program that has a user-interface has a main window. The class that defines the main window of a Waba program is called "MainWindow".

Here is a HelloWorld program that draws "Hello World" on the screen:

    import waba.ui.*;

    import waba.fx.*;

    public class HelloWorld extends MainWindow

    {

    public void onPaint(Graphics g)

      {

      g.setColor(0, 0, 0);

      g.drawText("Hello World", 0, 0);

      }

    }

The first thing done in the above program is an import of the waba.ui and waba.fx packages. These packages contain the user-interface and effects classes required to create a program with a user-interface.

The onPaint() routine is called when the main window needs to paint its surface. The onPaint() routine is called with a Graphics object that can be used to draw in the window.

Methods that start with the prefix "on" are methods that you can override in a class to do things such as paint the surface and handle events. This prefix helps you to determine what methods you should implement vs. what methods you call to do things.

When the onPaint() method is called, the background has already been drawn so it is not necessary to clear the background before starting to draw.

The first thing in the onPaint() method is a call to set the current color to black. Colors are represented as red, green and blue color values, so the call to set the current color to black is g.setColor(0, 0, 0).

After setting the color, "Hello World" is drawn at coordinates (0, 0) which is the upper-left hand corner of the window.

Testing the Program

To run HelloWorld under Java you need to compile it:

    > javac HelloWorld.java

and then run it with:

    > java waba.applet.Applet HelloWorld

Notice that we can't simply execute HelloWorld directly since it is not a Java application. The waba.applet.Applet class provides an application main() that can start up a Waba app.

You can also run HelloWorld as a Java applet. Again, you use the Applet class to do this. The applet tag should look like:

    <applet code=waba/applet/Applet.class

     width=160 height=160>

    <param name=appClass value="HelloWorld">

    </applet>

With the code above in a .html file, you should be able to display the applet by executing:

    > appletviewer <filename>.html

Installing the Program on a PalmPilot

Once you've compiled and debugged your app under Java, you can move it over to a PalmPilot in just a couple of steps.

The programs you need to use to install your app on a PalmPilot are contained in the WabaSDK. They are called "exegen" and "warp". The exegen and warp programs in the WabaSDK only run under Windows (Windows95, 98 and NT).

Although the exegen and warp programs in the WabaSDK only run under Windows, there are versions available for other platforms. If you are using Sun Solaris or Linux for development, see the Waba FAQ for links to ported version of these programs.

The exegen program generates a small PalmPilot executable that launches your application. It also generates a .lnk file for Windows CE but if you're only developing for the PalmPilot you can ignore that file.

The exegen program has a number of parameters that specify the application name, icon and amount of memory that should be allocated for the program when it runs.

Let's give the program a name of "Hello". We'll generate a PalmPilot executable called "Hello.prc" to launch the program. In this example, we let the exegen program generate defaults for the program's icon (a black box) and memory:

    > exegen Hello HelloWorld Hello

As a note, you can execute the exegen program with no parameters to see the full list of defaults and parameters available.

The first parameter "Hello" is the name of the output file. A .prc will automatically be appended to it. The second parameter "HelloWorld" is the name of main window class.

The third Hello specifies the name of the warp file containing the program's classes (the .pdb is automatically appended). We'll create the warp file containing the program's classes a little later.

If you're familiar with PalmPilot development, you'll notice we did not specify a creator id. The id is automatically generated based on the program's name. If you run exegen without specifying the /q option, you can see the creator id it generates.

After you generate a Hello.prc file, you can install it on your PalmPilot with the Pilot install tool that comes as part of the Pilot desktop. You might want to try installing the Hello.prc right now and try to run it. It should give you a message stating that its classes were not found since we haven't installed the application's classes yet.

It could also give an error message saying that it couldn't find a WabaVM if one hasn't been installed on the machine. You'll need a WabaVM installed on the PalmPilot for your program to run. The VM does not come as part of the WabaSDK, it is available separately from the downloads on this web site. If you haven't done so already, you should download and install the WabaVM on your PalmPilot before continuing.

Next, we'll use the "warp" program to generate a file containing the application's classes. The classes are not modified by this program, they are simply packaged up into a PalmPilot PDB file. This is also known as a WARP (Waba Application Resource Package) file. Warp files can contain things other than classes, in fact they can contain files of any type.

Here we generate a warp file for the Hello program containing the HelloWorld class:

    > warp c Hello HelloWorld.class

The name we give the warp file must match the name of the warp file we specified when creating the launch program with exegen. If it does not match, the launch program will not be able to find the warp file containing the programs classes.

In the example above, we added a single class to the PDB file "HelloWorld.class". We could also have used:

    > warp c Hello *.class

to add all classes in the current directory to the PDB file. After creating the Hello.pdb file, you can install the PDB file on your PalmPilot using the install tool that came with your Pilot. When you click on the Hello icon, your program should run.

One note, the Pilot doesn't reload the list of applications displayed in the main menu by default. Many times, you'll need to switch to another program (such as Security) and then switch back to the main menu to get a new program to appear in the menu after installing it.

Also, to update an existing Waba program on the Pilot, you only need to reinstall the PDB file to install the new classes. You don't need to reinstall the PRC file. Unless, of course, you want to change the icon, name or memory to allocate for the program.

Installing the Program on a Windows CE Device

Now that we've built the HelloWorld program and installed it on a PalmPilot, we can try installing it on a Windows CE device. The process is very similar to what we did to install it on a PalmPilot.

For Windows CE, we need to generate two files; a launch program and a file containing the program's classes. We use the same programs we used for the PalmPilot, "exegen" and "warp" to create these files for Windows CE.

In fact, things are even easier because the exegen and warp programs automatically generate both the files for the PalmPilot and the files for Windows CE at the same time.

When we ran the exegen program to generate a launch executable for the PalmPilot, it also generated a .lnk launch file for Windows CE. A .lnk file is a Windows shortcut.

And when we ran warp to generate a .pdb for the PalmPilot, it also generated a .wrp file for Windows CE. A .wrp file is a Windows CE warp file.

So, if you've already created the .lnk and .wrp files by running the exegen and warp programs, you're ready to install the program on a Windows CE device. If you haven't yet run warp and exegen, you can execute the following:

    > exegen Hello HelloWorld Hello

    > warp c Hello HelloWorld.class

These are the same commands we used to generate a launch and warp files for the PalmPilot.

To install the program on a CE device, you should create a Hello directory under "\Program Files" on the device and then copy the Hello.wrp file into it. Then you should copy the Hello.lnk file into the directory containing the Start menu.

By default, the generated .lnk file will look in the "\Program Files" directory for a directory with the same name as the program to find the program's .wrp file. If you want to the put .wrp file somewhere else, you can specify a different directory using the /p option with exegen.

You will also need a WabaVM installed on the CE device for the program to run. A WabaVM for Windows CE is available from the download section of this web site.

If you are running the Windows CE emulator from the "Microsoft CE Platform SDK", you should use the "empfile" program to copy the .lnk and .wrp file to the emulator for testing.

User Input

Our first sample program simply printed some output to the screen. In this example, we'll show how to handle events such as pen and key input.

Let's write a program called Scribble that lets a user scribble on the screen. We'll start out by subclassing MainWindow like we did before:

    import waba.fx.*;

    import waba.ui.*;

    public class Scribble extends MainWindow

    {

    public void onPaint(Graphics g)

      {

      g.setColor(0, 0, 0);

      g.drawText("Scribble 1.0", 0, 0);

      }

    }

Next we'll add some variables. We'll want to remember the x and y position when a user puts the pen down so we can draw from that location when they move the pen. So, we'll keep the last position in variables lastX and lastY.

We'll also need a Graphics object to draw with. Since we need to draw "outside" of the onPaint() method, we'll need to create our own Graphics object to draw with.

    public class Scribble extends MainWindow

    {

    Graphics g;

    int lastX, lastY;

    public Scribble()

      {

      g = new Graphics(this);

      }

Next, we'll add an event handler that is called when the user presses the pen down and when the user drags the pen. The onEvent() method is called with a PenEvent when a user presses or drags the pen (or mouse).

It is also called for key events but in this example we are only concerned with PEN_DOWN and PEN_DRAG events.

    public void onEvent(Event event)

      {

      if (event.type == PenEvent.PEN_DOWN)

        {

        PenEvent pe = (PenEvent)event;

        lastX = pe.x;

        lastY = pe.y;

        }

      else if (event.type == PenEvent.PEN_DRAG)

        {

        PenEvent pe = (PenEvent)event;

        g.drawLine(lastX, lastY, pe.x, pe.y);

        lastX = pe.x;

        lastY = pe.y

        }

That's it! You can now scribble on the screen.

A simple feature we could add is a button to clear the screen. The following code adds a button to clear the screen:

    public class Scribble extends MainWindow

    {

    Graphics g;

    int lastX, lastY;

    Button clearB;

    public Scribble()

      {

      g = new Graphics(this);

      clearB = new Button("Clear");

      clearB.setRect(0, this.height - 15, 40, 15);

      add(clearB);

      }

    public void onEvent(Event event)

      {

      if (event.type == ControlEvent.PRESSED)

        {

        if (event.target == clearB)

          repaint();

        }

      else if (event.type == PenEvent.PEN_DOWN)

    ...

In this code, we simply call repaint() to clear and repaint the application window. This will repaint everything in the window including the clear button itself.

If we had a more complex user-interface, we might not want to redraw the whole window. It would be better to create a control for the user to draw in and then have the clear button just repaint that control.

The Scribble example that is part of the WabaSDK takes that approach. A custom "DrawArea" control is created that the user scribbles in and the clear button only repaints that control, not the entire application window.

If you run this program under PalmOS and Windows CE, you'll notice that the button looks different between the two. The Waba user-interface classes have a different look for black & white and color (or greyscale) screens.

Under PalmOS, the black & white look is used and under Windows CE, the color look is used.

When you're developing a program and running it under Java, it will display with the black & white look. To see what it looks like in color, you can specify a /color option on the "java" command line.

You can also specify a width and height with /w and /h to see how it would look under different window sizes:

    > java waba.applet.Applet /color /w 200 /h 300 Scribble

Final Thoughts

It's important to note that you can't use long or double datatypes, threads or exceptions or your Waba program will not run under a native WabaVM.

It's also important to note that Waba doesn't prevent you from writing programs that use up large amounts of memory or that run slowly. If you are writing programs for a small device, you still need to keep in mind the limits of the device.

It's best to create and use as few classes and objects as possible to save memory while still keeping the code simple and easy to read.

Think small and simple!