5 credits project
for graduate students
There are many reasons for choosing a project instead of taking a course. One of the first reasons that come to mind is the big frustrations with regular programming courses. These courses generally have two weaknesses: you are evaluated on the basis on a 5-6 hours written exam with only pen and pencil and two, you never get the opportunity to develop applications of significant size. Usually you are to hand in 3-4 compulsory assignments during the course and naturally enough, they are not that big since students are graded on the basis of the final exam instead of the actual programs produced by the students. The exam also gives a very awkward picture of the student's skills in the course since it probably is the first, and last time, that he or she are not using a computer to develop an application. Finally, the exam is a very hard way of setting the grade, since it only evaluates one student's efforts and abilities one day of the whole semester instead of evaluating the student based on the general effort and skills in the subject.
Thus, by choosing a project we felt that we would get many things that the regular courses couldn't give us. First of all, the project finally gave us an opportunity to take part in developing a big application, providing the equipment and time to go in depth on a few subjects. In contrast to many courses, which has the aim to provide the students with general understanding within a subject, a project gives you in depth understanding of a few subjects, in our case, Java GUI programming, platform independent programming and open source development whith existing open standards.
We found the Gart project interesting because of several factors. First of all it was big and ambitious, giving us a great opportunity to push ourselves to get to a higher level than we would be able to by taking some of the regular courses at the faculty. The project gave us an opportunity to create a valuable program in Java development. We where all to familiar with the time demanding and often boring problem of setting up a GUI for Java. With The Gart this problem would be solved, as long as we kept it totally open, and set the user (the programmer) in centra.
The time aspect was also of great significance when deciding to take the project. The fact that we had a whole semester to complete one, large application opened for a whole new set of opportunities for us. First of all, we would have the time to get the program thoroughly tested and implemented, as opposed to most application developed in the compulsory courses, where you barely have time to complete the assignments. Secondly, the project had no set week schedule, giving us great flexibility in composing our own week, when and how long we where to work. Except for the project meetings we had total freedom choosing when to work on the project. This worked out very well for us, as we found ourselves being both responsible and creative towards the project. Noone within the group faded out, or needed to be pushed to work.
However, it was the idea of creating something useful that was the most interesting aspect of the project. While studying at Østfold College we had created numerous test-applications, but very few of them where useful in any way. The Gart gave us the ambition of creating something that could make a difference in Java development. Hopfully when the program is finished students will embrace the program that made GUI and Java programming fun and easy.
The ambition where to develop a fully functional GUI designer for Java. It was to be 100% cross platform compilant, fast and easy to use with "hidden" power features, such as keyboard shortcuts for all operations. The program will base it's structure on open standards and therefor have a strong foundation which easily can be extend. All code must be avalible to the public and based on the open source Gnu Public License.
The Gart must be easy to install and use. It will implement several quick start features which, makes it easy to start on new project without getting to many questions. It's very important that The Gart will not implement anything else then GUI features and that way avoid becoming a monster application using unnecessary time and resources.
By implementing all theese features we hope The Gart will be an uniqe application and appeal to all levels of Java coders.
What is Java?
Java is a quite new object oriented programming language. It is developed by Sun
Microsystems and was first initiated in January 1991. The Java compiler, written in Java,
was introduced to the public in May 1995 and Netscape announces that they plan to support the
new language in their browsers. In December the same year, it is clear that both Oracle and
Microsoft will support Java in their products. From that day, Java's market share has only
been increasing and the language has became popular by programmers all over the world.
The language itself tends to be compared to the older C++ language, due to both the similar syntax but also the object oriented nature of the language. However, Java is considered more secure and much easier to transport among platforms than its older colleague. This means that if you write a program in Java on the Mac platform, it can easily be ported to Windows or Unix with no or small modifications. In theory, a Java program can run on any platform that has a Java Virtual Machine, which includes HP-UX, AIX, Solaris, Linux, Mac, Windows and even Amiga. This is what Sun means when proclaiming "Write once - run everywhere". However, it should be mentioned that this is not completely true. Things especially like font, sound and video handling is quite different from platform to platform, and it still needs some work before Java appliations are fully cross platform compliant.
As previously stated, Java is similar to C++, but it has some advantages over its older rival. Firstly, as many programmers appreciate, Java has a garbage collector. This means that you don't have to keep track how which objects lie where in memory, and you don't have to remove them from memory once done with them. The garbage collector does all this work for you and makes programming much more relaxing.
If you are to learn Java, the natural place to start is Sun's official Java site, namely www.javasoft.com. There you'll find some good tutorials and the indispensable Java API doc. The language reference that every Java developer needs, even the most experienced Java programmer uses this on a daily basis. In addition to the JavaSoft website, we reccommend a good Java book to assist you in learning the langauge, such as Deitel's "Java Howto program". Secondly, because Java uses a virtual machine that functions as a layer between the compiled Java code and the operating system, parsing all commands from the Java program to OS specific calls, Java programmers can develop applications without thinking too much on the operating system it is intended to run on. Java can also be used on web pages in form of applets. These are Java programs that are linked to the HTML page with an <applet> or <object> tag. Furthermore, Java can be used to develop web applications using Java Server Pages and database connectivity is easy through the JDBC ( Java Dataase Connectivity ) classes.
Why did we use Java?
Java is by far the language we knew best at the time of project start. At Østfold College, Java is the
language that receives the greates attention. After the first semester with Visual Basic, there are
four compulsory courses that uses Java either as a tool or as the primary subject. We had used the language
prior to the project for network programming, database interfacing, GUI designing and small scale game
development. Thus we felt comfortable with using Java, although we knew we weren't gurus, we nevertheless
wanted to learn more from this vast language and its enormous class library.
Because of the cross platform, open source nature of the project, it was also important to choose a widely available language that ran on multiple platforms. Java also has a clear syntax and strict naming and casting rules which is great when being multiple developers on the same project. Also, the settled conventions in java (thank you Sun) helps keeping the java code so clear and clean.
After Microsoft's introduction of C#, the all ready popular Java language where even further embrased by the open source community. C# is a proprietary platform dependent development language for the MS Windows platform.
We also considered using Python as an additonal language to Java. Python is well known for it's powerful string manipulation functions, which Java lacks. Due to loss in performance when executing Python from whithin Java, and based on advice from several Python/Java coders, we choose not to use Pyton. Some string manipulation functions where instead written by ourselves, found in GartHandyMan.
Soon after starting the project, we sat down to discuss the code convensions we would like to use in our project. Since we had programmed a lot on our own prior to the project, we all had our preferred ways of doing things. However, we saw it as a good thing that all code was written in the same way, so that there were fewer doubts when developing on our own and that code "meshed" easilier when put together.
Class names
All class names starts with "Gart", indicating that the class is part of the gart package.
Interfaces starts with a "i" for "interface". After the first, capitalised letter, the classes
also "starts" with a capitalised letter.
Methods
All methods start with small letters, as in the Java code convention, and the arguments are given as
lower case letters, that are abbrevations of the object type. All words in the method name are captilised, except
the first one, as stated above. E.g. "setNewComponent( String arr[][] )".
Whitespace and braces All parantheses are entered with a space at the beginning and at the end, e.g. ( an example ). Blocks are indented 3 spaces, and tabs are of course replaced with spaces (3 spaces). Start and end braces are written on the next line under the first letter of the statement or method/class decleration.
For example:
public void setNewComponent( String arr[][] ) { ... }
What is Linux?
Linux is an open source operating system running on a 32 bit architecture. Its origin is Unix, which is
easy to spot when using the a Linux system. It has true multitasking, protected memory and is built for
networking and multiple simultaneously logged on users. The core operating system, the kernel, is written
in C and is maintained and updated by numerous contributing hackers around the world. Due to the open source
nature of Linux, everyone can download it, view and modify the source, and of course, use it.
Linux has historically been used as a server OS, especially as the companion to the Apache web server, but also as a file server, database server and mail server. However, Linux has developed hugely the later years to become a worthy desktop alternative to Windows and Mac. Today, it is used even as gaming machine as several software houses, has begun shipping games on the Linux platform. However, Linux is first and foremost used on the desktop as the preferred OS of software developers. Preferred for its stability, scalability and easy system resources access.
For what did we use Linux and why? We have used Linux as the server OS for our CVS server. Furthermore, we have used Linux as our desktop OS for not just programming Java, but also for coding HTML, XML and CSS, designing with UML and creating illustrations for the various reports. However some development where done using Window 2000. Using Window made us aware of several multiplatform problems during the project evolution. Catching theese problems in an early stage of project period helped increase program robustness. Unfortunately we didn't have a Mac with JDK installed avalible and thus further testing of The Gart is needed on this OS.
As a server OS Linux was an obvious choice partly because of it's close relation to the open source community, but most of all for it's stability and relatively easy to use features.
Another reason for choosing Linux as a development platform is its speed and ease of reconfiguration, something that is greatly need when working on big Java programs. For instance, the JDK java compiler is much faster on Linux than the Windows version.
Furthermore, the three of us where fairly familiar with the Linux OS, how to install, configure and use it. And therefore it was easy to decide upon Linux as opposed to other unices. Not to mention that its license is free and that we have a lot of Linux competence at the College, if we were to run into problems. This was also the reason for choosing Debian Stable version 2.2r3.
The web is the place to promote our project and to communicate with the general public. Therefore it is important that the web pages are well made, easy to navigate and accessible to all people on the net.
The pages are coded in Emacs and are written after the XHTML 1.0 Strict specification from the World Wide Web Consortium ( W3C ). The W3C is an organisation that sets various standards on the Internet, such as XHTML, XML and CSS. We've done this for two reasons. Firstly, it's considered good craftsmanship to write code after the W3C recommendation, secondly by doing so, we ensure that the pages will be displayed as intended if the browser used to display them, has implemented the standards correctly.
We have also followed another standard put forth by the W3C, namely Cascading Style Sheets. Cascading Style Sheets, CSS for short, is a language for specifying the appearance of a markup document, such as HTML and XML. This separates the structure and presentation as intended by the W3C. All structure is put into the HTML document, whereas the presentation is described in the CSS file. This way, it's much easier to display the contents of a page appropriate to the device used for displaying the pages. Also, the use of CSS decreases the amount of code needed to make a website. Since all pages link to the same style sheet, the formatting information is only written in one file, instead of in every file. This way, it's easy to change e.g. the font on all pages, change it in one file and the change is applied to the whole site.
One great challenge when coding websites is to make them behave identical on the different browsers and platforms. Especially the Netscape 4 browser can be troublesome. We have spent some time to make the pages available to web surfer regardless of browser and platform. Our pages are displayed "correctly" on Mozilla, Netscape 4, Netscape 6, Opera, Lynx and Internet Explorer. The work on the Windows, the Mac and the Linux platform, they load fast and scale well to different screen sizes.
The website is decided in six sections, "news", "download", "documents", "diary", "contact us" and "home". The diary section is the one that has been updated the most. Every day we have worked with the project, we have entered a new entry to the diary, stating what we did do. This way, it has been easy for all interested in our project to be updated on the current developments on the project. Thus, giving our coordinator an easy way of follow our progression and spotting problems and stagnation under the way. The diary also has a link to our hours-used page where the three of us have added the hours used working on the project since june.
We have put a lot of information around our project on our site. Under the document and the download section, one could read about project meetings, class diagram and problems conserning the project as well as the actuall program and source code.
Concurrent Versions System is the Unix worlds eqvivalen to Microsoft's Visual SourceSafe. It is open source software that gives you version control on your files. It is based on using the commmand line, but it is also available with a Windows GUI.
The purpose of this piece of software is to prevent users to overwrite echothers work and have a means of tracing back changes to a file. All versions of all files are kept in the CVS repository and it is possible to retrace versions of the files and checkout these instead of the latest version, which is returned by default. CVS works by creating a "safe" where you put all source files of a program. The users of the CVS then checkout their own local copy of the repository to their home accounts. Changes to the code is then checked in to the "safe" and a change log is updated. If several users have modified the same files, these can be merged, or you can "lock" certain files, so that users don't get to change the one you are working with.
We have installed the CVS on gart.hiof.no and have checked out the code to our home areas at the workstations where we have done our work. This has given an extra dimension of security regarding our code, since the code has at all times resided at two machines.
We used CVS because we knew that we would be several people working on the project. We are familiar with the problems from previous programming projects we were familiar with the problems of overwriting files and version control. We found therefore CVS a great tool for providing us with version control of our source files. Furthermore, we found out that it wasn't just source code CVS was great for, so we soon included howto documents we had written, Java doc and shell scripts to the CVS tree. This way, could just do a cvs co gart to get all files related to the project, having to keep track of the different documents and scripts in order to work with the Gart project.
If gart.hiof.no is taken down, an updated cvs-repository shall publically available on gart.sourceforge.net, for to people who wants to keep developing the Gart.
What is UML?
First of all, UML is an abbreviation for Unified Modeling Language. As the name suggests, UML is an attempt
to collect previous standard notations to one, common standard notation for modeling systems/programs.
In order to handle larger systems, it is vital to in some way model/design a plan on how the system is to function and how the different parts work together. Models can also be a nice helping hand to spot new classes, methods and variables that needs to be created or modified. The down side with different standards for notation is that one symbol easy can mean different things in different systems, and naturally this causes confusion and frustration among developers and project managers.
In addition to a collection of symbols, UML also defines a collection of diagrams in which the symbols can be used. There are diagrams where one can define the user's demands and needs towards the system, in addition to diagrams for stating various static and dynamic system behavior. Some diagrams, for example the component and class diagram are directly connected to the program code whereas other diagrams such as the usercase diagram and the sequence diagram only are meant as a help in the system development.
The nine diagrams defined by UML are as follows:
Activity diagrams
Use case diagrams
Deployment diagram
Class diagrams
Component diagrams
Object diagrams
Collaboration diagrams
Sequence diagrams
State chart diagrams
Of course, one can use the diagrams of choice, one is not committed to use all of them in order to follow the UML standard. In our project, we have chose to only use the class diagram
For a further description of UML, see the sources list.
Why we used UML
We soon realised that the project would grow very big. At least too big to that we could
keep the overview of the system without any help, such as a graphical representation of the system.
In other words, we didn't start hacking away at the system without first designing the system
with the help of UML. This helped us greatly in spotting system implementation issues, such as
interfaces, utilities and of course the backbone classes needed.
We live in an object oriented world and we strive at all times to follow the laws and joys of the community. Object oriented modeling is therefore, in addition to a necessity a natural way of here at Østfold College where we have compulsory course in "Modeling and System Development".
According to the UML model, the development process is user case driven, architecture focused and iterative. Object oriented analysis and design is about analysis of the problem, not how to implement the. The design is an expression for a solution of the problem: object oriented but programming language independent.
One of the advantages of this developing model, is that due to its usercase driven nature, it is always the user's needs that has the focus and drives the to excel. Not a single class should be added to the system if you can't prove that it supports of the usecases, thus keeping the focus on the user's needs. Another great thing about the UML model, the iterative nature of it. Each iteration in the system development should give a prototype of the system, the development team a chance to test the system at early stages of the development, spotting early in the process. These prototypes are also great to convince customers that system is moving in the right direction and gives them a good opportunity to give quality feedback the development phase.
Why we have used UML can be sumarised in these points:
Although a good UML diagram takes time to design, it makes things much easier when a system of this size.
A graphical representation of the system is a necessity when a system of this size.
The development process becomes more clear and precise. UML is a part of using a good architecture. With this we mean: simplicity, elegance, clarity, well formedness of course that we remain in the object oriented world.
eXtensible Markup Language
XML is powerful markup language that is a subset of SGML, just like its famous little brother HTML. Unlike HTML, XML is created for describing much more than just the of text and some pictures on a canvas. Therefore, one can define own elements and in XML and then make it up to the programming parsing the XML code what to do with the parsed.
The DTD, or Document Type Definition, is a file where you declare your different elements and entities. You then specify what they should contain and what they shouldn't. You then link your XML to your DTD to make the entered in the XML follow "your standards" stating in the DTD. This is exactly the same way it works when you write HTML pages. The DOCTYPE header specifies which DTD at W3C that determines what you can and you can't write in your HTML file, thus the different HTML versions, e.g. HTML 4.01 Transitional.
The aspect of XML in The Gart is a very important one. Although Java code generation the main objective of the program, XML is the format The Gart interacts with internally.
What we wanted to do, was to describe a Java GUI in the open format XML. This way, we would give a language independent description of a program GUI, something we believe is not yet done for Java GUI builders.
To accompany this, we made a parser for generate Java code from this XML representation of the GUI. Of course, Java code was what we wanted with this GUI building, but one immediate consequence of XML as a saving format, is that by making parsers that took the Gart XML and parsed it to other languages, our program could easily be a generic GUI builder and not just a Java tool.
The real challenge of using XML as a working format for the program, was to agree on the DTD design of the gartproject. At first, it all seemed pretty straight forward, but it soon came to us, that some issues needed to be dealt with in a more delicate way. We soon encountered cases where the layout of the DTD was far from obvious and we had many discussions on how to do it. After numerous revisions, we feel that we have agreed on a neat way of describing the GUI in XML.
The class that does the real XML handling is the GartXMLCrawler, residing in the gart.util package. It is used directly by the GartCodeGenerator and does what its name suggests: crawls DOM structures and returns the information requested.
Since XML handling was such an issue, and used to such a big extend in the program, we decided on seperating all the XML work in a seperate class, something which has worked very well for us.
The UML diagrams created to the project has been designed with the Dia program, which is a small application shipped with most Linux distributions. It was surprisingly easy to use and well equipped. We have used UML only to create a class diagram in order to get an overview of the classes used the project. It was early obvious that we need some sort of help to keep track of how the different classes worked and how the interacted and used each other. We did not use UML for anything else, such as diagrams or code generation, only class diagram for an overview, and for this task little Dia was more than sufficient.
Emacs has been the program we've practically been living inside when working with the Gart project. This great, extensible programming editor is one of two big editors in the UNIX world. Written initially by Richard Stallman and released under the GPL, it is included on most distributions of Linux and can be found on all flavors of Unix. One of the remarkable things about the editor is the fact that it can be extended and modified with help of the Elisp programming language. This way, you can write elisp code to enhance the editor and customise it to meet actually your demands and needs. For example, to meet our Java code conventions, we had to write a little Elisp function to change the behavior of C mode in Emacs ( the mode used when editing Java files ).
(defun my-c-mode-hook () (setq c-basic-offset 3) (c-set-offset 'substatement-open 0)) (add-hook 'c-mode-common-hook 'my-c-mode-hook)
We have used Emacs for Java programing, HTML, CSS, XML and DTD coding in addition to writing miscellaneous texts such as howtos and reports.
We have used Sun's Java Development Kit version 1.3 (JDK) as Java compiler, virtual machine and JavaDoc generator. All theese tools er familiar, an we had little problem using them.
For different illustrations we used The Gimp. The Gimp is the Unix world's Adobe Photoshop and is surprisingly powerful. It is quite different to use, and it handles layers somewhat differently than Photoshop and Paint Shop Pro (familiar programs on the Windows platform), and we used therefore some time to figure it out. But once familiar with the interface and ways of doing things, The Gimp is fast and a reliable tool for creating graphics.
When not in Unix/Linux, the best alternative to Emacs is JPadPro. It is great for coding, and has many of the same shortcuts as Emacs, and even some others that are very practical.
When Java is to be imported into The Gart, it is done in two steps. The Java is first parsed to XML after the gartproject.dtd. Then, this DOM structure is parsed to a visual representation of GartComponent objects.
When selecting a Java file to import, the GartGUI class uses
an instance of the GartCodeGenerator. This class handles both
the Java to XML process as the XML to Java procedure. The
code generator uses its java2xml() ( logically ) to do this job.
The first thing it looks for, are the two flags
The code that exists outside these flags is put in temporary String variables within the code generator class. Code that the Gart does not recognise as her own, inserted by the user, is wrapped inside GartGarbageCode objects and put in a Vector, garbagebag. This "garbage code" is then inserted in the same place as it was when importing the Java into the Gart. That is, the GartGarbageCode objects has a field with the previous approved Gart code. So, if a user has inserted a comment on the succeeding line of a setFontMethod(), this information is put in the object. Comments on the same line as Gart code, is deleted.
There are some restrictions on what kind of Garbage Gart gives
back when regenerating Java code from a previously imported
Java file. Only comments can be inserted inside
the
When the code generator has filtered the code it can parse to XML, it sends the XML string further to the GartCanvas that has a method, openGartProject(), that takes a XML string and creates GartComponent objects that can be visually displayed on the GartCanvas.
If the Gart encounters some code it does not understand, it will just continue with the code it can handle and displays the result as good as it can manage.
The exporting of Java code was the initial objective of the program. Thus, this functionality gained high priority in the development of the project.
When given the command, the GartGUI class again uses the GartCodeGenerator to output the Java code. This time, it is the xml2java() method, that is the main method. It uses the GartXMLCrawler to crawl the XML structure it receives from the GartCanvas, throughh the dumpCanvasToXMLI() method. The crawler goes through the DOM tree and returns a Vector holding a lot of GartComponentProperties objects. These objects holds, sa their name suggests, all properties of a Gart Component. This includes its variable name, its cas, coordinates and other properties. The code generator then goes through this Vector and fetches each of the GartComponentProperties objects.
The code generator then builds up a String holding an XML description of the GUI. The GartComponentProperties objects are iterated and their values are inserted used for creating a new Java file. It assumes, of course, that the XML it receives from the Canvas validates after the gartproject.dtd. If the there should be any errors in the XML, the current GartComponent will be left uncompleted and the crawler will proceed to the next GartComponentProperties object.
The xml2java() constructs two blocks of code, one for the <gart:global-variables> block and one for the <gart:setup-method> block. If the Gart session comes from an imported Java file, the non Gart recognisable code, stored in GartGarbageCode objects, is fetched and used for putting the user's code back in the Gart generated Java code.
Another very importent issue on the Java generation, is the use of templates. There are several ways of using a template in The Gart. When first launching The Gart, the user is given the option of four application types: JApplet, JFrame, Applet and Frame. All these four application types have their own template, residing in the <gart-install-path>/templates. The JApplet, for example, use the template <gart-install-path>/templates/japplet.template. This information is passed on the the code generator and used in the finished Java file.
The user can also make his/her own template and place it in the same directory as Gart's templates. The only restrictions for this are that the user template must have a .template suffix, and have the two gart flags <gart:global-variables> and <gart:setup-method>.
The third way the Gart makes use of templates, is when the user issues the 'Import Java' method. The imported Java file becomes a template in itself. Everything outside the gart flags, which also here must be present, is treated as a Gart java template file.
The use of Java templates enables the user to increase the productivity of Java application development, and we feel that the user is left enough freedom to do whatever he or she pleases outside The Gart. However, as mentioned earlier, there are some restricitons on the Java code that is to be Gart compatible, but this had to be in order to get the import and export to work.
On the other side, a even more flexible and forgiving import functionality in the Gart is a good candidate for future installments and development on the program.
GartComponent extends JLabel. This because JLabel is both easy to doublebuffer (swing), easy to modify with images, and can display text and images at the same time. It has a neutral look, that can be changed with borders. In addition, GartComponent.java has a few helper methods, and fields. The most important to notice is the fields 'properties', 'cast' and 'name'. 'Properties' is a double string array, which is used to store variable properties. See GartPropertyWindow to better understand how this array is used. 'Cast' and 'name' are two core properties, 'cast' is an own field, while 'name' represents the usual name field of any Component, this field, as well as x, y, width and height is overridden simply for control, and future expansions. Quite common design pattern. The last field that is overridden and is a core property, is 'foreground' color. This is frequently changed, to indicate wether or not a GartComponent is selected or not. See also the use of borders to indicate this. Other core properties not yet needed to override are 'background' and 'font'. GartComponent is the only ever component to occur on GartCanvas.
The DTD defining a gartcomponent before it enters the canvas (no properties except cast), looks like this:
<?xml version="1.0" encoding="UTF-16"?> <!ELEMENT component (property*)> <!ATTLIST component cast CDATA #REQUIRED > <!ELEMENT gartcomponents (package+)> <!ELEMENT package (component+)> <!ATTLIST package name CDATA #REQUIRED > <!ELEMENT property EMPTY> <!ATTLIST property method CDATA #REQUIRED datatype CDATA #REQUIRED >
And a corresponding xml file like this:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE gartcomponents SYSTEM "gartcomponents.dtd"> <gartcomponents> <package name="javax.swing"> <component cast="JButton"> <property method="Text" datatype="String"/> <property method="ToolTipText" datatype="String"/> <property method="DefaultCapable" datatype="boolean"/> <property method="Visible" datatype="boolean"/> <property method="Opaque" datatype="boolean"/> </component> <component cast="JLabel"> <property method="Text" datatype="String"/> <property method="ToolTipText" datatype="String"/> <property method="Visible" datatype="boolean"/> <property method="Opaque" datatype="boolean"/> </component> ..... ..... ..... </package> <package name="java.awt"> <component cast="Button"> <property method="Label" datatype="String"/> </component> <component cast="Label"> <property method="Text" datatype="String"/> </component> <component cast="TextArea"> <property method="Text" datatype="String"/> </component> <component cast="TextField"> <property method="Text" datatype="String"/> </component> <component cast="Checkbox"> <property method="Label" datatype="String"/> <property method="State" datatype="boolean"/> </component> ..... ..... ..... </package> <package name="myclasses.mycomponents"> <component cast="myButton"> <property....../> </component> ..... ..... ..... </package> </gartcomponents>
From this you can tell what kind of component it is, and which variable properties it has. When it it put on the canvas, a few properties are set (x, y ,width and height), and other can be set by user. The component will display any gif image/icon that you put in your .../component_icons/ directory. Otherwise it will only display text (caption). After it is put on canvas it is represented by this xml-representation with following DTD:
<?xml version="1.0" encoding="ISO-8859-1"?> <gartproject type="applet"> <component cast="JButton" name="" x="450" y="242" width="115" height="70" font="dialog.bold|1|12" background="204|204|204" foreground="102|102|153"> <property method="Text" datatype="String" value="myButton"/> <property method="ToolTipText" datatype="String" value="Click here to be enlightenede..."/> <property method="DefaultCapable" datatype="boolean" value="false"/> <property method="Visible" datatype="boolean" value=""/> <property method="Opaque" datatype="boolean" value=""/> </component> <component cast="JTextArea" name="kjklø" x="192" y="157" width="115" height="70" font="dialog.bold|1|12" background="204|204|204" foreground="102|102|153"> <property method="Text" datatype="String" value=""/> <property method="ToolTipText" datatype="String" value=""/> <property method="Visible" datatype="boolean" value=""/> <property method="Opaque" datatype="boolean" value=""/> </component> </gartproject>
Where empty an 'value' attribute indicates that the set method corresponding to the 'method' will not be generated in java (i.e. the property is not set by the user during the Gart session). The 'datatype' attribute should explain itself. The 'name' attribute is the only core-property that must be set by user, if it is not, one is generated by the convention button1, button2, etc...
The DTD:
<?xml version="1.0" encoding="UTF-16"?> <!ELEMENT component (property*)> <!ELEMENT gartproject (component*)> <!ATTLIST component cast CDATA #REQUIRED name CDATA #REQUIRED x CDATA #REQUIRED y CDATA #REQUIRED width CDATA #REQUIRED height CDATA #REQUIRED font CDATA #REQUIRED background CDATA #REQUIRED foreground CDATA #REQUIRED > <!ATTLIST gartproject type CDATA #REQUIRED > <!ELEMENT property EMPTY> <!ATTLIST property method CDATA #REQUIRED datatype CDATA #REQUIRED value CDATA #REQUIRED >
As one can see we allow empty gartprojects, that is gartprojects without components. Also we allow components that does not have other properties than the core-properties.
GartCanvas also extends JLabel. This might be a bit unlogical, but as JLabel actually contains all that JPanel contains, in addition to some other useful features, this choice was made. Since JComponent extends Container and all swing components extends JComponent, all swing components are practically containers as well. The most significant tasks for the canvas is the handling of components. That is how to draw them, resize them, move them, update them, and align them. Seven align functions are implemented, and a background image is optionally set in the preferences, to have a grid-reference. The align functions does simple coordinate calculations which aligns the components vertically, horizontally, by width, height, and also the spacing between them.
The GartCanvas and the GartComponent uses the same MouseListener. That is for operations concerning mouseClicked, mousePressed and mouseReleased (mouseEntered and mouseExited are not implemented as the same functionality is achieved with MouseMotionListeners ). The pressed/released methods generally checks where the mouseEvent happened (right on the canvas or inside a component), and sets references concerning x/y coordinates, in case a dragging event will occur. The mouseClicked method activates/deactivates the canvas and selected component(s). These methods also checks wether a popupmenu should be displayed, they check if the mouseEvent is a 'popuptrigger', this is platform dependent and does not work under linux. All choices on the popupmenu are available in the menus though...
The canvas and the components on it have different mouseMotionListeners. This is because they perform totally different tasks. All mousehandling is implemented in GartCanvas or in inner classes though. The mouseMotionHandler in GartCanvas handles motion and dragging events on GartComponents. Motion updates which cursor to display, while dragged resizes and moves. The selectionHandler is GartCanvas' MouseMotionListener, and handles selections and freehand drawing of GartComponents depending on which cursor the user has activated. It also does multiple dragging/moving of components. All resizing and dragging depends on the coordinate references set in the MouseListener methods described in previous paragraph.
The canvas can dump all components on canvas to xml-format. In the future we wish to constantly work on a DOM-tree, such that the xml file would always be updated. The 'dumping' simply reads values from all components on canvas, and generates a xml-file corresponding to .../etc/gartproject.dtd. From that point sax or dom is always used.
A few challenges were met and solved during the development of GartCanvas. First of all, we tested wether the use of real objects would be possible (i.e. a java.awt.Button on canvas would in fact be an instance of java.awt.Button ). The thought was that since this project handles components on component level, this could be implementable. The major reason why we did not come through with this, was that we would have to exclude java.awt to do it. Heavyweight and lightweight components does not work well together. Also it was of course a major advantage to totally control the components on canvas. Secondly we had thoughts on the eventhandling on canvas. Should we write external handler-classes? We said no, for simplicity while programming. It is a fact though, that GartCanvas, with nearly 3500 lines of code, can be optimized. It is not very far from following most design patterns and conventions, but I wish to rewrite it now that I have the whole perspective. It probably won't make any major differences, maybe none at all, but it will be a bit easier to understand the code and continue its development. Finally, we did spend quite som time, understanding the whole perspective on how java updates components. Both on screen and inside the components. One must be 100% accurate when it comes to when to revalidate and repaint components and containers. This was challenging but we learned a lot from it. And it was a good feeling to take control over it and totally understand it.
In the future I am thinking of how one can use a layered pane, to simply generate previews, and work on several canvases (so that they can be put together). Another approach could be tabbed panes. But the Gart should in the future be able to handle several canvases at the same time, implement containers so that you can put canvases together and also compile and generate previews in realtime.
The toolbox uses a JTabbedPane to display the components it offers. It also displays current mousecoordinates on the canvas, and currently selected component both in the toolbox and on the canvas. This information should maybe be have been displayed another place, please come with suggestions;) Anyways, the swing and awt components are hardcoded, and takes the two first panes. If you wish to add other awt/swing components, this must be added as a custom package, that is: in the xml-file, you must define a new package, not use awt/swing. This because we wish to have a few core components that is most oftenly used, that we can add extra features to, to make it look and feel extra good. The toolbox is the class that parses gartcomponents.xml, and makes initial property arrays, that is sent into a GartComponent when added to the canvas. Also it keeps track of which component is selected and gives the GartComoponent its cast when added to canvas. More about the proerty-array under GartPropertyWindow.
The GartToolBox does not hide much magic. It is a simple and logic class.
GartPropertyWindow is a dynamic panel, which is feeded with propety-arrays from the canvas. When a single component is selected, the propertywindow is updated. It will always display inputoptions for the coreproperties. In addition it generates input options for variable properties described in the property-array, depending on datatype. The setNewComponent()-method does the dynamics in the GartPropertyWindow. It removes all current properties from GartPropertyWindow, adds core-properties and then the variable properties from the new component. The property-array is arranged in the following way (remember: this is a field within each GartComponent on canvas).
arr[n][t]: String array with all the general properties. "n" indicates one property row. "t" can have values from 0 to 2. arr[n][2] contains the value of the property arr[n][1] contains the name of the corresponding set-method arr[n][0] contains the datatype. if a boolean do input through radiobuttons, otherwise textfields.
As you can see this corresponds to the property element of gartproject.dtd.
an example: arr[0][0] = "String"; arr[0][1] = "Text"; arr[0][2] = "Press button to continue"; arr[1][0] = "boolean"; arr[1][1] = "Visible"; arr[1][2] = "true";
This would generate in XML:
<property method="Text" datatype="String" value="Press button to continue"/> <property method="Visible" datatype="boolean" value="true"/>
And in javacode:
componentX.setText( "Press the button to continue" ); componentX.setVisible( true );
How the GartCanvas, GartComponent, GartToolBox and GartPropertyWindow works together
All communication between the canvas, toolbox and propetywindow goes through the gui controller class: GartGUI.java. It is implemented through the interfaces iCanvas/iProperty/iToolBox - Messenger.java. The canvas contains all components and thereby have direct access to them. In the future we wish to use interfaces here as well, to 100% clearify what the canvas is allowed to do in GartComponent. The whole sequence generally goes like this:
-GartToolBox parses gartcomponents.xml and gets initial properties for each component. -When an GartComponent is added it fetches this information from the toolbox (with new references of course) -When a GartComponent is singly selected, the GartPropertyWindow is notified, and dynamically rebuild corresponding to the property array of the selected component.
See also sequence-diagram 'Early working sketch on how canvas, toolbox, components and propertywindow will work together'.
We decided eary in the project that all documents concerning the project would be public and avalible on the web site. In August we published the preproject report at gart.sourceforg.net. In the report we had set up five milestones for the project. No deadlines and and dates where specified, but we have continously during project meetings decided the pace and speed of the project progression. This have worked out fine and we feel we have reached our primary goal, to create an usable GUI design application for Java.
The five milestones where:
1.Research
Find resources on the net and consult fellow students and supervisor. There is alot happening on
the GUI front of Java. Also, we need to spend some time to find out how to optimalise our code in
order to make it run faster than standard Java applications, which are too slow. Byte compiling Java
source, is in particular interesting and requires further investigation.
2.System analysis and design
Discussions on how the system is to both look and function, the so called "look and feel" of the program.
It is important to do a thorough job here in order to get a mutual, clear view of the program objectives
and how these are to be implemented.
Making sketches of the actual program GUI will also be important in order to make the software as easy to use as possible.
Several discussions need to be made in order to find out how the program is to parse different meta information, such as program configuration and flags in the Java code.
3.Implementation
Naturally, this will be a giant milestone. A natural start will be to make the GUI first in order the
whole thing actually will look like, and it will thereby be easier to figure out how the program will function.
After getting the user interface to work, we will be working on the code generation from the layed out GUI components. When this works ( hopefully ), we will look at how to do this the other way, that is to generate a graphically representation of code previously generated by The Gart.
4.Testing
Testing is an essential an also a very important part of developing software, often overlooked by developers.
We have already gotten voluntairy beta testers at the University of Trondheim, NTNU, and will also
be needing the help from fellow students at our own faculty, at Østfold College in order to make our
program as good as possible.
5.Documentation
Our intention is that the program shall be so user friendly that no documentation is needed. However,
we will have help available both as a big document and as a functions within the program.
We started discussing the Gart already in June and deliverd a project application as soon as we had worked out what kind of project we wanted. In July we where away on summer vacation but we had the project in mind all summer. When we got back in August a lot of ideas and features had evolved during the summer and we where eager to get started.
A simple diary where set up and we have updated this log as often as possibleduring the project development. There are several advantages using a diary, it is usefull tokeep all the project mebers up to date on what have been done by who and when. The diary is also a valuable part of the project documentation and makes it possible to follow the development day by day.
The diary has a link to an hours used page, where each one of us have written down the hours spent on the project. The hours used page is mostly for our own use to see how much time we have used on the project, and making it easier to ajust project work to other school or work assignments.
Sourceforge.net is owned by Open Source Development Network, Inc. ("OSDN"). OSDN, the Open Source Development Network, is the leading news, collaboration and distribution community for IT and Open Source development, implementation and innovation. SourceForge.net's mission is to enrich the Open Source community by providing a centralized place for Open Source Developers to control and manage Open Source Software Development. ( source: www.sourceforge.net )
The Gart is an open source project, released under the GPL licence. In general this means that the source code is available to the public and that everyone can make changes to the code as long as they post their changes back to us. SourceForge is a site that has built up a huge open source community where everyone, either using or developing open source software, can take part. We signed up the Gart project and got accepted as a SourceForge project whithin a day. This meant that we got access to lots of features on the SourceForge site to help us developing and promoting the project. We have only used parts of the features available, because we have access to a local server, which works faster than the SourceForge server. Nevertheless, we will move our CVS repository to Sourceforge after the project has ended at the College, as we plan to continue developing The Gart in the future.
The Result
We have implemented an fully functional GUI creator for Java. While working on the Gart we often mentioned how convenient it would have been if the Gart was finished and could be used to implement the Gart. For this to be possible it had to fall throughe a time glimpse on the Internet. Unfortunately the was not the case and we had to strugle with the GUI problem one last time.
Besides using a lot of time on the Gart GUI we encouncured few problem that could not be solved either by workarounds or by the excellent bug databas at Sun's web site. We have put a lot of effort into making the program scalable and on most areas it is. The user can add his/hers own components by editing the XML-file. It is important to stake out that the Gart is a GUI and will not be able to
It was very satisfying to make a real, useful program for once. Most programs we make in our studies at Østfold College are for illistrating a point, testing a feature or aspect of programming, but not for being used for a real purpose. The Gart is what we have been hungering for: an application we are certain we will use in future Java projects.
We have encountered several cross platform challenges while doing a project this semester. For starters, we have discovered several differences in the Java implementation for Linux versus Windows. Once again, has Sun's slogan "Write once, run everywhere", proved itself to be untruthful. Especially is this true for different GUI issues and Java printing. The GUI problems has mostly to do with Frames and Swing components. It seems that its difficult to use Frames with Swing components on Windows, whereas the same application shows just fine on Linux. The problem was often that the apllication started allright, but it was scaled to 1x1 pixel (!) on one platform, whereas the same application scaled correctly to e.g. 500x500 on a different platform.
Another mysteerious problem to us, is the printing aspect of Java. The printing functionality in The Gart, is that the user can print the current Gart project's Java code to a printer of the user's choice. The printing module works just fine on Windows, but on Linux, nothing happens after selecting which printer to use. ( We used just 'lpr' as printer in Linux. This should use the default printer set up in /etc/printcap ).
Apart from the two themes: mixing Swing and Awt components and printing, there was little difference in the Java implementation on Windows and Linux. The Gart runs now happily on both the Microsoft and the GNU platforms.
A good thing that we have received throughout the project time is a great enthusiasm from fellow students, when they got a demonstration of the Gart. This great fellow studentship inspired us and made it easier to keep the steem up in throughout the semester.
It has been a great strength for the project that we have had both Linux and Windows developers on the team. This made the project process a great arena for disussing program design, and philosophy. We can conclude that what is obvious one world may be the quite oposite in another. It all comes down to perpspective and philosophy. Nevertheless, we feel that we have reached good design solutions, leaving The Gart both easy to use, yet advanced enough to be configurable and expandable to the user.
In the pre project report we mention that The Gart will run on Windows Linux and Mac. Unfortunately we have been unable to test The Gart on the Mac platform. We where familiar with both Windows and Linux, but sparsely knowledge conserning Mac and Java development. Searching the web we found that the new Mac OS X shippes with Java development support. We have Mac machines with OS 9.x avalible with only runtime enviroment 1.8 avalible and no development tools for Java, and thus we have been unable to test The Gart. From Mac newsgroups we learned that it is possible using workarounds and CodeWarrior to develop Java applications on Mac OS 8 and 9 but this was not recomended.
Although The Gart is a fully working program by the end of the project there are a few things we have in mind for further development. Since the program is highly scalable the Gart can without much trouble be expanded to support JPanels. It would be a nice feature to connect to the users favourite editor or be able to compile the Java code created in the gart. Theese are, however, features The Gart work perfectly well without.
This is the help section of The Gart. We've divided the help in sections for your convenience, just click on the screen you wonder about, okay?
Bugs can either be reported directly to us, or by filling out a bug submission form at our project page at sourceforge.net
The first screen that appears when launching The Gart.
Project dialog
The main screen where you design your GUI
Main screen
The File menu, where you can export and import Java files,
in addition to save and open Gart files.
File menu
The preferences window where you can customise how
The Gart behaves.
Preferences Window
The code views. You can view both the Java and XML code
of your current Gart project.
Code views
Click this button if you want to create a JFrame application. The JFrame template will be used for generating the framework for the Java code. The JFrame template is located in <gart-install-path>/templates/jframe.template and can be edited to suit your needs.
By default, it imports the needed libraries, such as swing, extends JFrame, implements ActionListener and supplies the common methods used when creating a JFrame. These methods includes a constructor, setupGUI() and adctionPerformed().
Click this button if you want to create a JApplet application. The JApplet template will be used for generating the framework for the Java code. The JApplet template is located in <gart-install-path>/templates/japplet.template and can be edited to suit your needs.
By default, it imports the needed libraries, such as swing, extends JApplet, implements ActionListener and supplies the common methods used when creating a JApplet. These methods includes a constructor, init(), setupGUI() and adctionPerformed().
Click this button if you want to create a Applet application. The Applet template will be used for generating the framework for the Java code. The Applet template is located in <gart-install-path>/templates/applet.template and can be edited to suit your needs.
By default, it imports the needed libraries, such as java.Applet, extends Applet, implements ActionListener and supplies the common methods used when creating a Applet. These methods includes a constructor, init(), setupGUI() and adctionPerformed().
Click this button if you want to create a Frame application. The Frame template will be used for generating the framework for the Java code. The Frame template is located in <gart-install-path>/templates/frame.template and can be edited to suit your needs.
By default, it imports the needed libraries, such as swing, extends Frame, implements ActionListener and supplies the common methods used when creating a Frame. These methods includes a constructor, setupGUI() and adctionPerformed().
You can also use a template you have made yourself. These are Java files that are name filename.template and must reside in <gart-install-path>/templates/. They will then appear in the custom template combo box on the project dialog.
The only thing these templates must contain in order to work with The Gart, is two flags that will look like this:
// <gart:global-variables> // </gart:global-variables> // <gart:setup-method> private void setupGUI() { } // </gart:setup-method>
Apart from this, they can contain whatever you like, but The Gart will of course not guarantee that they will compile when you decide what to put in these templates.
Click here to open a Gart project that you have previously worked with.
These project files are really XML files written after the DTD located in <gart-install-path>/etc/gartprojcet.dtd and must be suffixed .gart in order to open them from the program.
It is however, possible to write the whole .gart file yourself manually, or adding blocks of code in your .gart file before opening them in The Gart. The Gart guarantees to understand your file, as long as it validates after the gartproject DTD.
On your left hand side, you will find the toolbox. This is where you select the different Java components you wish to add to your GUI.
The toolbox has different tabs with components that belong a specific package or group. By default, there are two tabs, Swing and Awt.
You may specify additional packages by editiong the <gart-install-path>/etc/gartcomponents.xml file. Be sure to validate it after the gartcomponents.dtd before loading The Gart anew. The DTD resides in <gart-install-path>/etc/ along with the other DTDs and setting files.
This is the icon bar above the canvas. Here you have access to most of the Gart functions such as New, Open, Save etc.
Note that you also have two cursor icons on the bar, number five and six from the right. The crosshair icon is for resizing and drawing GUI components, whereas the arrow is for selecting or moving components.
This is the main area of The Gart. It is where you compose your GUI.
This window is for setting the different visual properties of your Java components. When selecting a GUI component on the canvas, the coresponding properties will show in the property window.
Note that when no components are selected, the property window will just be gray.
Gives you a new Gart project. If you have a Gart project already open, you will be prompted if you would like to save this before proceeding.
This menu option can also be accessed from the toolbar with the empty sheet icon, first icon from the left.
Click here to open a Gart project that you have previously worked with.
These project files are really XML files written after the DTD located in <gart-install-path>/etc/gartprojcet.dtd and must be suffixed .gart in order to open them from the program.
It is however, possible to write the whole .gart file yourself manually, or adding blocks of code in your .gart file before opening them in The Gart. The Gart guarantees to understand your file, as long as it validates after the gartproject DTD.
This menu option can also be accessed from the toolbar with the yellow folder icon, second icon from the left.
Closes your current Gart project. You will be prompted for saving this project before closing it.
This menu option can also be accessed from the toolbar with the cross icon, fourth icon from the left.
For saving your Gart project. If you haven't saved your Gart project before, you will be displayed the Save dialog, where you can navigate to your preferred directory and choose a name for your file. Remember to add the .gart suffix to your filename, so that The Gart can recognize your file later.
If you have already saved your project, or you have opened an existing project, Save will just save fyour project without asking you for path or filename.
The filechooser will search your preferences settings for your gart files directory. If not found, it will start in your home directory.
This menu option can also be accessed from the toolbar with the diskette icon, fifth from the left.
This is for saving your current Gart project with a different filename than it already has.
This menu option can also be accessed from the toolbar with the diskette and pencil icon, fifth from the left.
The filechooser will search your preferences settings for your gart files directory. If not found, it will start in your home directory.
This menu option can also be accessed from the toolbar with the diskette and pencil icon, sixth icon from the left.
Select this option to export your currrent Gart project as Java. You will be given a file dialog where you can choose where you wish to put your Java file.
The filechooser will search your preferences settings for your java files directory. If not found, it will start in your home directory.
Select this menu option if you wish to import Java files into the Gart in order to continue your GUI designing with these.
Please note that these Java files must hold the two flags global-variables and setup-method like this:
// <gart:global-variables> // </gart:global-variables> // <gart:setup-method> private void setupGUI() { } // </gart:setup-method>
Furthermore, each variable declared within the global-variables tag, must have setBounds(), setForeground(), setFont() and setBackground() methods in the setupGUI() method in order to be properly imported to The Gart. ( Just look at one of the exported Java files from The Gart and you will figure it out ).
The filechooser will search your preferences settings for your java files directory. If not found, it will start in your home directory.
Prints your current Gart project's Java code to the printer of your choice. You are, however, first prompted for saving your project, before proceeding with the printing.
Please note that the printing facility in the Gart has not been given priority by the Gart team and we have only seen it work satisfactory on the Windows platform. We believe this is a bug in the Linux implementation of Java.
This menu option can also be accessed from the toolbar with the printer icon, seventh icon from the left.
Here you will find the five recent Gart projects listed. Select one of them to load your previous work. You will be prompted for saving your existing, open Gart project.
Click here to leave the Gart. You will be prompted for saving your existing, open Gart project.
Here you can specify four elements. Show dialog, gart files path, java files path and path to your favorite editor.
Sow dialogs toggles if the user wants confirmation dialogs for selecting an application type at the project dialog.
The gart files path is the directory where you want to put all your Gart project files. The file chooser will go to this directory first, when issuing New, Open, Save and Save As requests to The Gart.
The gart files path is the directory where you want to put your Java files. The file chooser will go to this directory first, when issuing 'Import Java' and 'Export Java' commands to The Gart.
The third path field is to your favoritet editor. This is of no sifinicans at the time being as this is not yet implemented in The Gart. However, in future versions, you will be given the option of viewing your code in your favorite editor instead of the Gart Viewer.This tab is for customising the way The Gart generates your Java code.
Indentation is how many spaces you want for each indentation, 3 is default.
Braces on next line, toggles if you want your open brace to go on the next line of each block statement.
Substatement offset is how many spaces you want for a substatement offset. This means additional indentation for the open brace in a code block. This is set by 0 by default.
for( int i = 0; i < 10; i++ ) { System.out.println( "This has substatement offset = 1" ); }
The code settings will not affect the rest of the template you are using for generating Java code, only the code within the gart flags.
Settings for the canvas, that is the biggest frame on the main screen in The Gart. You can set two things, if you want a visible grid, and if so, what grid type you want.
The grid types are listed in a combo box, and resides in the <gart-install-path>/canvases/ directory. These are simply big GIF images that are suitable for a GUI designing background. You may, of course, put any GIF picture you like, on your Gart backgorund.
It is possible to view both the XML and Java code of your current Gart project. This functionality is accessed either by clicking on the Java and XML buttons on the toolbar or by selecting the Java and XML entries on the View menu, third menu option from the left.
There are four icons available in the viewer. These are, counting from the left, searching the document, printing the document, refreshing the content ( if something has changed on the Gart canvas ) and for closing the code view.
An example on how the XML code of a Gart project looks in the GartViewer.
An example on how the Java code of a Gart project looks in the GartViewer.
Both when viewing the XML and Java code, it is possible to search the code for a specific string. Just enter your query in the textfield and hit [ENTER] or click "Submit" to submit your query to the viewer.
If found, the text will be highlighted in the viewer. Note that there is a bug in the Java VM for Linux. You need to click the code view window and then click the search dialog again for this highlighting to work.
The user needs two files to install the gart: install.py and gart-1.0.tar.gz. The install script, install.py assumes that Python is installed on your system ( default on most Linux systems ), the user uses the Bash shell and that if already set, the CLASSPATH value is set with quotes. All these assumptions are based on default settings/configurations on most Linux systems.
[shell_prompt$] python install_gart
It is also possible to do the install process manually:
Extract the tarball gart-1.0.tar.gz and
start the program with java gart.TheGart.
If you are jusing JDK 1.3 or lower,
you need to extract the JAXP classes
and the JAXP libraries to your CLASSPATH variable:
jaxp.jar, crimson.jar and xalan.jar
[shell_prompt$] tar xvzf gart-1.0.tar.gz -C /myinstall/directory [shell_prompt$] unzip /myinstall/directory/gart/bin/jaxp/jaxp-1.1.zip -d /myjaxpinstall/directory [shell_prompt$] emacs ~/.bashrc Add: JAXP="/myjaxpinstall/directory" export CLASSPATH="$CLASSPATH:.$JAXP/jaxp.jar:$JAXP/crimson.jar:$JAXP/xalan.jar" [shell_prompt$] cd /myinstall/directory/gart/source/ [shell_prompt$] java gart.TheGart
The only thing the user needs in addition to these two files, is a Java VM, that should be installed on all systems where one wants to develop Java applications.
WindowsYou supplied two setup.exe files. The one under the directory 'VM' contains an installation for users that does not have a java virtual machine (VM) installed ( Java Runtime Environment, JRE). We supply JRE 1.2.2_09 for Win32.
The setup.exe under the directory 'NoVM' is of course for users with VM already installed (NoVM means no VM in the setup package...). Most likely, users of this program both have JRE/VM, and most probably a version of JDK installed. Anyhow, the installation supplies you with rt.jar (runtime library for java), and crimson.jar/xalan.jar/jaxp.jar which are the jars needed for XML-handling. These are distributed with JDK 1.4, but not before this, and most users will not have these installed. Also the classpath, and the user.dir variable is set through the installation (really when InstallAnywhere runs our program through their environment lax.jar, this jar file is found under the installation directory).
This means that you can use this installation on a PC without any previous java-installations, and run The Gart. One thing should be mentioned though. We have used (the freeware version of) InstallAnywhere. InstallAnywhere somehow runs our program a bit different. This is probably because they run it through their "own java vm", lax.jar. A few minor bugs occurs, that is not present if you start the program right from the command line, instead of using the .exe-file from InstallAnywhere. Among these bugs are the generating of recent files list on the file menu, which messes up some indexes, before it has reached its maximum of 5 (five) recent files. Other bugs has not been present to us yet, but we suspect them of being there. Any bugs found when you start the program from the command line are our own fault though...
To start the program from the command line, make sure to set the classpath to the 'source' directory under the installation directory. This directory contains the whole Gart package structure with both source and class files. Also it contains rt.jar, xalan.jar, crimson.jar and jaxp.jar.
These are various links that we have encountered and found useful during our work with the Gart project.
http://www.sourceforge.net
http://www.linux.com
http://www.redhat.com
http://www.debian.org
The official Emacs site at GNU
Torstein Krause Johansen's Emacs pages
The ambition is to develop a GUI designer for Java.
The program is to be open source and 100% cross platform compliant, something that currently does not exist. Furthermore, it will be small, fast and easy to use with "hidden" power features, such as keyboard shortcuts for all operations.
The project is initially a 10 ECTS credits project at the Computer Science faculty of Østfold College, under supervision of professor Børre Stenseth. However, we hope that the project will be of interest to the open source community and that they will contribute with ideas and constructive criticism.
Currently, there are several big software vendors that deliver IDEs ( Integrated Development Environment ) that have a GUI designer ( such as Borland JBuilder and Sun Forte ). However, these programs are big, slow and are properitary software. Furthermore, they force the user to use their set of tools ( e.g. editor and debugger ) in order to develop Java programs.
We will therefore develop a program that only does the GUI design, is open source, and gives freedom in terms of choice of tools to be used. The code generated by The GUI Artist ( The Gart ) will be easy understandable and complient with code conventions used by the Gart project. The program will also feature reverse engineering of code previously generated by The Gart.
Håkon A. Jensen
hakon.a.jensen@hiof.no
Torstein Krause Johansen
torstein.k.johansen@hiof.no
Harald Tolleshaug
harald.tolleshaug@hiof.no
Professor Børre Stenseth
borre.stenseth@hiof.no
Server hardware for setting up CVS ( Concurrent Versions System ) and websever. The CVS server is a great way of keeping version control of files when several people develop on the same project. It will also easen the work of retracing our steps when questions arise regarding the program progression. With a CVS server, it will also be easier to work with the project, wherever the participants may be.
An own webserver is also a great way of promoting the project that we hope and believe will be received with interest by the Java community.
The server will also function as a storage for our local copies of the CVS repository, easining the load on our own home accounts on the regular school servers.
Due to the open source nature of our project, we chose to only use cross platform programming languages, open standards and open operating systems when developing the program.
Java will be our primary programming language during this project. CGI and maybe some program modules handling text parsing will implemented in Python. We will also use various Unix scripts for analysing various debug information.
Please note that although we develop and run our servers on Linux, the finished product will run on multiple platforms, alt least Windows, Linux and Mac.
Webpages Design and maintenance. Signed up at sourceforge and got full web hosting with CGI privileges and shell access. Our pages can now be viewed at gart.sourceforge.net.
When several people are working on the same project, it is an advantage if everybody writes code in the same manner. After a short discussion on how to write Java code, we agreed on a 'programming standard'.
The project will be heavily based on Java and thus, it will be necessary to research what is available, especially in terms of the graphic libraries ( such as java.awt, javax.swing ). Furthermore, it will be important to find out what is already available in the GUI design genre, what is good and what can be improved, in order to make our product a unique contribution to the Java community.
Find resources on the net and consult fellow students and supervisor. There is alot happening on the GUI front of Java. Also, we need to spend some time to find out how to optimalise our code in order to make it run faster than standard Java applications, which are too slow. Byte compiling Java source, is in particular interesting and requires further investigation.
Discussions on how the system is to both look and function, the so called "look and feel" of the program. It is important to do a thorough job here in order to get a mutual, clear view of the program objectives and how these are to be implemented.
Making sketches of the actual program GUI will also be important in order to make the software as easy to use as possible.
Several discussions need to be made in order to find out how the program is to parse different meta information, such as program configuration and flags in the Java code.
Naturally, this will be a giant milestone. A natural start will be to make the GUI first in order the whole thing actually will look like, and it will thereby be easier to figure out how the program will function.
After getting the user interface to work, we will be working on the code generation from the layed out GUI components. When this works ( hopefully ), we will look at how to do this the other way, that is to generate a graphically representation of code previously generated by The Gart.
Testing is an essential an also a very important part of developing software, often overlooked by developers. We have already gotten voluntairy beta testers at the University of Trondheim, NTNU, and will also be needing the help from fellow students at our own faculty, at Østfold College in order to make our program as good as possible.
Our intention is that the program shall be so user friendly that no documentation is needed. However, we will have help available both as a big document and as a functions within the program.
We hope to have the program finished by the time we reach the middle of December 2001. However, it is perfectly alright for others to participate in the project with ideas or corrections or to develop it to suit others' needs, as long as the report their changes to the code back to use ( all of this in accordance with the GPL licence ).
Since we are only three group members, we must both work on all the different components of the project. However, this may be subject to change. But how we will solve this, is yet to be decided.
When starting the program, the user will be promptet for what kind of application he/she wants to develop, either Java Frame, Java Console, or Java Applet. These three choice can again be chosen with or with the Swing graphical components.
The user will then be sent to the main design view, where he or she can add, remove, resize, move and change visual properties of different graphics components.
Code can then be generated with the click of a button and the the result viewed from within The Gart. It will also be possible to go the other way. I.e. to view GUI from code previously generated The Gart, so called reverse engineering.
There are also some things that may be implemented in the program, such as invoking standard editor for actually viewing and modifying the code, viewing online documentation in web browser and printing ( this will be platform dependent ).
This is a list of features in The Gart. All the features are ordered by priority. 1st priority features are vital parts of The Gart and will be implemented, while 2nd priority features migth be included during the project evolution.
The Gart will use XML for representing which graphic components will be available, for configuration of the Gart, for representation of the GUI (made in Gart), and the user's preferences.
Reverse engineering of java code generated by The Gart. The Gart will always work on a XML representation of the GUI, and will feature parsers for xml2java, and java2xml.
The Gart will generate a java file, with flags defining code-parts, which are Gart dependent. A java file can be reversly engineered, but only code parts within flags will be extracted, and updated in the java file. This means that you can come back to Gart (import your java file) and add to/update the GUI without affecting the rest of your java code. The java file will then work as a template for The Gart, and a new xml representation of your GUI is generated. This can be illustrated:
We discussed the features of The Gart, their importance and how to implement them. Børre Stenseth made us aware of a few problems that might occure later on in the project. Here's a list of what we discussed.
All project member presented their status. Torstein had worked on GartProjectDialog, GartViewer, GartPreferencesWindow, GartFileHandler and various connection between these classes.
Harald had been working the framework for the GartFooBar. GartCanvas and GartComponent have increasing functionality and will soon be finished. The main worry right now is some mystical behavior in the GartComponent.
Håkon have been fighting with the GartPropertyWindow. He is working on getting generic use of the functions handling incoming String arrays of GartComponent properties and the presentation of these properties.
We discussed the timeline ahead. When we are to finish the implementattion of the first Gart prototype. Without code parsing and generation. This is to be accomplished by the end of week 42.
We agreed to divide the work as follows:
We agreed on some program design issues, especially that the GartProject is to be a quite thin class, solely calling methods in other classes and only storing information unique to the current project.
Since our last meeting many of the GUI classes have been implemented, but the heavy logic remains to be done. Here is a list of what we discussed.
Hellekjær is one of the few Mac users at Østfold College and we hoped he could give us some answers conserning Mac and Java development, as well as give us an introduction to the Mac world.
Since Hellekjær works at the faculty for English at Østfold College, he has little knowledge of what Java developers need. Never the less he is an expert in using Mac.
We ( Torstein and Håkon ) got an introduction to how Mac users work and how the window system is buildt up. Hellekjær downloaded a program and showed us how easy it is to install new applications on Mac.
He told us that after using Mac OS X for a while he went back to OS 9.1 because OS X still lacks support for numerous applications.
We also tried to download and install jdk for Mac, but was unable to find jdk for classic Mac OS. One of the biggest differences we found between Windows, Linux and Mac is the absens of a text console on Mac.
We decided to look further into the Mac java bit later on during the project development.
Torstein and Harald presented their latest development on The Gart. Håkon was back from his exams and got updated on The Gart's progression.
With only a week left of the project a list of todos was written down:
A deadline for finishing java coding was set to wednesday 12th. The remaing time is dedicated to the project rapport and documentation of The Gart.
Thursday 30.08.2001 3 hours Friday 31.08.2001 6.5 hours Tuesday 04.09.2001 4 hours Wednesday 05.09.2001 5 hours Friday 07.09.2001 7.5 hours Tuesday 11.09.2001 5 hours Wednesday 12.09.2001 5 hours Friday 14.09.2001 6 hours Monday 17.09.2001 1,5 hours Tuesday 18.09.2001 6 hours Wednesday 19.09.2001 5 hours Friday 21.09.2001 7 hours Tuesday 25.09.2001 9 hours Wednesday 26.09.2001 5 hours Friday 28.09.2001 7 hours Tuesday 02.10.2001 8 hours Wednesday 03.10.2001 5 hours Friday 05.10.2001 3 hours Monday 08.10.2001 4 hours Tuesday 09.10.2001 5 hours Wednesday 10.10.2001 3 hours Friday 12.10.2001 3 hours Monday 15.10.2001 2 hours Tuesday 16.10.2001 6 hours Wednesday 17.10.2001 5 hours Thursday 18.10.2001 2 hours Friday 19.10.2001 5 hours Monday 22.10.2001 1 hours Tuesday 23.10.2001 7 hours Wednesday 24.10.2001 5 hours And then came the flu... Saturday 03.11.2001 4 hours Tuesday 06.11.2001 5 hours Wednesday 07.11.2001 2 hours Thursday 08.11.2001 2 hours Friday 09.11.2001 3 hours Monday 12.11.2001 3 hours Tuesday 13.11.2001 5 hours Wednesday 14.11.2001 2 hours Friday 16.11.2001 7 hours Tuesday 27.11.2001 11 hours Wednesday 28.11.2001 9 hours Friday 30.11.2001 10 hours Monday 03.12.2001 8 hours Tuesday 04.12.2001 6 hours Wednesday 05.12.2001 8,5 hours Thursday 06.12.2001 7 hours Friday 07.12.2001 6,5 hours Sunday 09.12.2001 3 hours Monday 10.12.2001 11 hours Tuesday 11.12.2001 6 hours Wednesday 12.12.2001 8 hours Thursday 13.12.2001 7 hours Friday 14.12.2001 9 hours Saturday 15.12.2001 2,5 hours
Monday 13.08.2001 4 hours Monday 27.08.2001 6 hours Tuesday 28.08.2001 5 hours Wednesday 29.08.2001 5.5 hours Thursday 30.08.2001 3 hours Friday 31.08.2001 7.5 hours Tuesday 05.09.2001 5 hours Wednesday 06.09.2001 4 hours Friday 07.09.2001 7.5 hours Tuesday 11.09.2001 5 hours Wednesday 12.09.2001 7 hours Friday 14.09.2001 6.5 hours Tuesday 18.09.2001 6 hours Wednesday 19.09.2001 5 hours Friday 21.09.2001 6 hours Tuesday 02.10.2001 2 hours Wednesday 03.10.2001 5 hours Friday 05.10.2001 4 hours Saturday 06.10.2001 2 hours Monday 08.10.2001 2 hours Tuesday 09.10.2001 3 hours Wednesday 10.10.2001 4 hours Friday 12.10.2001 7 hours Saturday 13.10.2001 2 hours Sunday 14.10.2001 1.5 hours Monday 15.10.2001 4 hours Tuesday 16.10.2001 4 hours Wednesday 17.10.2001 4 hours Friday 19.10.2001 7 hours Tuesday 23.10.2001 3 hours Wednesday 24.10.2001 1 hours Tuesday 30.10.2001 4 hours Wednesday 31.10.2001 5 hours Tuesday 06.11.2001 5 hours Wednesday 07.11.2001 2 hours Friday 09.11.2001 3 hours Tuesday 13.11.2001 5 hours Wednesday 14.11.2001 2 hours Friday 16.11.2001 7 hours Tuesday 20.11.2001 3 hours Wednesday 21.11.2001 4 hours Tuesday 27.11.2001 11 hours Friday 30.11.2001 5 hours Studying for my exams. Tuesday 11.12.2001 1 hours Wednesday 12.12.2001 10 hours Thursday 13.12.2001 8 hours Friday 14.12.2001 7 hours Saturday 15.12.2001 7 hours
Monday 13.08.2001 4 hours Monday 27.08.2001 5 hours Tuesday 28.08.2001 5 hours Wednesday 29.08.2001 5.5 hours Thursday 30.08.2001 3 hours Friday 31.08.2001 6.5 hours Tuesday 04.09.2001 7 hours Wednesday 05.09.2001 5,5 hours Friday 07.09.2001 7.5 hours Tuesday 11.09.2001 5 hours Wednesday 12.09.2001 8 hours Friday 14.09.2001 6.5 hours Tuesday 18.09.2001 6 hours Wednesday 19.09.2001 8 hours Friday 21.09.2001 7 hours Thursday 27.09.2001 3 hours Sunday 30.09.2001 3 hours Tuesday 02.10.2001 3 hours Wednesday 03.10.2001 3 hours Friday 05.10.2001 3 hours Saturday 06.10.2001 4 hours Sunday 07.10.2001 4 hours Tuesday 09.10.2001 1 hour Wednesday 10.10.2001 3 hours Friday 12.10.2001 7 hours Tuesday 16.10.2001 6 hours Wednesday 17.10.2001 6 hours Tuesday 23.10.2001 8 hours Wednesday 24.10.2001 1 hour Tuesday 30.10.2001 5 hours Wednesday 31.10.2001 3 hours Friday 02.11.2001 6 hours Tuesday 13.11.2001 4 hours Wednesday 14.11.2001 10 hours Wednesday 21.11.2001 5 hours Saturday 24.11.2001 2.5 hours Tuesday 27.11.2001 7 hours Wednesday 29.11.2001 8 hours Friday 30.11.2001 6.5 hours Sunday 02.12.2001 6 hours Tuesday 04.12.2001 9 hours Wednesday 05.12.2001 8.5 hours Friday 07.12.2001 7 hours Saturday 08.12.2001 4.5 hours Sunday 09.12.2001 4 hours Monday 10.12.2001 6 hours Tuesday 11.12.2001 6 hours Wednesday 12.12.2001 11 hours Thursday 13.12.2001 8 hours Friday 14.12.2001 7.5 hours Saturday 15.12.2001 4 hours Sunday 16.12.2001 10 hours Monday 17.12.2001 5.5 hours
List of hours used on the project
Håkon & Harald & Torstein: Working like crazy to finish the documentation.
Håkon: Working on the documentation.
Harald: Wrote report, tested the use of InstallAnywhere. Made a few
bug fixes in The Gart.
Torstein: Made install script for Linux, wrote user's guide and documentation.
Håkon: Worked on the project report. Describing the different technologies and utilities used in the project development.
Harald: general bug fixing in GartCanvas, updated GartFooBar with shortcuts and canvas menu, wrote dtds for gartproject.xml and gartcomponents.xml. Added selectAll method to Canvas, and print method to GartGUI through gart.util.GartPrintFile (code from Sun...) Torstein: Fixed a number of smaller and bigger bugs in the GUI and the CodeParser. I also wrote a lot of Javadoc. Import of self written Java files, now work as own templates to Håkon: Finished comenting GartFontSelection and iGartFontMessenger. Fixed true/false bug in GartPropertyWindow. Started on the project report.
Harald: Updated gartcomponents.xml, finished javadoc for canvas, and toolbox. Added functionality on canvas for automatic scrolling when you are dragging, and goes outside current viewport.
Torstein: Worked like crazy to implement the keeping of user inserted code/comments into the Gart generated Java code. It now works perfectly with comments, code inserted is somewhat a little dismanteld, but still userful.
Håkon finished commenting GartPropertyWindow and started commenting GartFontSelection. Made the code more readable.
Harald finished align functions on canvas, and updated the popup menu. Generally worked on toolbox, canvas and gartcomponent... Håkon updated the web pages in general. Added two new summaries and updated the uml diagram.
Torstein: worked a lot on the SaveAs, Export Java and Import Java functions. Coding like crazy on the crawler to get the lates updates in the gartproject.DTD. Reverse engineering now works! Håkon got back from his exams.
Harald: finished recent-files thing in foo-bar, worked on general functionality, and bug fixing, and fixed grid/dot images for canvas in addition to images for the GartDialog Torstein: Worked on the Project Dialog. It's now possible to both use own defiend java file templates and open existing projects.
Torstein: Worked on the Project Dialog.
Torstein: Worked on the code parser. Solved a number of trickies regarding import of java files that the user has tinkered with.
Torstein: Worked on the CodeGenerator. Made GartGarbageCode objects for storing info about where in the code the user's "garbage" was inserted into the Gart generated java code. For use in reverse engineering. Fixed a little bit on the viewer and preferences dialog.
Harald: added refresh function to gartviewer, updated toolbox with info pane, added undo, redo, cut, copy and paste functionality to GartCanvas (not finished).
Torstein:Worked on the code generator. <gart:setup-method>: It's now possible to add comments, single line and multiline + java code that has nothing todo with what has been declared under <gart:global-variables> and get them back after new codegeneration.
Harald: Fixed a few error-checking bugs in GartPropertyWindow, a few in GartCanvas, added grid to Canvas, made some thoughts on the templates we will distribute with the Gart, and generally tested most functions currently implemented...
Torstein: worked a little bit all over the place today.
Especially on the preferences window. The setting of
properties in runtime -> effect etc.
Harald: kept working on logic concerning multiple selection,
alignment and other user-interactive cores on the canvas.
Harald:
-worked on misc. bugs during first half of day, luckily all were fixed.
-continued working on the logic concerning multiple selections and aligning/deleting
Torstein: worked a lot on the toolbar and the menubar. Beautifying it :-) Fixed an OS bug in the codegenerator and made some workaround in viewer.
Harald:
-updated toolbox, no awt components are now used on the toolbox, this fixed
problem with tooltiptext and menus falling behind other components
-added multiple selection on the GartCanvas, all logic is NOT FINISHED;)
-added icon functionality to GartComponent
Torstein: Worked on the toolbar, menubar, project and viewer. Sewing some of it together.
Torstein: Worked on the toolbar.
Making it all compile again, changed some OS specific things, into OS independent.
Torstein: worked on the CodeGenerator. xml2java(), it should be pretty finished now. Started on the java2xml() and it's about 60-70*% finished. Harald and Håkon worked on binding the GartToolbox, GartCanvas and the GartPropertyWindow together. Thereby sending propertyarrays back and forth, and updating values in GartComponents on the GartCanvas.
Torstein: worked on the CodeGenerator. xml2java().
Torstein: worked on the CodeGenerator. Had some serious talks with Håkon and Harald :-)
Harald: worked with Håkon on making the GartCanvas, GartPropertyWindow and GartToolBox work together. Wrote javadoc for GartCanvas and the interfaces used by GartGUI.
Torstein: At last, I got the XML crawler to work. Agreed on some good component property string design with Harald.
Torstein: had some quarells with the XML Crawler. Quite frustrating really. Discussed some XML design with Harald.
Torstein: worked with the GartXMLCrawler. It's pretty much finished now, atlthough it needs some tuning in order to get it to play along with the other Gart components :-) Updated website.
p Håkon: Worked on how to send component updates from GartCanvas to GartPropertyWindow. Added iGartCanvasMessenger method sendCanvasMessage() to GartGUI. Started on stringrepresentation of the GartComponent class. Added simple WindowListener to GartGUI for clean shutdown of the program. Torstein: continued with the XML crawler.
torstein: started on a generic class for XML handling. GartXMLCrawler. It is to be used by different classes that need to crawl a DOM tree. Also added a jaxp install script to the tree. Updated our account at Sourceforge. Håkon implemented an OS independent file/path method.
harald: continued on the work with binding GartCanvas, GartToolBox, GartPropertyWindow and GartComponent together. made uml sequence diagram for the binding. continued to work with the xml files needed by the binding. torstein: changed the GUI from being totally null based with panels to use a nested JSplitPane. Also, aded a toolbar component, so now it can look cool to!
harald: continued on the work with binding GartCanvas, GartToolBox, GartPropertyWindow and GartComponent together. started to work on the xml files needed by the binding.
torstein: Continued to mesh the different classes used initially by The Gart. The preferences window now works as intended, with syncronization towards the gart/etc/gartconfig.xml file. Håkon updated the web pages. harald: started binding GartCanvas, GartToolBox, GartPropertyWindow and GartComponent together.
torstein: worked on the GartPreferencesDialog. Håkon updated the UML-class diagram. harald: still working on the GartCanvas
Håkon worked on the GartPropertyWindow class.
Håkon worked on the GartFontSelection class. How to return string representation of the font properties selected.
Torstein: Worked with the transfer of properties between the different files. Håkon continued working on the FontSelection class and how to return font properties to the GartPropertyWindow.
Håkon created a FontSelection dialog for choosing different font properties. It appears that null layout comes with a lot of scrolling difficulties. Struggled a bit with that too. No solution found yet. Torstein: worked on miscellaneous sewing.
torstein:Continued to mesh all the different startup classes. Completed the configution swoop in the Gart, it is now configured by the etc/gartconfig.xml file. Started meshing the GUI classes and the "ground workers".
torstein:Oktober worked on the GartPreferenencesWindow, finishing it up. Started to mesh all the different startup classes. Hå worked on the GartPropertyWindow class and implemented string representation of a few property types. Gave up on the GridBagLayout and changed it to null layout.
torstein: updated the UML diagram,
worked on GartProject/Dialog and some CVS issues.
harald: continued working on GartCanvas and GartComponent.
Got the canvas to behave better today:)
Haakon worked on the GartPropertyWindow class and struggled
with the GridBagLayout in both Windows and Linux.
Continued the implementation. Worked on the property window, dialog functionality, the gart components, the gart canvas and the project dialog.
Continued the implementation. Worked on the property window, the gart components and the project dialog.
Started implementing drag'n drop, GartFooBar, GartViewer and GartPropertyWindow. Finished GartFileHandler.
Set up Java with swing, and Emacs with JDE. Made a shell script for installing the different JDE packages and a configuring Emacs to load and use them. Started programming, GartConfigurator, iGartConfig, GartFileHandler, GartFooBar and GartPropertyWindow.
Had a short project meeting, discussing the road ahead with focus on the implementation. Made a UML sequence diagram on how the Gart will react when initialising a new project. Thus getting a feel of what classes will be needed in the beginning and what we will be needing to focus on in the beginning of the implementation. Used a lot of time setting the different clients up, with remote CVS access and Emacs.
Continued with DTDs. Finished setting up the server. Had a project meeting with Børre, where we discussed central problems concerning reverse engineering, representation of java files contra xml, and other topics from our features list. Took a finalizing discussion on these topics and updated the features list with our new decision.
Started on setting up debian server. Continued with the DTDs.
Improved the gartcomponents DTD and wrote sample XML. Expanded and documented the UML diagram. Explored how to execute Python from within Java, got a hint to the java.lang.runtime class. Updated website, added a few 'lastmodified' scripts in Python. Discussed program design. Started working on DTDs.
Made a list of features that The Gart will support and what it will not support. Worked with the DTD for the graphical components to be used when creating GUIs in the Gart. Discussed how to design the XML structures and DTDs. Wrote project log.
First project meeting with Oh Great Professor, Børre Stenseth. Got project approval from the college administation. Recruited new project member, Harald Tolleshaug -welcome on the team Harald! Had a project briefing for Harald.
Continued with website. Prepared for the first real project meeting tomorrow with Børre Stenseth. Made sketches, designed UML diagram and The Gart logo.
Designed website, uploaded it to Sourceforge. Finished pre project report, discussed different aspects of developing the Gart. Made proposals for a Gart logo.
Wrote the "Pre project report", registered the project on Sourceforge and applied for an account there. Discussed and agreed on miscellaneous procedures on how we were to work with the different parts of the project.
First project meeting. A lot of discussions and brainstorming. Made numerous skethces and request lists. Talked to different people about how to implement the Gart. Agreed on development procedures.
gart/ source/ gart/ TheGart.java util/ GartCloseWindowAndExit.java GartCodeGenerator.java GartCodeParser.java GartConfigurator.java GartComponentProperties.java GartFileHandler.java GartFilter.java GartHandyMan.java GartGenericFilter.java GartJavaFilter.java GartSTATICVARS.java iGartCanvasMessenger.java iGartConfig.java iGartFontMessenger.java iGartGUI.java iGartMainMessenger.java iGartPropertyMessenger.java iGartSearch.java iGartToolboxMessenger.java iGartViewerMessenger.java gui/ GartFontSelection.java GartFooBar.java GartGUI.java GartGUIComponent.java GartPreferencesWindow.java GartProjectDialog.java GartPropertyWindow.java GartSearchDialog.java GartSubSplitPane.java GartToolbar.java GartToolbox.java GartViewer.java exception/ GartException.java session/ GartProject.java GartComponent.java GartCanvas.java uml/ gart.uml gart.png xml_properties_toolbox_canvas etc/ gartconfig.xml gartcomponents.xml gartconfig.dtd gartcomponents.dtd gartguirepresentation.dtd bin/ compile_gart.sh gart_javadoc.sh jde/ install_jde.sh jde_packages.tar.gz jaxp/ installl_jaxp.sh jaxp-1.1.zip doc/ cvs_howto garthelp/ about.html javadoc/ canvases/ dots_gray.gif dots_white.gif grid_gray.gif grid_white.gif templates/ applet.template frame.template japplet.template jframe.template