<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.gnustep.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Comrade</id>
	<title>GNUstepWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.gnustep.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Comrade"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php/Special:Contributions/Comrade"/>
	<updated>2026-05-14T02:18:06Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.7</generator>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Adding_a_new_Natural_Language_to_GNUstep&amp;diff=5656</id>
		<title>Adding a new Natural Language to GNUstep</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Adding_a_new_Natural_Language_to_GNUstep&amp;diff=5656"/>
		<updated>2009-07-13T11:41:45Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Creation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These instructions are loosely based on a mail from Fred Kiefer. &lt;br /&gt;
&lt;br /&gt;
== General approach ==&lt;br /&gt;
&lt;br /&gt;
To have a localized application, not only will the application have to be translated, but also GNUstep-base and GNUstep-gui if they've not already been done.&lt;br /&gt;
&lt;br /&gt;
Check to see if base and gui support your language. Language support bundles are present in the Resources directory in the source distributions with an extension .lproj.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' By convention, these localization bundles are named in English.&lt;br /&gt;
&lt;br /&gt;
If your language is not supported yet, copy the English.lproj bundle and name it to the language you wish to support.&lt;br /&gt;
&lt;br /&gt;
At a minimum, you will need to translate the bundle's Localizable.strings file and the package's (or subproject's) GNUmakefile to include the new language name in the xxx_LANGUAGES variable. If the resource (such as a GUI application, or GNUstep-gui) uses .gorm files for GUI elements such as menus and panels, these will also need to be translated using Gorm.&lt;br /&gt;
&lt;br /&gt;
== Localizable.strings ==&lt;br /&gt;
&lt;br /&gt;
Localizable.strings is a file containing strings in a base language (often English) which correspond to strings embedded in the source code and the translated string.&lt;br /&gt;
&lt;br /&gt;
You will need to put strings that correspond to the language you are targetting in the right hand column. Missing quotation marks, equal signs or terminating semicolons will cause problems.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Applications need to use the _() syntax in source code to support automatic use of Localizable.strings.&lt;br /&gt;
&lt;br /&gt;
== GNUmakefile ==&lt;br /&gt;
&lt;br /&gt;
Add the name of the language to the project's ''projectname''_LANGUAGES variable. &lt;br /&gt;
&lt;br /&gt;
== Gorm files ==&lt;br /&gt;
&lt;br /&gt;
Find all files ending in .gorm that were copied from the orginal language bundle and load them one by one. Change all the text that is displayed to the user in menus, panels, windows, buttons and so on, and if necessary, also change the layout (average string length and height tend to differ between even closely-related languages, right-to-left languages may conventionally place default buttons in different locations on panels, as examples).&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
[[http://gnustep.made-it.com/GSPT/xml/Tutorial_en.html#AEN1516 Dennis Leeuw's tutorial]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Developer_Guides&amp;diff=5655</id>
		<title>Developer Guides</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Developer_Guides&amp;diff=5655"/>
		<updated>2009-07-13T11:01:07Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Translating GNUstep&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is intended as a collection of guides for developers.&lt;br /&gt;
&lt;br /&gt;
== Introductory Articles on GNUstep Development ==&lt;br /&gt;
&lt;br /&gt;
{{Stub}}&lt;br /&gt;
&lt;br /&gt;
=== [[GNUstep Suite|Introduction to GNUstep Libraries and Tools]] ===&lt;br /&gt;
&lt;br /&gt;
A general overview of GNUstep.&lt;br /&gt;
&lt;br /&gt;
=== [http://www.gnustep.org/resources/documentation/Developer/Base/ProgrammingManual/manual_toc.html Introduction to GNUstep (Foundation) Programming] ===&lt;br /&gt;
&lt;br /&gt;
The aim of this manual is to introduce you to the Objective-C language and the GNUstep development environment, in particular the Base library. The manual is organised to give you a tutorial introduction to the language and APIs, by using examples whenever possible, rather than providing a lengthy abstract description. &lt;br /&gt;
&lt;br /&gt;
While Objective-C is not a difficult language to learn or use, some of the terms may be unfamiliar, especially to those that have not programmed using an object-oriented programming language before. Whenever possible, concepts will be explained in simple terms rather than in more advanced programming terms, and comparisons to other languages will be used to aid in illustration.&lt;br /&gt;
&lt;br /&gt;
=== [http://www.roard.com/docs/lmf2.article/en.html (GUI) Programming under GNUstep] ===&lt;br /&gt;
&lt;br /&gt;
This guide will introduce you to the [[AppKit]] classes and how to use [[Gorm]] to create graphical interfaces.&lt;br /&gt;
&lt;br /&gt;
=== [[Writing Makefiles]] ===&lt;br /&gt;
&lt;br /&gt;
The Makefile package is a system of make commands that is designed to encapsulate all the complex details of building and installing various types of projects from libraries to applications to documentation. This frees the developer to focus on the details of their particular project. Only a fairly simple main makefile need to be written which specifies the type of project and files involved in the project.&lt;br /&gt;
&lt;br /&gt;
=== [ftp://ftp.gnustep.org/pub/gnustep/core/gnustep-examples-1.1.0.tar.gz Sample GNUstep Programs] ===&lt;br /&gt;
&lt;br /&gt;
This isn't really an article but rather a collection of small &amp;quot;codified guides&amp;quot; for the pragmatic programmer who wants to explore GNUstep by looking at and messing around with example code. This is best done while reading about basic concepts of OpenStep or Cocoa with the API documentation ([[Foundation]], [[AppKit]]) open in the background.&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
=== [[Writing portable code|Coding for Portability]] ===&lt;br /&gt;
&lt;br /&gt;
Writing code that will compile and then run on different platforms can be surprisingly easy. This guide describes &lt;br /&gt;
some straight-forward steps to take to make your program easy to port to new platforms.&lt;br /&gt;
&lt;br /&gt;
=== [[Property Lists|Using Property Lists]] ===&lt;br /&gt;
&lt;br /&gt;
A regular issue that programmers face is storing structured configuration information, and reading it back. GNUstep has a standard mechanism that can be used for this task, amongst others: Property Lists.&lt;br /&gt;
&lt;br /&gt;
=== [[Deployment on Windows]] ===&lt;br /&gt;
&lt;br /&gt;
This article will tell you how to deploy GNUstep applications on Windows.&lt;br /&gt;
&lt;br /&gt;
=== [[Adding a new Natural Language to GNUstep|Translating GNUstep]] ===&lt;br /&gt;
&lt;br /&gt;
Translation of GNUstep applications involves a number of steps, including translation of GNUstep Base and GNUstep GUI.&lt;br /&gt;
&lt;br /&gt;
== Graphical Applications ==&lt;br /&gt;
&lt;br /&gt;
=== Simple Graphical Application Design ===&lt;br /&gt;
GNUstep includes several sophisticated development tools. GNUstep GUI interfaces are designed using [[Gorm]] (Graphical Object Relationship Modeler), an elegant application developed by Gregory Casamento. (See his [http://heronsperch.blogspot.com/ blog] for the latest news on GORM.) There are two proto-IDEs, [[ProjectCenter]] and [[ProjectManager]].&lt;br /&gt;
&lt;br /&gt;
There are several introductory tutorials for using these development tools. The first [http://www.gnustep.it/pierre-yves/index.html tutorial] by Pierre-Yves Rivaille is a classic demonstrating the process used to create the ubiquitous currency converter application. A second [http://www.nongnu.org/gstutorial/ tutorial] by Yen-Ju Chen is somewhat more in-depth and extensive.&lt;br /&gt;
&lt;br /&gt;
Nicolas Roard created a [http://gnustep.org/experience/DevelopmentDemonstration.html video] demonstrating the process of developing a simple calculator, and another [http://home.gna.org/pmanager/videos.html video] here by Sašo Kiselkov if you feel the need to create another currency converter.&lt;br /&gt;
&lt;br /&gt;
=== [[Document based applications|Document-based Application Design]] ===&lt;br /&gt;
&lt;br /&gt;
One of the most common use-patterns of applications on modern platforms is that of document-based applications --- applications which can have several active user-controlled contexts. Some familar examples might be a word processor where the user may have multiple document windows concurrently, or a web browser which allows a user to have a number of different browser windows open at the same time. This guide provides information and tips on how to code this style of application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Web Applications ==&lt;br /&gt;
&lt;br /&gt;
Please have a look at [[Creating A Simple GSWeb Application]] to learn how to create a [[GNUstepWeb|GNUstep Web]] application.&lt;br /&gt;
&lt;br /&gt;
== Other Information ==&lt;br /&gt;
&lt;br /&gt;
=== Developer sites ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.roard.com/docs/ GNUstep HelpCenter]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=EdenMath.app&amp;diff=5497</id>
		<title>EdenMath.app</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=EdenMath.app&amp;diff=5497"/>
		<updated>2009-01-28T16:55:03Z</updated>

		<summary type="html">&lt;p&gt;Comrade: spelling of calculator ;-)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
&lt;br /&gt;
{{Application|&lt;br /&gt;
shortdescription = EdenMath is a scientific calculator originally written for Mac OS X. |&lt;br /&gt;
&lt;br /&gt;
currentversion = [http://rburns.paiges.net/software/edenmath/files/EdenMath_GNUstep-1.1.1.tar.gz 1.1.1] |&lt;br /&gt;
&lt;br /&gt;
releasedate = May 11, 2005 |&lt;br /&gt;
&lt;br /&gt;
license = GPL |&lt;br /&gt;
&lt;br /&gt;
overview = EdenMath is a scientific calculator which does standard arithmetic, probability, and trigonometric functions. |&lt;br /&gt;
&lt;br /&gt;
features = |&lt;br /&gt;
&lt;br /&gt;
maintainer =&lt;br /&gt;
* [[User:Rburns | Rob Burns]] -- GNUstep version&lt;br /&gt;
* Chad Armstrong -- OSX Version  |&lt;br /&gt;
&lt;br /&gt;
relatedlinks = &lt;br /&gt;
* [http://rburns.paiges.net/software/edenmath/ GNUstep version]&lt;br /&gt;
* [http://www.edenwaith.com/products/edenmath/ OSX version] |&lt;br /&gt;
&lt;br /&gt;
category = [[Category:Science Applications]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=DBModeler.app&amp;diff=5496</id>
		<title>DBModeler.app</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=DBModeler.app&amp;diff=5496"/>
		<updated>2009-01-28T16:51:37Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Add feature list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
&lt;br /&gt;
{{Application|&lt;br /&gt;
shortdescription = DBModeler.app is based loosely on EOModeller.app and is used to create EOModels -- definitions of mappings between the tables, columns and rows of a relational database to objects within a GNUstep program that uses [[GDL2]] (GNUstep's EOF implementation). |&lt;br /&gt;
currentversion = Unknown |&lt;br /&gt;
releasedate = Unknown |&lt;br /&gt;
license = GPL 2.0 |&lt;br /&gt;
overview = &lt;br /&gt;
[[Image:DBModeler-snapshot.png|frame|Snapshot of DBModeler.app in operation]]&lt;br /&gt;
Existing EOModels may be opened and modified, new ones may be created manually, or even &amp;quot;reverse-engineered&amp;quot; from an existing database if DBModeler is able to connect to an existing database.&lt;br /&gt;
&lt;br /&gt;
The resulting EOModels can be used to allow simple database connectivity in GNUstep applications, tools, or within GNUstep Web applications without significant additional coding effort.|&lt;br /&gt;
features = &lt;br /&gt;
* create entity-relationship models&lt;br /&gt;
* view models in diagram form&lt;br /&gt;
* reverse-engineer models from existing databases&lt;br /&gt;
* drag-and-drop entities and relationships into Gorm for integration into GUI apps&lt;br /&gt;
* generate databases and table schemas in supported databases |&lt;br /&gt;
maintainer = * [mailto:ratmice@yahoo.com Matt Rice] |&lt;br /&gt;
relatedlinks = |&lt;br /&gt;
category =&lt;br /&gt;
[[Category:Database Applications]]&lt;br /&gt;
[[Category:Development Applications]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=GSWeb_application_deployment&amp;diff=5028</id>
		<title>GSWeb application deployment</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=GSWeb_application_deployment&amp;diff=5028"/>
		<updated>2008-01-19T18:37:35Z</updated>

		<summary type="html">&lt;p&gt;Comrade: libplist -&amp;gt; libproplist&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It's recommended to use the new [[Apache2Adaptor]] to serve your dynamic pages using Apache 2.&lt;br /&gt;
&lt;br /&gt;
If using the new Apache2Adaptor, disregard instructions for the older adaptors that use libproplist.&lt;br /&gt;
&lt;br /&gt;
Different platforms use different configuration styles for Apache 2. Ensure you identify how it works on your platform.&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu 7.10 ===&lt;br /&gt;
To use a new Apache module, configuration files must be updated in the &amp;lt;tt&amp;gt;/etc/apache2/mods-enabled&amp;lt;/tt&amp;gt; directory. The relevant files may already be installed in &amp;lt;tt&amp;gt;/etc/apache2/mods-available&amp;lt;/tt&amp;gt; directory, and only require symlinking.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;/etc/apache2/mods-enabled/gsw.load&amp;lt;/tt&amp;gt; is used to force the module to be loaded by Apache 2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoadModule gsw_module /usr/lib/apache2/modules/mod_gsw.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;/etc/apache2/mods-enabled/gsw.conf&amp;lt;/tt&amp;gt; is used to configure the adaptor with information about the web applications for which it will provide access:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule gsw_module&amp;gt;&lt;br /&gt;
   ShowApps on&lt;br /&gt;
   App Name=SimpleDemo Instance=1 Host=127.0.0.1:9001&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:GNUstepWeb]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Creating_A_Simple_GSWeb_Application&amp;diff=5027</id>
		<title>Creating A Simple GSWeb Application</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Creating_A_Simple_GSWeb_Application&amp;diff=5027"/>
		<updated>2008-01-19T18:34:37Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Updated the component section to give an outline of files needed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
[[GNUstepWeb]] is a framework for creating web-based applications using Objective-C. This guide aims to provide an overview of what is required in the creation and design of a very simple web application.&lt;br /&gt;
&lt;br /&gt;
It is assumed you are familiar with GNUstep, and have a working GNUstep installation, including the [[GDL2]] and [[GSWeb]] frameworks. Pre-requisites for [[GSWeb application deployment]] should also be in place.&lt;br /&gt;
&lt;br /&gt;
== File Components ==&lt;br /&gt;
&lt;br /&gt;
In building your web application you will need to create a number of files. From scratch, the following should be a rough guide to getting it working. These include the Makefile, some mandatory &amp;quot;plumbing&amp;quot; code in Objective-C, [[GSWComponent]]s to provide the pages and subpage elements of the web application, and run-time resources.&lt;br /&gt;
&lt;br /&gt;
=== The Makefile ===&lt;br /&gt;
&lt;br /&gt;
For a web application, a special makefile is needed: luckily it's very similar to makefiles you may have used for other kinds of project. There is currently no out-of-the-box way to have these files built for you, so you'll have to do it manually.&lt;br /&gt;
&lt;br /&gt;
'''GNUmakefile'''&lt;br /&gt;
&lt;br /&gt;
Initial makefile includes needed to set up the make environment should be:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/common.make&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/Auxiliary/gsweb_wo.make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the second include forces GNUstepWeb to use Apple's WebObjects naming conventions. Dropping the &amp;lt;b&amp;gt;_wo&amp;lt;/b&amp;gt; in the included filename will enable GSW naming conventions. It is useful to decide which convention you plan to use in the application early on because changing later will involve changing the naming convention of class names in many files in your project.&lt;br /&gt;
&lt;br /&gt;
The key variables used in a web application's makefile are:&lt;br /&gt;
;GSWAPP_NAME:used to define the project's name in the makefile, replace the &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; with the name in the variables listed below&lt;br /&gt;
;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;_HAS_GSW_COMPONENTS:used to indicate that [[GSWComponent]]s are present in the project. Normally, this is set to &amp;lt;TT&amp;gt;YES&amp;lt;/TT&amp;gt;&lt;br /&gt;
;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;_PRINCIPAL_CLASS:used to identify the main class of the web application&lt;br /&gt;
;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;_RESOURCE_FILES:used to indicate the list of files that are needed in the runtime bundle&lt;br /&gt;
;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;_OBJC_FILES:contains the list of Objective-C files needed to compile the web application&lt;br /&gt;
;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;_COMPONENTS:lists the names of the components that will be used to create pages and other elements in the web application&lt;br /&gt;
&lt;br /&gt;
The final makefile includes needed to set up the make environment should be:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-include GNUmakefile.preamble&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/gswapp.make&lt;br /&gt;
-include GNUmakefile.postamble&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The preamble and postamble files are optional includes and will not error if they don't exist. It's good practice to have these in place to allow compile-time modifications during the development process and also for others if you distribute the code.&lt;br /&gt;
&lt;br /&gt;
A worked-out example of a simple GNUmakefile for a GSWeb application is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/common.make&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/Auxiliary/gsweb_wo.make&lt;br /&gt;
&lt;br /&gt;
GSWAPP_NAME = SimpleDemo&lt;br /&gt;
SimpleDemo_HAS_GSW_COMPONENTS = YES&lt;br /&gt;
SimpleDemo_PRINCIPAL_CLASS = SimpleDemo&lt;br /&gt;
#SimpleDemo_RESOURCE_FILES = Resources/SimpleDemo.eomodeld&lt;br /&gt;
SimpleDemo_OBJC_FILES = \&lt;br /&gt;
    SimpleDemo.m \&lt;br /&gt;
    Session.m \&lt;br /&gt;
    SimpleDemo_main.m \&lt;br /&gt;
    Main.m \&lt;br /&gt;
    Details.m&lt;br /&gt;
&lt;br /&gt;
SimpleDemo_COMPONENTS = \&lt;br /&gt;
    Main.wo Details.wo&lt;br /&gt;
&lt;br /&gt;
-include GNUmakefile.preamble&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/gswapp.make&lt;br /&gt;
-include GNUmakefile.postamble&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name of the project is &amp;lt;b&amp;gt;SimpleDemo&amp;lt;/b&amp;gt;, and it contains GSWComponents (the basic building blocks of GSWeb), its principal class is SimpleDemo, there are no resource files for the runtime (there is an entry, but it's hashed-out), there are five Objective-C source files, and two components. You can see that the syntax allows you to break lines using the backslash '''\''' character as the last on the line to assist readability, especially for long lists of values, like the OBJC_FILES.&lt;br /&gt;
&lt;br /&gt;
For more information as to customising this file, as well as setting up compiler options for third party libraries and includes, see the GNUstep makefile manual.&lt;br /&gt;
&lt;br /&gt;
=== Mandatory code ===&lt;br /&gt;
&lt;br /&gt;
GNUstepWeb expects a small amount of glue code and several classes to be present at runtime. Initial implementation of a web application may leave these in boiler-plate form, but most real-world projects end up adding significant extra functionality through the extension mechanisms they offer.&lt;br /&gt;
&lt;br /&gt;
The mandatory code is as follows:&lt;br /&gt;
;&amp;lt;b&amp;gt;main&amp;lt;/b&amp;gt; function:the runtime jumps to the beginning of the main function, which is used for initialisation of the the web application and can be used for initialisation of other resources such as C libraries etc&lt;br /&gt;
;&amp;lt;b&amp;gt;Session&amp;lt;/b&amp;gt; class definition:used for per-session initialisation in the web application, in addition to holding instance variables and methods for each session. This class should be literally named Session.&lt;br /&gt;
;&amp;lt;b&amp;gt;GSWApplication&amp;lt;/b&amp;gt; or WOApplication-derived class definition:used for web application instance-wide initialisation, and it may hold instance variables and methods across the entire instance.&lt;br /&gt;
&lt;br /&gt;
Some worked out examples for the SimpleDemo web application follow. First &amp;lt;b&amp;gt;SimpleDemo_main.m&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// SimpleDemo_main.m&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;WebObjects/WebObjects.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, const char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rc;&lt;br /&gt;
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];&lt;br /&gt;
    rc = WOApplicationMain(@&amp;quot;SimpleDemo&amp;quot;, argc, argv);&lt;br /&gt;
    [pool release];&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This creates an autorelease pool and begins the web application by invoking the application object.&lt;br /&gt;
&lt;br /&gt;
Next &amp;lt;b&amp;gt;Session.h&amp;lt;/b&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Session.h from SimpleDemo&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;WebObjects/WebObjects.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface Session: WOSession&lt;br /&gt;
&lt;br /&gt;
// fill me with session instance variables&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And &amp;lt;b&amp;gt;Session.m&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Session.m from SimpleDemo&lt;br /&gt;
#import &amp;quot;Session.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation Session&lt;br /&gt;
&lt;br /&gt;
- (id) init&lt;br /&gt;
{&lt;br /&gt;
    [super init];&lt;br /&gt;
    [self setStoresIDsInCookies: YES];&lt;br /&gt;
    [self setStoresIDsInURLs: NO];&lt;br /&gt;
    return self;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Session.m code above implements a small change in the normal behaviour of GNUstepWeb, forcing it to store session identifiers in cookies and not in the URL. There are good reasons not to do this in practice for some real web applications, but it does show the Session object may be used to change behaviour on a per-session basis.&lt;br /&gt;
&lt;br /&gt;
Now for the application object, in two parts, &amp;lt;b&amp;gt;SimpleDemo.h&amp;lt;/b&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// SimpleDemo.h&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;WebObjects/WebObjects.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SimpleDemo: WOApplication&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And &amp;lt;b&amp;gt;SimpleDemo.m&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// SimpleDemo.m&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;SimpleDemo.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SimpleDemo&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The application can run quite successfully with very little other than this boilerplate code. Of course, real functionality requirements may mean creating or overriding methods in these classes (especially the -init methods), creation of new instance variables and so on.&lt;br /&gt;
&lt;br /&gt;
=== Components ===&lt;br /&gt;
&lt;br /&gt;
GSWeb uses a directory for every component. A component can represent a whole web page or just a part of it. It is easy to re-use pieces needed multiple times.&lt;br /&gt;
&lt;br /&gt;
A component contains three files containing the HTML, the connections or bindings of your objects and additional information like the text-encoding used in the component. Those files are suffixed .html, .wod and .woo.&lt;br /&gt;
&lt;br /&gt;
Additionally, a component is normally implemented with a corresponding subclass of [[GSWComponent|GSWComponent or WOComponent]].&lt;br /&gt;
&lt;br /&gt;
In the SimpleDemo web application there are only two components defined. In a real application it's usual to have custom components providing style sheet information, headers, footers, navigation bars and so on that are reused in the components that correspond to pages.&lt;br /&gt;
&lt;br /&gt;
==== Main.wo ====&lt;br /&gt;
&lt;br /&gt;
The Main component normally provides the first page when a connection is made to the web application. The name is not arbitrary, and normally every GNUstepWeb application contains a Main component. Our implementation will consist of five files:&lt;br /&gt;
# &amp;lt;tt&amp;gt;Main.h&amp;lt;/tt&amp;gt; the Objective-C class header for the Main component&lt;br /&gt;
# &amp;lt;tt&amp;gt;Main.m&amp;lt;/tt&amp;gt; the Objective-C class implementation for the Main component&lt;br /&gt;
# &amp;lt;tt&amp;gt;Main.wo/Main.html&amp;lt;/tt&amp;gt; containing the HTML markup&lt;br /&gt;
# &amp;lt;tt&amp;gt;Main.wo/Main.wod&amp;lt;/tt&amp;gt; containing the bindings of the dynamic elements that exist in the HTML to the application's objects, and &lt;br /&gt;
# &amp;lt;tt&amp;gt;Main.wo/Main.woo&amp;lt;/tt&amp;gt; which contains the text-encoding information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Details.wo ====&lt;br /&gt;
&lt;br /&gt;
The Details component is used to see how multiple page interactions and show additional component capabilities. The name is arbitrary.&lt;br /&gt;
&lt;br /&gt;
Our custom component implementation will consist of five files:&lt;br /&gt;
# &amp;lt;tt&amp;gt;Details.h&amp;lt;/tt&amp;gt; the Objective-C class header for this component&lt;br /&gt;
# &amp;lt;tt&amp;gt;Details.m&amp;lt;/tt&amp;gt; the Objective-C class implementation for this component&lt;br /&gt;
# &amp;lt;tt&amp;gt;Details.wo/Details.html&amp;lt;/tt&amp;gt; containing the HTML markup&lt;br /&gt;
# &amp;lt;tt&amp;gt;Details.wo/Details.wod&amp;lt;/tt&amp;gt; containing the bindings of the dynamic elements that exist in the HTML to the application's objects, and &lt;br /&gt;
# &amp;lt;tt&amp;gt;Details.wo/Details.woo&amp;lt;/tt&amp;gt; which contains the text-encoding information.&lt;br /&gt;
&lt;br /&gt;
==== Want to know more? ====&lt;br /&gt;
&lt;br /&gt;
The .woo files can seem a little mysterious in that they are only being used here to identify the text-encoding information of the component. In actual fact, they can be used for a number of other, quite powerful purposes including serialised information related to direct database transactions initiated from the .html and .wod files - in other words to avoid writing code!&lt;br /&gt;
&lt;br /&gt;
A more in-depth description of [[GSWComponent|Components]] is available.&lt;br /&gt;
&lt;br /&gt;
===The application dictionary===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interface files ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:GNUstepWeb]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=GSWeb_application_deployment&amp;diff=5026</id>
		<title>GSWeb application deployment</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=GSWeb_application_deployment&amp;diff=5026"/>
		<updated>2008-01-19T18:09:20Z</updated>

		<summary type="html">&lt;p&gt;Comrade: typewriter font&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It's recommended to use the new [[Apache2Adaptor]] to serve your dynamic pages using Apache 2.&lt;br /&gt;
&lt;br /&gt;
If using the new Apache2Adaptor, disregard instructions for the older adaptors that use libplist.&lt;br /&gt;
&lt;br /&gt;
Different platforms use different configuration styles for Apache 2. Ensure you identify how it works on your platform.&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu 7.10 ===&lt;br /&gt;
To use a new Apache module, configuration files must be updated in the &amp;lt;tt&amp;gt;/etc/apache2/mods-enabled&amp;lt;/tt&amp;gt; directory. The relevant files may already be installed in &amp;lt;tt&amp;gt;/etc/apache2/mods-available&amp;lt;/tt&amp;gt; directory, and only require symlinking.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;/etc/apache2/mods-enabled/gsw.load&amp;lt;/tt&amp;gt; is used to force the module to be loaded by Apache 2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoadModule gsw_module /usr/lib/apache2/modules/mod_gsw.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;/etc/apache2/mods-enabled/gsw.conf&amp;lt;/tt&amp;gt; is used to configure the adaptor with information about the web applications for which it will provide access:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule gsw_module&amp;gt;&lt;br /&gt;
   ShowApps on&lt;br /&gt;
   App Name=SimpleDemo Instance=1 Host=127.0.0.1:9001&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:GNUstepWeb]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=GSWeb_application_deployment&amp;diff=5025</id>
		<title>GSWeb application deployment</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=GSWeb_application_deployment&amp;diff=5025"/>
		<updated>2008-01-19T18:06:08Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Ubuntu 7.10 quick start configuration info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It's recommended to use the new [[Apache2Adaptor]] to serve your dynamic pages using Apache 2.&lt;br /&gt;
&lt;br /&gt;
If using the new Apache2Adaptor, disregard instructions for the older adaptors that use libplist.&lt;br /&gt;
&lt;br /&gt;
Different platforms use different configuration styles for Apache 2. Ensure you identify how it works on your platform.&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu 7.10 ===&lt;br /&gt;
To use a new Apache module, configuration files must be updated in the /etc/apache2/mods-enabled directory. The relevant files may already be installed in /etc/apache2/mods-available directory, and only require symlinking.&lt;br /&gt;
&lt;br /&gt;
/etc/apache2/mods-enabled/gsw.load is used to force the module to be loaded by Apache 2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoadModule gsw_module /usr/lib/apache2/modules/mod_gsw.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/apache2/mods-enabled/gsw.conf is used to configure the adaptor with information about the web applications for which it will provide access:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule gsw_module&amp;gt;&lt;br /&gt;
   ShowApps on&lt;br /&gt;
   App Name=SimpleDemo Instance=1 Host=127.0.0.1:9001&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:GNUstepWeb]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Creating_A_Simple_GSWeb_Application&amp;diff=5023</id>
		<title>Creating A Simple GSWeb Application</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Creating_A_Simple_GSWeb_Application&amp;diff=5023"/>
		<updated>2008-01-19T17:50:40Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Created mandatory files section and placed demo code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
[[GNUstepWeb]] is a framework for creating web-based applications using Objective-C. This guide aims to provide an overview of what is required in the creation and design of a very simple web application.&lt;br /&gt;
&lt;br /&gt;
It is assumed you are familiar with GNUstep, and have a working GNUstep installation, including the [[GDL2]] and [[GSWeb]] frameworks. Pre-requisites for [[GSWeb application deployment]] should also be in place.&lt;br /&gt;
&lt;br /&gt;
== File Components ==&lt;br /&gt;
&lt;br /&gt;
In building your web application you will need to create a number of files. From scratch, the following should be a rough guide to getting it working. These include the Makefile, some mandatory &amp;quot;plumbing&amp;quot; code in Objective-C, [[GSWComponent]]s to provide the pages and subpage elements of the web application, and run-time resources.&lt;br /&gt;
&lt;br /&gt;
=== The Makefile ===&lt;br /&gt;
&lt;br /&gt;
For a web application, a special makefile is needed: luckily it's very similar to makefiles you may have used for other kinds of project. There is currently no out-of-the-box way to have these files built for you, so you'll have to do it manually.&lt;br /&gt;
&lt;br /&gt;
'''GNUmakefile'''&lt;br /&gt;
&lt;br /&gt;
Initial makefile includes needed to set up the make environment should be:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/common.make&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/Auxiliary/gsweb_wo.make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the second include forces GNUstepWeb to use Apple's WebObjects naming conventions. Dropping the &amp;lt;b&amp;gt;_wo&amp;lt;/b&amp;gt; in the included filename will enable GSW naming conventions. It is useful to decide which convention you plan to use in the application early on because changing later will involve changing the naming convention of class names in many files in your project.&lt;br /&gt;
&lt;br /&gt;
The key variables used in a web application's makefile are:&lt;br /&gt;
;GSWAPP_NAME:used to define the project's name in the makefile, replace the &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; with the name in the variables listed below&lt;br /&gt;
;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;_HAS_GSW_COMPONENTS:used to indicate that [[GSWComponent]]s are present in the project. Normally, this is set to &amp;lt;TT&amp;gt;YES&amp;lt;/TT&amp;gt;&lt;br /&gt;
;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;_PRINCIPAL_CLASS:used to identify the main class of the web application&lt;br /&gt;
;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;_RESOURCE_FILES:used to indicate the list of files that are needed in the runtime bundle&lt;br /&gt;
;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;_OBJC_FILES:contains the list of Objective-C files needed to compile the web application&lt;br /&gt;
;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;_COMPONENTS:lists the names of the components that will be used to create pages and other elements in the web application&lt;br /&gt;
&lt;br /&gt;
The final makefile includes needed to set up the make environment should be:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-include GNUmakefile.preamble&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/gswapp.make&lt;br /&gt;
-include GNUmakefile.postamble&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The preamble and postamble files are optional includes and will not error if they don't exist. It's good practice to have these in place to allow compile-time modifications during the development process and also for others if you distribute the code.&lt;br /&gt;
&lt;br /&gt;
A worked-out example of a simple GNUmakefile for a GSWeb application is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/common.make&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/Auxiliary/gsweb_wo.make&lt;br /&gt;
&lt;br /&gt;
GSWAPP_NAME = SimpleDemo&lt;br /&gt;
SimpleDemo_HAS_GSW_COMPONENTS = YES&lt;br /&gt;
SimpleDemo_PRINCIPAL_CLASS = SimpleDemo&lt;br /&gt;
#SimpleDemo_RESOURCE_FILES = Resources/SimpleDemo.eomodeld&lt;br /&gt;
SimpleDemo_OBJC_FILES = \&lt;br /&gt;
    SimpleDemo.m \&lt;br /&gt;
    Session.m \&lt;br /&gt;
    SimpleDemo_main.m \&lt;br /&gt;
    Main.m \&lt;br /&gt;
    Details.m&lt;br /&gt;
&lt;br /&gt;
SimpleDemo_COMPONENTS = \&lt;br /&gt;
    Main.wo Details.wo&lt;br /&gt;
&lt;br /&gt;
-include GNUmakefile.preamble&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/gswapp.make&lt;br /&gt;
-include GNUmakefile.postamble&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name of the project is &amp;lt;b&amp;gt;SimpleDemo&amp;lt;/b&amp;gt;, and it contains GSWComponents (the basic building blocks of GSWeb), its principal class is SimpleDemo, there are no resource files for the runtime (there is an entry, but it's hashed-out), there are five Objective-C source files, and two components. You can see that the syntax allows you to break lines using the backslash '''\''' character as the last on the line to assist readability, especially for long lists of values, like the OBJC_FILES.&lt;br /&gt;
&lt;br /&gt;
For more information as to customising this file, as well as setting up compiler options for third party libraries and includes, see the GNUstep makefile manual.&lt;br /&gt;
&lt;br /&gt;
=== Mandatory code ===&lt;br /&gt;
&lt;br /&gt;
GNUstepWeb expects a small amount of glue code and several classes to be present at runtime. Initial implementation of a web application may leave these in boiler-plate form, but most real-world projects end up adding significant extra functionality through the extension mechanisms they offer.&lt;br /&gt;
&lt;br /&gt;
The mandatory code is as follows:&lt;br /&gt;
;&amp;lt;b&amp;gt;main&amp;lt;/b&amp;gt; function:the runtime jumps to the beginning of the main function, which is used for initialisation of the the web application and can be used for initialisation of other resources such as C libraries etc&lt;br /&gt;
;&amp;lt;b&amp;gt;Session&amp;lt;/b&amp;gt; class definition:used for per-session initialisation in the web application, in addition to holding instance variables and methods for each session. This class should be literally named Session.&lt;br /&gt;
;&amp;lt;b&amp;gt;GSWApplication&amp;lt;/b&amp;gt; or WOApplication-derived class definition:used for web application instance-wide initialisation, and it may hold instance variables and methods across the entire instance.&lt;br /&gt;
&lt;br /&gt;
Some worked out examples for the SimpleDemo web application follow. First &amp;lt;b&amp;gt;SimpleDemo_main.m&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// SimpleDemo_main.m&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;WebObjects/WebObjects.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, const char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rc;&lt;br /&gt;
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];&lt;br /&gt;
    rc = WOApplicationMain(@&amp;quot;SimpleDemo&amp;quot;, argc, argv);&lt;br /&gt;
    [pool release];&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This creates an autorelease pool and begins the web application by invoking the application object.&lt;br /&gt;
&lt;br /&gt;
Next &amp;lt;b&amp;gt;Session.h&amp;lt;/b&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Session.h from SimpleDemo&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;WebObjects/WebObjects.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface Session: WOSession&lt;br /&gt;
&lt;br /&gt;
// fill me with session instance variables&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And &amp;lt;b&amp;gt;Session.m&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Session.m from SimpleDemo&lt;br /&gt;
#import &amp;quot;Session.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation Session&lt;br /&gt;
&lt;br /&gt;
- (id) init&lt;br /&gt;
{&lt;br /&gt;
    [super init];&lt;br /&gt;
    [self setStoresIDsInCookies: YES];&lt;br /&gt;
    [self setStoresIDsInURLs: NO];&lt;br /&gt;
    return self;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Session.m code above implements a small change in the normal behaviour of GNUstepWeb, forcing it to store session identifiers in cookies and not in the URL. There are good reasons not to do this in practice for some real web applications, but it does show the Session object may be used to change behaviour on a per-session basis.&lt;br /&gt;
&lt;br /&gt;
Now for the application object, in two parts, &amp;lt;b&amp;gt;SimpleDemo.h&amp;lt;/b&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// SimpleDemo.h&lt;br /&gt;
&lt;br /&gt;
#import &amp;lt;WebObjects/WebObjects.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@interface SimpleDemo: WOApplication&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And &amp;lt;b&amp;gt;SimpleDemo.m&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// SimpleDemo.m&lt;br /&gt;
&lt;br /&gt;
#import &amp;quot;SimpleDemo.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@implementation SimpleDemo&lt;br /&gt;
&lt;br /&gt;
@end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The application can run quite successfully with very little other than this boilerplate code. Of course, real functionality requirements may mean creating or overriding methods in these classes (especially the -init methods), creation of new instance variables and so on.&lt;br /&gt;
&lt;br /&gt;
=== Components ===&lt;br /&gt;
&lt;br /&gt;
GSWeb uses a directory for every component. A component can represent a whole web page or just a part of it. It is easy to re-use pieces needed multiple times.&lt;br /&gt;
A component contains three files they contain the HTML, the connections or bindings of your objects and additional information like the used encoding. Those files are suffixed .html, .wod and .woo.&lt;br /&gt;
A more in-depth description of [[GSWComponent|Components]] is available.&lt;br /&gt;
&lt;br /&gt;
===The application dictionary===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interface files ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:GNUstepWeb]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Creating_A_Simple_GSWeb_Application&amp;diff=5022</id>
		<title>Creating A Simple GSWeb Application</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Creating_A_Simple_GSWeb_Application&amp;diff=5022"/>
		<updated>2008-01-19T17:09:20Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Updated makefile section with common variables and includes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
[[GNUstepWeb]] is a framework for creating web-based applications using Objective-C. This guide aims to provide an overview of what is required in the creation and design of a very simple web application.&lt;br /&gt;
&lt;br /&gt;
It is assumed you are familiar with GNUstep, and have a working GNUstep installation, including the [[GDL2]] and [[GSWeb]] frameworks. Pre-requisites for [[GSWeb application deployment]] should also be in place.&lt;br /&gt;
&lt;br /&gt;
== File Components ==&lt;br /&gt;
&lt;br /&gt;
In building your web application you will need to create a number of files. From scratch, the following should be a rough guide to getting it working. These include the Makefile, ...&lt;br /&gt;
&lt;br /&gt;
=== The Makefile ===&lt;br /&gt;
&lt;br /&gt;
For a web application, a special makefile is needed: luckily it's very similar to makefiles you may have used for other kinds of project. There is currently no out-of-the-box way to have these files built for you, so you'll have to do it manually.&lt;br /&gt;
&lt;br /&gt;
'''GNUmakefile'''&lt;br /&gt;
&lt;br /&gt;
Initial makefile includes needed to set up the make environment should be:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/common.make&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/Auxiliary/gsweb_wo.make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the second include forces GNUstepWeb to use Apple's WebObjects naming conventions. Dropping the &amp;lt;b&amp;gt;_wo&amp;lt;/b&amp;gt; in the included filename will enable GSW naming conventions. It is useful to decide which convention you plan to use in the application early on because changing later will involve changing the naming convention of class names in many files in your project.&lt;br /&gt;
&lt;br /&gt;
The key variables used in a web application's makefile are:&lt;br /&gt;
;GSWAPP_NAME:used to define the project's name in the makefile, replace the &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; with the name in the variables listed below&lt;br /&gt;
;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;_HAS_GSW_COMPONENTS:used to indicate that [[GSWComponent]]s are present in the project. Normally, this is set to &amp;lt;TT&amp;gt;YES&amp;lt;/TT&amp;gt;&lt;br /&gt;
;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;_PRINCIPAL_CLASS:used to identify the main class of the web application&lt;br /&gt;
;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;_RESOURCE_FILES:used to indicate the list of files that are needed in the runtime bundle&lt;br /&gt;
;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;_OBJC_FILES:contains the list of Objective-C files needed to compile the web application&lt;br /&gt;
;&amp;lt;i&amp;gt;{PROJECTNAME}&amp;lt;/i&amp;gt;_COMPONENTS:lists the names of the components that will be used to create pages and other elements in the web application&lt;br /&gt;
&lt;br /&gt;
The final makefile includes needed to set up the make environment should be:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-include GNUmakefile.preamble&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/gswapp.make&lt;br /&gt;
-include GNUmakefile.postamble&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The preamble and postamble files are optional includes and will not error if they don't exist. It's good practice to have these in place to allow compile-time modifications during the development process and also for others if you distribute the code.&lt;br /&gt;
&lt;br /&gt;
A worked-out example of a simple GNUmakefile for a GSWeb application is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/common.make&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/Auxiliary/gsweb_wo.make&lt;br /&gt;
&lt;br /&gt;
GSWAPP_NAME = SimpleDemo&lt;br /&gt;
SimpleDemo_HAS_GSW_COMPONENTS = YES&lt;br /&gt;
SimpleDemo_PRINCIPAL_CLASS = SimpleDemo&lt;br /&gt;
#SimpleDemo_RESOURCE_FILES = Resources/SimpleDemo.eomodeld&lt;br /&gt;
SimpleDemo_OBJC_FILES = \&lt;br /&gt;
    SimpleDemo.m \&lt;br /&gt;
    Session.m \&lt;br /&gt;
    SimpleDemo_main.m \&lt;br /&gt;
    Main.m \&lt;br /&gt;
    Details.m&lt;br /&gt;
&lt;br /&gt;
SimpleDemo_COMPONENTS = \&lt;br /&gt;
    Main.wo Details.wo&lt;br /&gt;
&lt;br /&gt;
-include GNUmakefile.preamble&lt;br /&gt;
include $(GNUSTEP_MAKEFILES)/gswapp.make&lt;br /&gt;
-include GNUmakefile.postamble&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name of the project is &amp;lt;b&amp;gt;SimpleDemo&amp;lt;/b&amp;gt;, and it contains GSWComponents (the basic building blocks of GSWeb), its principal class is SimpleDemo, there are no resource files for the runtime (there is an entry, but it's hashed-out), there are five Objective-C source files, and two components. You can see that the syntax allows you to break lines using the backslash '''\''' character as the last on the line to assist readability, especially for long lists of values, like the OBJC_FILES.&lt;br /&gt;
&lt;br /&gt;
For more information as to customising this file, as well as setting up compiler options for third party libraries and includes, see the GNUstep makefile manual.&lt;br /&gt;
&lt;br /&gt;
=== Components ===&lt;br /&gt;
&lt;br /&gt;
GSWeb uses a directory for every component. A component can represent a whole web page or just a part of it. It is easy to re-use pieces needed multiple times.&lt;br /&gt;
A component contains three files they contain the HTML, the connections or bindings of your objects and additional information like the used encoding. Those files are suffixed .html, .wod and .woo.&lt;br /&gt;
A more in-depth description of [[GSWComponent|Components]] is available.&lt;br /&gt;
&lt;br /&gt;
===The application dictionary===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interface files ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:GNUstepWeb]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Pixen.app&amp;diff=4399</id>
		<title>Pixen.app</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Pixen.app&amp;diff=4399"/>
		<updated>2007-02-14T11:59:40Z</updated>

		<summary type="html">&lt;p&gt;Comrade: corrected pixen link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
{{Application|&lt;br /&gt;
shortdescription = Graphics editing software for small-scale pictures for GNUstep. |&lt;br /&gt;
currentversion = [http://download.gna.org/gsimageapps/Pixen-0.1.tar.bz2 0.1] |&lt;br /&gt;
releasedate = Dec 15, 2004 |&lt;br /&gt;
license = MIT |&lt;br /&gt;
overview = &amp;lt; ... &amp;gt; |&lt;br /&gt;
features = &amp;lt; ... &amp;gt; |&lt;br /&gt;
maintainer = Andy Matushak, Fabien Vallon |&lt;br /&gt;
relatedlinks =&lt;br /&gt;
* http://home.gna.org/gsimageapps/&lt;br /&gt;
* http://opensword.org/pixen/ |&lt;br /&gt;
category = [[Category:Graphics Applications]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=GSWeb&amp;diff=4136</id>
		<title>GSWeb</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=GSWeb&amp;diff=4136"/>
		<updated>2006-12-22T00:53:31Z</updated>

		<summary type="html">&lt;p&gt;Comrade: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[GNUstepWeb]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Creating_A_Simple_GSWeb_Application&amp;diff=4134</id>
		<title>Creating A Simple GSWeb Application</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Creating_A_Simple_GSWeb_Application&amp;diff=4134"/>
		<updated>2006-12-20T22:56:31Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Initial version; GNUmakefile etc more to come&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
[[GNUstepWeb]] is a framework for creating web-based applications using Objective-C. This guide aims to provide an overview of what is required in the creation and design of a very simple web application.&lt;br /&gt;
&lt;br /&gt;
It is assumed you are familiar with GNUstep, and have a working GNUstep installation, including the [[GDL2]] and [[GSWeb]] frameworks. Pre-requisites for [[GSWeb application deployment]] should also be in place.&lt;br /&gt;
&lt;br /&gt;
== File Components ==&lt;br /&gt;
&lt;br /&gt;
In building your web application you will need to create a number of files. From scratch, the following should be a rough guide to getting it working. These include the Makefile, ...&lt;br /&gt;
&lt;br /&gt;
=== The Makefile ===&lt;br /&gt;
&lt;br /&gt;
For a web application, a special makefile is needed: luckily it's very similar to makefiles you may have used for other kinds of project. There is currently no out-of-the-box way to have these files built for you, so you'll have to do it manually.&lt;br /&gt;
&lt;br /&gt;
'''GNUmakefile'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more information as to customising this file, as well as setting up compiler options for third party libraries and includes, see the GNUstep makefile manual.&lt;br /&gt;
&lt;br /&gt;
===The application dictionary===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interface files ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:GNUstepWeb]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=GNUstepWeb&amp;diff=4133</id>
		<title>GNUstepWeb</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=GNUstepWeb&amp;diff=4133"/>
		<updated>2006-12-20T21:21:36Z</updated>

		<summary type="html">&lt;p&gt;Comrade: A little structure and a link to a new tutorial&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;GNUstepWeb is a development framework for web applications written in Objective-C which is designed to be source-code compatible with [[WebObjects]] 4.5 - a product originally developed by NeXT Inc, whose newer versions have been released by Apple and are Java-based.&lt;br /&gt;
&lt;br /&gt;
=== Availability ===&lt;br /&gt;
This library is a component of the [[GNUstep]] project in the dev-libs section and is available in the standard ways - such as the [ftp://ftp.gnustep.org/pub/daily-snapshots/dev-libs.current.tar.bz2 GNUstep ftp site].&lt;br /&gt;
&lt;br /&gt;
David Wetzel recommends using his recent branch that can be obtained by executing the following [[SVN]] check out in an empty directory&lt;br /&gt;
 svn co http://svn.gna.org/svn/gnustep/libs/gsweb/branches/06-02-dwetzel&lt;br /&gt;
&lt;br /&gt;
=== Documentation and Resources ===&lt;br /&gt;
Apple has [http://developer.apple.com/documentation/LegacyTechnologies/WebObjects/WebObjects_4.5/webobjects.html legacy WebObjects 4.5 documentation] available. Please note that the official site is [http://www.gnustepweb.org/ gnustepweb.org] is somewhat out of date.  &lt;br /&gt;
&lt;br /&gt;
David Wetzel runs a low-volume mailing list called [http://lists.turbocat.net/mailman/listinfo.cgi/gswhackers gswhackers].&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
[[Creating A Simple GSWeb Application]] is very easy.&lt;br /&gt;
&lt;br /&gt;
[[Category:GNUstepWeb]]&lt;br /&gt;
[[Category:Networking_Frameworks]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=GNUstepWeb&amp;diff=4132</id>
		<title>GNUstepWeb</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=GNUstepWeb&amp;diff=4132"/>
		<updated>2006-12-20T20:51:09Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Update GSWeb links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;GNUstepWeb is a development framework for web applications which is designed to be source-code compatible with [[WebObjects]] 4.5 - a product originally developed by NeXT Inc. Newer versions of Apple's WebObjects are Java-based.&lt;br /&gt;
&lt;br /&gt;
This library is a component of the [[GNUstep]] project in the dev-libs section and is available in the standard ways - such as [[SVN]] and ftp://ftp.gnustep.org/pub/daily-snapshots/dev-libs.current.tar.bz2&lt;br /&gt;
&lt;br /&gt;
The official site is http://www.gnustepweb.org/ but is somewhat out of date.&lt;br /&gt;
&lt;br /&gt;
[[Category:Networking_Frameworks]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Frameworks&amp;diff=3553</id>
		<title>Frameworks</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Frameworks&amp;diff=3553"/>
		<updated>2006-09-16T21:22:41Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Added Narrative plotting framework&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A framework, sometimes also called a &amp;quot;kit&amp;quot;, is a way to package a logically related set of [[class|classes]], [[protocol|protocols]] and functions together with localized strings, online documentation, and other pertinent files. GNUstep provides the [[Foundation]] and [[AppKit|Application Kit]] frameworks.&lt;br /&gt;
&lt;br /&gt;
Add your extension, framework, library or bundle below to one of the categories. If a category doesn't yet exist, choose a new name as a short description (eg. &amp;quot;Math&amp;quot; or &amp;quot;Science&amp;quot; or &amp;quot;Games&amp;quot;). Simply calling it &amp;quot;Library&amp;quot; is ''not'' a good description ;-) Also, please try to stay ''alphabetically'' ...&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* [[Scripting of frameworks|How to make frameworks scriptable]]&lt;br /&gt;
* [[PrefixIndex|Index of prefixes used by different GNUstep-related libraries and frameworks]]&lt;br /&gt;
&lt;br /&gt;
== Core frameworks ==&lt;br /&gt;
&lt;br /&gt;
* [[Base]] - Foundation kit&lt;br /&gt;
* [[GUI]] - Application kit&lt;br /&gt;
&lt;br /&gt;
== Extension frameworks (official parts of GNUstep project) ==&lt;br /&gt;
&lt;br /&gt;
=== Audio ===&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
&lt;br /&gt;
* [[GDL2]] - Database frameworks (Enterprise Objects/EO)&lt;br /&gt;
&lt;br /&gt;
=== Development ===&lt;br /&gt;
&lt;br /&gt;
=== Graphics ===&lt;br /&gt;
&lt;br /&gt;
=== Networking ===&lt;br /&gt;
&lt;br /&gt;
* [[GNUstepWeb]] - WebObjects 4.x compatible framework that provides an MVC approach to building web applications and which integrates tightly with [[GDL2]] to provide easy access to database objects.&lt;br /&gt;
&lt;br /&gt;
=== PIM ===&lt;br /&gt;
&lt;br /&gt;
=== Scripting and Binding ===&lt;br /&gt;
&lt;br /&gt;
* [ftp://ftp.gnustep.org/pub/gnustep/libs/ GNUstep Guile] - Extension to make use of the GUILE scripting language.&lt;br /&gt;
* [http://www.gnustep.it/jigs/ JIGS] - GNUstep Java interface&lt;br /&gt;
* [http://www.gnustep.org/experience/RIGS.html RIGS] - GNUstep Ruby bridge&lt;br /&gt;
* [[StepTalk]] - Scripting framework&lt;br /&gt;
&lt;br /&gt;
=== Security ===&lt;br /&gt;
&lt;br /&gt;
=== Text Processing ===&lt;br /&gt;
&lt;br /&gt;
== Other frameworks (not official parts of GNUstep project) ==&lt;br /&gt;
&lt;br /&gt;
=== Audio ===&lt;br /&gt;
&lt;br /&gt;
* [http://musickit.sourceforge.net/ MusicKit] - The MusicKit is an object-oriented software system for building music, sound, signal processing, and MIDI applications. It has been used in such diverse commercial applications as music sequencers, computer games, and document processors. Professors and students in academia have used the MusicKit in a host of areas, including music performance, scientific experiments, computer-aided instruction, and physical modeling.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
&lt;br /&gt;
=== Development ===&lt;br /&gt;
&lt;br /&gt;
* [[DevelopmentKit]] - computer aided development&lt;br /&gt;
* [http://homepage.mac.com/gandreas/ IDEKit] - Framework for programmer editors (I have stated to port it to GNUstep, to know more you can contact me [[user:Qmathe | Quentin Mathé]])&lt;br /&gt;
* [[KoKit]] : A framework '''collection''', that extends the functionality of GNUstep's [[Foundation]] and [[AppKit]].&lt;br /&gt;
** [[KoKit#KoBase|KoBase]] - A low-lewel framework providing simple to use debugging aids.&lt;br /&gt;
** [[KoKit#KoFoundation|KoFoundation]] - Extension to [[Foundation]] framework.&lt;br /&gt;
** [[KoKit#KoAppKit|KoAppKit]] - Contains useful [[AppKit]] extensions and widgets.&lt;br /&gt;
** [[KoKit#KoCrypt|KoCrypt]] - Provides classes of cryptographic algorithms.&lt;br /&gt;
** [[KoKit#KoNet|KoNet]] - A collection of classes that deal with BSD socket programming.&lt;br /&gt;
* [http://www.people.virginia.edu/~yc2w/GNUstep/english/ PCRE Parser] - Perl-compatible '''regular expression''' library.&lt;br /&gt;
* [http://www.opengroupware.org/ SKYRIX Core] -  Various Foundation extensions, classes for processing MIME entities&lt;br /&gt;
&lt;br /&gt;
=== Graphics ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.gnu.org/software/gnu3dkit/gnu3dkit.html 3DKit] - The GNU 3DKit provides multiple Objective-C frameworks which facilitate the design and implementation of '''3D''' applications based on '''OpenGL'''. It tightly integrates with GNUstep and Cocoa.&lt;br /&gt;
* [http://home.gna.org/gsimageapps/ CameraKit] : a simple wrapper to [http://gphoto.org/proj/libgphoto2/ libgphoto]&lt;br /&gt;
* [http://home.gna.org/gsimageapps/ DiagramKit] : DiagramKit is a framework for manipulating, linking, drawing diagrams.&lt;br /&gt;
* [http://savannah.nongnu.org/projects/good GOOD] - GOOD stands for GNUstep Object Oriented Diagramming. It is a library that aims to provide GNUstep developers a way to add '''modern''' diagramming capabilities to their own application.&lt;br /&gt;
* [http://maliwan.sourceforge.net/ Maliwan] - GNUstep Generic Graphic Manipulate Framework.&lt;br /&gt;
* [http://home.gna.org/gsimageapps/ PDFKit] :  PDFKit is a framework that supports rendering of PDF content in GNUstep applications.&lt;br /&gt;
* [http://home.gna.org/gsimageapps/ SlideShowKit] : a small kit to include slideshow in your application&lt;br /&gt;
* [http://sourceforge.net/projects/narrative Narrative] - an LGPLed object oriented plotting framework for Cocoa and GNUstep&lt;br /&gt;
&lt;br /&gt;
=== Networking ===&lt;br /&gt;
&lt;br /&gt;
* [https://gna.org/projects/gswebkit/ GSWebKit] - The GNUstep Web Kit provides a set of classes to display web content in windows, and implements browser features such as following links when clicked by the user, managing a back-forward list, and managing a history of pages recently visited&amp;quot;&lt;br /&gt;
* [[KoKit#KoNet|KoNet]] - A collection of classes that deal with '''BSD socket''' programming. It is part of [[KoKit]].&lt;br /&gt;
* [http://netclasses.aeruder.net/ netclasses] - A GNUstep '''socket library'''.&lt;br /&gt;
* [http://www.collaboration-world.com/cgi-bin/project/index.cgi?pid=3 Pantomime] : The Pantomime framework supports the major mail protocols: POP3, IMAP, and SMTP.&lt;br /&gt;
* [http://www.opengroupware.org/ SKYRIX Core] - Provides a java.io like stream and socket library, a full IMAP4 implementation, a prototypical POP3 and SMTP processors and an Objective-C wrapper for LDAP directory services.&lt;br /&gt;
* [http://www.gnustep.org/ SMBKit] - SAMBA library wrapper&lt;br /&gt;
* [[KoKit#Tryst|Tryst]] - Provides an implementation of [http://www.apple.com/macosx/features/bonjour/ Bonjour&amp;amp;trade; (formerly known as Rendezvous&amp;amp;trade;)] for GNUstep&lt;br /&gt;
&lt;br /&gt;
=== PIM ===&lt;br /&gt;
&lt;br /&gt;
* [http://giesler.biz/bjoern/en/sw_addr.html Addresses] - A framework that allows access to the addresses database in a way that is sourcecode-compatible with Apple's AddressBook framework. It also contains a view framework to facilitate the construction of applications that use the contact database.&lt;br /&gt;
* [http://www.opengroupware.org/ SKYRIX Core] - Classes for iCalendar/vCard objects&lt;br /&gt;
* [http://opengroupware.org/en/projects/syncml/index.html syncml] - SyncML is an XML based standard for data synchronization.&lt;br /&gt;
&lt;br /&gt;
=== Scripting and Binding ===&lt;br /&gt;
&lt;br /&gt;
* [http://camelbones.sourceforge.net/index.php CamelBones] - GNUstep/Cocoa Perl bridge&lt;br /&gt;
* [http://pyobjc.sourceforge.net/ Pyobjc] - GNUstep/Cocoa Python bridge&lt;br /&gt;
&lt;br /&gt;
=== Security ===&lt;br /&gt;
&lt;br /&gt;
* [[KoKit#KoCrypt|KoCrypt]] - Provides classes of '''cryptographic algorithms'''. It is part of [[KoKit]].&lt;br /&gt;
&lt;br /&gt;
=== Text Processing ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.apax.net/swpets/objc_p1.html libobjcxerces] - XML (SAX, SAX2) and DOM handling in Objective-C using libXerces.&lt;br /&gt;
* [http://www.opengroupware.org/ SKYRIX XML] - provides a SAX2 implementation for Objective-C, DOM on top of SaxObjC, an XML-RPC implementation (without the transport layer), SaxObjC driver bundles for: libical (iCalendar,vCard), expat (XML), plists, pyx, CoreFoundation (XML) )&lt;br /&gt;
&lt;br /&gt;
== Bundles ==&lt;br /&gt;
&lt;br /&gt;
* [[Backend]] - obligatory bundle for GNUstep backed graphics system&lt;br /&gt;
* [[Camaelon]] - theme bundle&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Package_management&amp;diff=3505</id>
		<title>Package management</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Package_management&amp;diff=3505"/>
		<updated>2006-09-13T18:11:13Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Current implementation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Package management tools will be required on GNUstep-only platforms, and are nice-to-have on platforms where GNUstep is only one environment. Having working package management tools makes the environment much more accessable to end users and application developers, by lowering the threshold to having a running environment.&lt;br /&gt;
&lt;br /&gt;
Please add points below as you think of them, it's useful to collect issues and questions in one place.&lt;br /&gt;
&lt;br /&gt;
== Scope for package management within GNUstep ==&lt;br /&gt;
&lt;br /&gt;
Package management tools will need to address some of the following issues:&lt;br /&gt;
&lt;br /&gt;
* how do we ensure the authenticity and integrity of a package?&lt;br /&gt;
&lt;br /&gt;
* how many competing package formats do we really need?&lt;br /&gt;
&lt;br /&gt;
* should a package management tool interact with a (native) package management environment? (ie create synthetic dpkg data on install so that platform package management can be used by the system manager?)&lt;br /&gt;
&lt;br /&gt;
* internationalisation of packages - making sure that installation metadata is separated from end-user information&lt;br /&gt;
&lt;br /&gt;
=== Source packaging ===&lt;br /&gt;
&lt;br /&gt;
* is FTP'ing the existing tar.gz or CVS approach right? (ie no package management?)&lt;br /&gt;
&lt;br /&gt;
=== Binary packaging ===&lt;br /&gt;
&lt;br /&gt;
We need to make sure that users installing binary packages don't get unpleasant surprises:&lt;br /&gt;
&lt;br /&gt;
* how can installers inform end-users before install if the package is not suitable for their platform? (need to get some agreement on metadata)&lt;br /&gt;
&lt;br /&gt;
* how can installers maximise user flexibility in terms of application or framework installation, especially as we can't necessarily control filesystem layout?&lt;br /&gt;
&lt;br /&gt;
Multi-platform packages make sense for some application providers, especially if we can get cross-building working in Project Center.&lt;br /&gt;
&lt;br /&gt;
* should non-flat packages be generated automatically by package creation tools integrated with GNUstep make? (we'd need merge and strip tools at the least)&lt;br /&gt;
&lt;br /&gt;
* should a multi-platform format be server-side strippable to decrease download size? (this could be hard, might be easier to develop strip tools instead)&lt;br /&gt;
&lt;br /&gt;
== Current implementations ==&lt;br /&gt;
&lt;br /&gt;
There is an implementation called (surprise!) Installer.app http://www.etoile-project.org/etoile/mediawiki/index.php?title=Installer in Etoile.&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Talk:Development_Subprojects&amp;diff=3503</id>
		<title>Talk:Development Subprojects</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Talk:Development_Subprojects&amp;diff=3503"/>
		<updated>2006-09-13T18:07:12Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Warn about orphan pages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TODO ==&lt;br /&gt;
&lt;br /&gt;
integrate this with the rest of the wiki or delete it. [[User:Madleser|Madleser]]&lt;br /&gt;
&lt;br /&gt;
We have a lot of orphaned content, some of it interesting and useful including some of these links. Please ensure that if you nuke this page that the links are actually maintained somewhere useful. [[User:Comrade|Comrade]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=DesktopServicesKit&amp;diff=3477</id>
		<title>DesktopServicesKit</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=DesktopServicesKit&amp;diff=3477"/>
		<updated>2006-09-12T19:22:23Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Create page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Proposal for a Desktop Services Framework ==&lt;br /&gt;
&lt;br /&gt;
With Camaelon theming, GNUstep applications may be able to offer an &amp;quot;almost native&amp;quot; experience in alien environments like Windows and MacOS.&lt;br /&gt;
&lt;br /&gt;
To avoid significant and repetitive modifications to applications which may require some support from the native desktop environment or provide services to other applications (classic low-threshhold activities such as handling MIME and file types, all the way through to native file dialogs and gateways into local accessibility services), it may be sensible to begin work on a DesktopServicesKit.&lt;br /&gt;
&lt;br /&gt;
The following is a limited list of common desktop services offered (to one extent or another) by environments like KDE, GNOME, Windows, MacOS, Etoile and ...:&lt;br /&gt;
* desktop notifications and information&lt;br /&gt;
* file and directory dialogs&lt;br /&gt;
* printing services and dialogs&lt;br /&gt;
* registration of MIME and file-type handling capabilities&lt;br /&gt;
* native application helper launch and termination &lt;br /&gt;
* gateway from GNUstep accessibility framework (does it exist yet?) to local platform&lt;br /&gt;
* privilege escalations&lt;br /&gt;
&lt;br /&gt;
This would logically be complemented by a rather lighter System Services Framework to deal with native operating system issues such as networking, disk, volume, filesystem and file metadata, capabilities and permissions management, authentication services, etc.&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Interface_Builder&amp;diff=3476</id>
		<title>Interface Builder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Interface_Builder&amp;diff=3476"/>
		<updated>2006-09-12T18:51:08Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Link to Gorm&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;GNUstep's IB implementation, called [[Gorm]], attempts to improve on many of the aspects of the OpenStep Interface Builder.  There are some features which are available in Gorm which are not available in IB.  For more information about this see the Gorm Manual.&lt;br /&gt;
&lt;br /&gt;
More information about Apple's Interface Builder is here: http://developer.apple.com/tools/interfacebuilder/&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Writing_portable_code&amp;diff=3475</id>
		<title>Writing portable code</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Writing_portable_code&amp;diff=3475"/>
		<updated>2006-09-12T18:48:37Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Messed-up MediaWiki link corrected ;-)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;GNUstep opens up some fairly interesting opportunities to target a number of platforms with the same source code, for example porting Mac OS X Cocoa applications to Linux, the BSDs, other Unices and (ultimately) Windows without significant re-engineering effort or degraded end-user functionality. &lt;br /&gt;
&lt;br /&gt;
Some portability gotchas are listed below (please update when you run into a new one!):&lt;br /&gt;
&lt;br /&gt;
== Porting Applications ==&lt;br /&gt;
&lt;br /&gt;
=== Porting from NeXTSTEP (NX*) to GNUstep ===&lt;br /&gt;
&lt;br /&gt;
For this you should have access to an old OPENSTEP installation, or find a friend who has one, otherwise you're simply better off just rewriting the application from scratch. There are some scripts which can be used to convert an application from NeXTSTEP to OPENSTEP located in &amp;lt;tt&amp;gt;/NextDeveloper/OpenStepConversion/ConversionScripts&amp;lt;/tt&amp;gt;. They use a scripting language called &amp;quot;tops&amp;quot;.  I haven't been able, as yet, to locate a version of tops for Linux or any other operating system other than Mac OS X or OPENSTEP/Mach or NeXTSTEP. There are a few conversion applications which basically just use the tops scripts to do the conversion.  They are actually two versions of the same program, but the second one doesn't run on NeXT, so here's both.  These are:&lt;br /&gt;
&lt;br /&gt;
* [ftp://next-ftp.peak.org/openstep/mach/apps/devtools/Conversion.0.5.NI.tar.gz]&lt;br /&gt;
* [ftp://next-ftp.peak.org/openstep/mach/apps/devtools/ConversionII.1.0.I.tar.gz]&lt;br /&gt;
&lt;br /&gt;
You should be able to point it at the project directory you wish to convert and start the conversion.  The GUI is very straightforward. You can also run the tops scripts on a Mac simply by saying:&lt;br /&gt;
&lt;br /&gt;
   tops -verbose -scriptfile {scriptfilename} {filestoconvert}&lt;br /&gt;
&lt;br /&gt;
All of the files are converted in place.  You must run all of the tops scripts in the ConversionScripts directory against the application code.  It is considerably simply to use the existing applications.  Unfortunately these scripts do not exist on Mac OS X, otherwise porting the Conversion application might be useful.&lt;br /&gt;
&lt;br /&gt;
When you start the scripts, if you're running them on black hardware you should go get a cup of coffee and watch a movie with your wife or go code something else for a while.   The conversion will take a good long while on an older machine.   I haven't timed it on the Mac, though.  Once this is done, there is still a long way to go.  Read on.&lt;br /&gt;
&lt;br /&gt;
OPENSTEP4.2/Mach had a class called NSCStringText.  This class was primarily for apps which were converted from NeXTSTEP to use as a stop-gap measure in OpenStep.  This is one of the main reasons why it isn't in GNUstep.  You will need to make sure that any classes modified by the scripts to use NSCStringText will use NSText and it's related classes as appropriate. OPENSTEP4.2/Mac also had some other extensions on the OpenStep standard such as NXStreams.  You will also need to convert any and all instances of NXStream to use NSData instead in order to make your app work with GNUstep.&lt;br /&gt;
&lt;br /&gt;
If your app is fairly small, you shouldn't be in for a great shock, but if your app is heavily reliant on the old Text object from NeXTSTEP, you have a lot of work ahead.  Other gaps which the scripts might leave are problems with NSUserDefaults which it can't fix on it's own.&lt;br /&gt;
&lt;br /&gt;
=== Porting from Cocoa or OPENSTEP (NS*) to GNUstep ===&lt;br /&gt;
&lt;br /&gt;
Porting from Cocoa or OPENSTEP to GNUstep has different aspects. First there is the compatibility of the basic Foundation Kit and Application Kit. We support a lot of classes, but not all of them and the same is true for specific methods, specifically newly introduced classes and methods in Cocoa may still be missing as GNUstep started out aiming at OpenStep compatibility.&lt;br /&gt;
&lt;br /&gt;
Second you have all the additional frameworks and libraries programmers on Mac OS X take for granted, for some of them free replacements exists, for most they are still missing. Mac OS X developers should try and avoid CoreFoundation as this will complicate your dependency situation on non-Mac hosts, even if that part of CoreFoundation has actually been ported. GNUstep Base and the FoundationKit offer many parts of the CoreFoundation functionality in a natural [[Objective-C]] manner. To be a bit more specific:&lt;br /&gt;
&lt;br /&gt;
* don't use Core* (CoreFoundation, CoreSound, CoreAnimation, ...)&lt;br /&gt;
* don't use KeyChain&lt;br /&gt;
* don't use Carbon&lt;br /&gt;
* don't use Quartz&lt;br /&gt;
* don't use QuickTime&lt;br /&gt;
* don't use WebKit (GCC 4.1 and up support ObjC++, but currently, there exists no WebKit port for GNUstep)&lt;br /&gt;
* don't use altivec features or the vecLib.framework (a collection of functions for vector manipulation, an Apple specific extension)&lt;br /&gt;
* don't use anything else we do not provide&lt;br /&gt;
&lt;br /&gt;
If you committed none of these portability evils, the rest is relatively straightforward:&lt;br /&gt;
&lt;br /&gt;
# [[Writing Makefiles|Write a new GNUstep make file]] for the project (very easy, still there is currently no automatic way to do so).&lt;br /&gt;
# Make sure the Nib files are readable by GNUstep.  Make certain that they are 10.2.x or later nibs so that they can be read by GUI.  Another option is to load them into Gorm and convert them into .gorm files. If they're from OPENSTEP or Mac OS X 10.1 or earlier, see [[#Porting_.nib_files_from_OPENSTEP_or_Mac_OS_X_10.1_and_earlier|below]].&lt;br /&gt;
# Provide an Info.plist.&lt;br /&gt;
&lt;br /&gt;
=== Porting from GNUstep to Cocoa ===&lt;br /&gt;
&lt;br /&gt;
This should be an easy transition since GNUstep implements most of Cocoa, except for the very Apple specific classes such as the scripting extensions. Since Gorm does not yet save .nib files, you will need to create the interfaces using IB.   Also there is a gorm reading/parsing framework for Cocoa in the works as well, so please stay tuned.&lt;br /&gt;
&lt;br /&gt;
Will will need to:&lt;br /&gt;
&lt;br /&gt;
* Make a Project Builder project for your app or&lt;br /&gt;
* an Xcode project for your app&lt;br /&gt;
&lt;br /&gt;
Do the following:&lt;br /&gt;
&lt;br /&gt;
* Open Xcode.&lt;br /&gt;
* Choose Application (if your project is an application)&lt;br /&gt;
* Enter the name and location you wish the Project to reside at&lt;br /&gt;
* Copy your files from your GNUstep application into the new project&lt;br /&gt;
* Using the &amp;quot;Add Existing Files&amp;quot; option to add these file to your project.&lt;br /&gt;
&lt;br /&gt;
You should preserve your original directory structure if you want to distribute one package for both GNUstep and Cocoa.&lt;br /&gt;
&lt;br /&gt;
== Stumbling Blocks ==&lt;br /&gt;
&lt;br /&gt;
=== Apple's Cocoa.h ===&lt;br /&gt;
&lt;br /&gt;
It is there to enable pre-compiled headers and speed up compile time thusly. Anyway, it contains just two lines:&lt;br /&gt;
&lt;br /&gt;
 #import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
 #import &amp;lt;AppKit/AppKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So you can easily work around this by providing your own or replace your include of &amp;lt;Cocoa/Cocoa.h&amp;gt; with just the above, which will also work on OS-X.&lt;br /&gt;
&lt;br /&gt;
=== Distinguishing Between Cocoa and GNUstep ===&lt;br /&gt;
&lt;br /&gt;
 #ifdef GNUSTEP&lt;br /&gt;
     ''/* GNUstep code goes here ... */''&lt;br /&gt;
 #else&lt;br /&gt;
     ''/* OS-X Cocoa native code goes here ... */''&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
=== Porting .nib files from OPENSTEP or Mac OS X 10.1 and earlier ===&lt;br /&gt;
&lt;br /&gt;
On Mac OS X, this is a simple matter of loading the .nibs into InterfaceBuilder.app and saving them in the new format. Another possibility is using nib2gmodel, the only one when porting from OPENSTEP, and mind you, you need to do the converting ''there''. First, get [http://freshmeat.net/projects/nib2gmodel/ nib2gmodel], follow the included instructions to build and install it.  Once that's done you're ready to begin:&lt;br /&gt;
&lt;br /&gt;
Run the nib2gmodel program on your nib:&lt;br /&gt;
&lt;br /&gt;
   nib2gmodel mygui.nib mygui.gmodel&lt;br /&gt;
&lt;br /&gt;
This should create the .gmodel as a plist.   I recommend that you convert the gmodel to a &amp;quot;normal&amp;quot; plist instead of an XML plist.  You can do that by doing this on OS X:&lt;br /&gt;
&lt;br /&gt;
   pl &amp;lt; mygui.gmodel -output mygui.ser&lt;br /&gt;
   pl &amp;gt; mygui.gmodel -input mygui.ser&lt;br /&gt;
   rm mygui.ser&lt;br /&gt;
&lt;br /&gt;
Now you can either use the gmodel as it is, or you can convert it to a .gorm file.&lt;br /&gt;
&lt;br /&gt;
==== Gmodel to .gorm conversion ====&lt;br /&gt;
&lt;br /&gt;
NOTE: Conversion from gmodel to .gorm is experimental and will probably remain so for a while.   It currently works in the majority of cases, but there are still improvements which need to be made.&lt;br /&gt;
&lt;br /&gt;
Conversion to a .gorm file is relatively straightforward:&lt;br /&gt;
&lt;br /&gt;
* Start Gorm.app.&lt;br /&gt;
* Choose Gorm-&amp;gt;Document-&amp;gt;Open and find the gmodel you wish to load.&lt;br /&gt;
* Gorm will prompt you to either define the superclass for classes it doesn't know about or to parse the headers. &lt;br /&gt;
&lt;br /&gt;
After you've defined all of the unknown classes, Gorm should complete the conversion.  Once this is done you should save the result to make sure you don't loose your work.&lt;br /&gt;
&lt;br /&gt;
=== Xcode conversion ===&lt;br /&gt;
&lt;br /&gt;
* how to convert Xcode project to GNUstep project (creating a GNUstep [http://www.gnustep.it/nicola/Tutorials/WritingMakefiles/index.html Makefile] or [[ProjectCenter]])&lt;br /&gt;
&lt;br /&gt;
* PBTOMAKE. [http://www.macdevcenter.com/pub/a/mac/2004/04/20/xcodetounix.html xcodetounix] (download at [http://members.bellatlantic.net/%7Evze35xda/software.html]) is a tool for converting Xcode and Project Builder files to generic Unix Makefiles.  It would probably be a good start for converting to a GNUstep makefile.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
=== Do not rely on tools available in development environment ===&lt;br /&gt;
&lt;br /&gt;
All the world is not Linux or FreeBSD or Windows. System constants may be different on different platforms. Paths to command-line tools, the parameters they accept and locations of temporary directories may be different to what you are used to on your platform.&lt;br /&gt;
&lt;br /&gt;
* [[Foundation|GNUstep Base]] and the [[Foundation|FoundationKit]] offer some of this functionality &amp;quot;for free&amp;quot;.&lt;br /&gt;
* Try not to hard code paths and so on into your code, use macros (not recommended), or even better an abstraction mechanism.&lt;br /&gt;
* Avoid hard-coding system constants, or platform-specific ones where POSIX or commonly-accepted ones exist (and we're not talking about glibc here :-)&lt;br /&gt;
* Try to avoid advanced features of the linker, such as weak symbols, which may not be present on non-ELF systems.  While this will work perfectly on most systems, it is not portable to all systems, most notably Windows.&lt;br /&gt;
&lt;br /&gt;
=== When platform-specific code cannot be avoided ===&lt;br /&gt;
&lt;br /&gt;
There are cases where you may need to write platform-specific code, especially in the case of desktop applications and services which make use of facilities not standardised by POSIX or by the FoundationKit and AppKit  specifications, at least use [[Identifying the target platform|standard platform macros]].&lt;br /&gt;
&lt;br /&gt;
These platform-specific, or even desktop-specific requirements could be re-used by other projects - and even enhance desktop-integration efforts for GNUstep applications - by abstracting out common code into currently hypothetical [[PlatformKit]] and [[DesktopServicesKit]] frameworks.&lt;br /&gt;
&lt;br /&gt;
[[Category:Project procedures]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Writing_portable_code&amp;diff=3474</id>
		<title>Writing portable code</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Writing_portable_code&amp;diff=3474"/>
		<updated>2006-09-12T18:47:16Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Added link to IdentifyingTheTargetPlatform and discussed platform specific code possibilities&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;GNUstep opens up some fairly interesting opportunities to target a number of platforms with the same source code, for example porting Mac OS X Cocoa applications to Linux, the BSDs, other Unices and (ultimately) Windows without significant re-engineering effort or degraded end-user functionality. &lt;br /&gt;
&lt;br /&gt;
Some portability gotchas are listed below (please update when you run into a new one!):&lt;br /&gt;
&lt;br /&gt;
== Porting Applications ==&lt;br /&gt;
&lt;br /&gt;
=== Porting from NeXTSTEP (NX*) to GNUstep ===&lt;br /&gt;
&lt;br /&gt;
For this you should have access to an old OPENSTEP installation, or find a friend who has one, otherwise you're simply better off just rewriting the application from scratch. There are some scripts which can be used to convert an application from NeXTSTEP to OPENSTEP located in &amp;lt;tt&amp;gt;/NextDeveloper/OpenStepConversion/ConversionScripts&amp;lt;/tt&amp;gt;. They use a scripting language called &amp;quot;tops&amp;quot;.  I haven't been able, as yet, to locate a version of tops for Linux or any other operating system other than Mac OS X or OPENSTEP/Mach or NeXTSTEP. There are a few conversion applications which basically just use the tops scripts to do the conversion.  They are actually two versions of the same program, but the second one doesn't run on NeXT, so here's both.  These are:&lt;br /&gt;
&lt;br /&gt;
* [ftp://next-ftp.peak.org/openstep/mach/apps/devtools/Conversion.0.5.NI.tar.gz]&lt;br /&gt;
* [ftp://next-ftp.peak.org/openstep/mach/apps/devtools/ConversionII.1.0.I.tar.gz]&lt;br /&gt;
&lt;br /&gt;
You should be able to point it at the project directory you wish to convert and start the conversion.  The GUI is very straightforward. You can also run the tops scripts on a Mac simply by saying:&lt;br /&gt;
&lt;br /&gt;
   tops -verbose -scriptfile {scriptfilename} {filestoconvert}&lt;br /&gt;
&lt;br /&gt;
All of the files are converted in place.  You must run all of the tops scripts in the ConversionScripts directory against the application code.  It is considerably simply to use the existing applications.  Unfortunately these scripts do not exist on Mac OS X, otherwise porting the Conversion application might be useful.&lt;br /&gt;
&lt;br /&gt;
When you start the scripts, if you're running them on black hardware you should go get a cup of coffee and watch a movie with your wife or go code something else for a while.   The conversion will take a good long while on an older machine.   I haven't timed it on the Mac, though.  Once this is done, there is still a long way to go.  Read on.&lt;br /&gt;
&lt;br /&gt;
OPENSTEP4.2/Mach had a class called NSCStringText.  This class was primarily for apps which were converted from NeXTSTEP to use as a stop-gap measure in OpenStep.  This is one of the main reasons why it isn't in GNUstep.  You will need to make sure that any classes modified by the scripts to use NSCStringText will use NSText and it's related classes as appropriate. OPENSTEP4.2/Mac also had some other extensions on the OpenStep standard such as NXStreams.  You will also need to convert any and all instances of NXStream to use NSData instead in order to make your app work with GNUstep.&lt;br /&gt;
&lt;br /&gt;
If your app is fairly small, you shouldn't be in for a great shock, but if your app is heavily reliant on the old Text object from NeXTSTEP, you have a lot of work ahead.  Other gaps which the scripts might leave are problems with NSUserDefaults which it can't fix on it's own.&lt;br /&gt;
&lt;br /&gt;
=== Porting from Cocoa or OPENSTEP (NS*) to GNUstep ===&lt;br /&gt;
&lt;br /&gt;
Porting from Cocoa or OPENSTEP to GNUstep has different aspects. First there is the compatibility of the basic Foundation Kit and Application Kit. We support a lot of classes, but not all of them and the same is true for specific methods, specifically newly introduced classes and methods in Cocoa may still be missing as GNUstep started out aiming at OpenStep compatibility.&lt;br /&gt;
&lt;br /&gt;
Second you have all the additional frameworks and libraries programmers on Mac OS X take for granted, for some of them free replacements exists, for most they are still missing. Mac OS X developers should try and avoid CoreFoundation as this will complicate your dependency situation on non-Mac hosts, even if that part of CoreFoundation has actually been ported. GNUstep Base and the FoundationKit offer many parts of the CoreFoundation functionality in a natural [[Objective-C]] manner. To be a bit more specific:&lt;br /&gt;
&lt;br /&gt;
* don't use Core* (CoreFoundation, CoreSound, CoreAnimation, ...)&lt;br /&gt;
* don't use KeyChain&lt;br /&gt;
* don't use Carbon&lt;br /&gt;
* don't use Quartz&lt;br /&gt;
* don't use QuickTime&lt;br /&gt;
* don't use WebKit (GCC 4.1 and up support ObjC++, but currently, there exists no WebKit port for GNUstep)&lt;br /&gt;
* don't use altivec features or the vecLib.framework (a collection of functions for vector manipulation, an Apple specific extension)&lt;br /&gt;
* don't use anything else we do not provide&lt;br /&gt;
&lt;br /&gt;
If you committed none of these portability evils, the rest is relatively straightforward:&lt;br /&gt;
&lt;br /&gt;
# [[Writing Makefiles|Write a new GNUstep make file]] for the project (very easy, still there is currently no automatic way to do so).&lt;br /&gt;
# Make sure the Nib files are readable by GNUstep.  Make certain that they are 10.2.x or later nibs so that they can be read by GUI.  Another option is to load them into Gorm and convert them into .gorm files. If they're from OPENSTEP or Mac OS X 10.1 or earlier, see [[#Porting_.nib_files_from_OPENSTEP_or_Mac_OS_X_10.1_and_earlier|below]].&lt;br /&gt;
# Provide an Info.plist.&lt;br /&gt;
&lt;br /&gt;
=== Porting from GNUstep to Cocoa ===&lt;br /&gt;
&lt;br /&gt;
This should be an easy transition since GNUstep implements most of Cocoa, except for the very Apple specific classes such as the scripting extensions. Since Gorm does not yet save .nib files, you will need to create the interfaces using IB.   Also there is a gorm reading/parsing framework for Cocoa in the works as well, so please stay tuned.&lt;br /&gt;
&lt;br /&gt;
Will will need to:&lt;br /&gt;
&lt;br /&gt;
* Make a Project Builder project for your app or&lt;br /&gt;
* an Xcode project for your app&lt;br /&gt;
&lt;br /&gt;
Do the following:&lt;br /&gt;
&lt;br /&gt;
* Open Xcode.&lt;br /&gt;
* Choose Application (if your project is an application)&lt;br /&gt;
* Enter the name and location you wish the Project to reside at&lt;br /&gt;
* Copy your files from your GNUstep application into the new project&lt;br /&gt;
* Using the &amp;quot;Add Existing Files&amp;quot; option to add these file to your project.&lt;br /&gt;
&lt;br /&gt;
You should preserve your original directory structure if you want to distribute one package for both GNUstep and Cocoa.&lt;br /&gt;
&lt;br /&gt;
== Stumbling Blocks ==&lt;br /&gt;
&lt;br /&gt;
=== Apple's Cocoa.h ===&lt;br /&gt;
&lt;br /&gt;
It is there to enable pre-compiled headers and speed up compile time thusly. Anyway, it contains just two lines:&lt;br /&gt;
&lt;br /&gt;
 #import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br /&gt;
 #import &amp;lt;AppKit/AppKit.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So you can easily work around this by providing your own or replace your include of &amp;lt;Cocoa/Cocoa.h&amp;gt; with just the above, which will also work on OS-X.&lt;br /&gt;
&lt;br /&gt;
=== Distinguishing Between Cocoa and GNUstep ===&lt;br /&gt;
&lt;br /&gt;
 #ifdef GNUSTEP&lt;br /&gt;
     ''/* GNUstep code goes here ... */''&lt;br /&gt;
 #else&lt;br /&gt;
     ''/* OS-X Cocoa native code goes here ... */''&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
=== Porting .nib files from OPENSTEP or Mac OS X 10.1 and earlier ===&lt;br /&gt;
&lt;br /&gt;
On Mac OS X, this is a simple matter of loading the .nibs into InterfaceBuilder.app and saving them in the new format. Another possibility is using nib2gmodel, the only one when porting from OPENSTEP, and mind you, you need to do the converting ''there''. First, get [http://freshmeat.net/projects/nib2gmodel/ nib2gmodel], follow the included instructions to build and install it.  Once that's done you're ready to begin:&lt;br /&gt;
&lt;br /&gt;
Run the nib2gmodel program on your nib:&lt;br /&gt;
&lt;br /&gt;
   nib2gmodel mygui.nib mygui.gmodel&lt;br /&gt;
&lt;br /&gt;
This should create the .gmodel as a plist.   I recommend that you convert the gmodel to a &amp;quot;normal&amp;quot; plist instead of an XML plist.  You can do that by doing this on OS X:&lt;br /&gt;
&lt;br /&gt;
   pl &amp;lt; mygui.gmodel -output mygui.ser&lt;br /&gt;
   pl &amp;gt; mygui.gmodel -input mygui.ser&lt;br /&gt;
   rm mygui.ser&lt;br /&gt;
&lt;br /&gt;
Now you can either use the gmodel as it is, or you can convert it to a .gorm file.&lt;br /&gt;
&lt;br /&gt;
==== Gmodel to .gorm conversion ====&lt;br /&gt;
&lt;br /&gt;
NOTE: Conversion from gmodel to .gorm is experimental and will probably remain so for a while.   It currently works in the majority of cases, but there are still improvements which need to be made.&lt;br /&gt;
&lt;br /&gt;
Conversion to a .gorm file is relatively straightforward:&lt;br /&gt;
&lt;br /&gt;
* Start Gorm.app.&lt;br /&gt;
* Choose Gorm-&amp;gt;Document-&amp;gt;Open and find the gmodel you wish to load.&lt;br /&gt;
* Gorm will prompt you to either define the superclass for classes it doesn't know about or to parse the headers. &lt;br /&gt;
&lt;br /&gt;
After you've defined all of the unknown classes, Gorm should complete the conversion.  Once this is done you should save the result to make sure you don't loose your work.&lt;br /&gt;
&lt;br /&gt;
=== Xcode conversion ===&lt;br /&gt;
&lt;br /&gt;
* how to convert Xcode project to GNUstep project (creating a GNUstep [http://www.gnustep.it/nicola/Tutorials/WritingMakefiles/index.html Makefile] or [[ProjectCenter]])&lt;br /&gt;
&lt;br /&gt;
* PBTOMAKE. [http://www.macdevcenter.com/pub/a/mac/2004/04/20/xcodetounix.html xcodetounix] (download at [http://members.bellatlantic.net/%7Evze35xda/software.html]) is a tool for converting Xcode and Project Builder files to generic Unix Makefiles.  It would probably be a good start for converting to a GNUstep makefile.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
=== Do not rely on tools available in development environment ===&lt;br /&gt;
&lt;br /&gt;
All the world is not Linux or FreeBSD or Windows. System constants may be different on different platforms. Paths to command-line tools, the parameters they accept and locations of temporary directories may be different to what you are used to on your platform.&lt;br /&gt;
&lt;br /&gt;
* [[Foundation|GNUstep Base]] and the [[Foundation|FoundationKit]] offer some of this functionality &amp;quot;for free&amp;quot;.&lt;br /&gt;
* Try not to hard code paths and so on into your code, use macros (not recommended), or even better an abstraction mechanism.&lt;br /&gt;
* Avoid hard-coding system constants, or platform-specific ones where POSIX or commonly-accepted ones exist (and we're not talking about glibc here :-)&lt;br /&gt;
* Try to avoid advanced features of the linker, such as weak symbols, which may not be present on non-ELF systems.  While this will work perfectly on most systems, it is not portable to all systems, most notably Windows.&lt;br /&gt;
&lt;br /&gt;
=== When platform-specific code cannot be avoided ===&lt;br /&gt;
&lt;br /&gt;
There are cases where you may need to write platform-specific code, especially in the case of desktop applications and services which make use of facilities not standardised by POSIX or by the FoundationKit and AppKit  specifications, at least use [[standard platform macros|Identifying the target platform]].&lt;br /&gt;
&lt;br /&gt;
These platform-specific, or even desktop-specific requirements could be re-used by other projects - and even enhance desktop-integration efforts for GNUstep applications - by abstracting out common code into currently hypothetical [[PlatformKit]] and [[DesktopServicesKit]] frameworks.&lt;br /&gt;
&lt;br /&gt;
[[Category:Project procedures]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Application_News&amp;diff=2954</id>
		<title>Application News</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Application_News&amp;diff=2954"/>
		<updated>2006-02-22T19:40:12Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Etoile: I can't do accents, sorry; also not really an app, but it is a release&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
! Date         !! Application and Link  !!  Version&lt;br /&gt;
|-&lt;br /&gt;
| 22. Feb 2005 || [http://www.etoile-project.org Etoile] || 0.1&lt;br /&gt;
|-&lt;br /&gt;
| 15. Feb 2005 || [[KoKit#Tryst|Tryst]] || 107pre5&lt;br /&gt;
|-&lt;br /&gt;
| 15. Feb 2005 || [[KoKit#KoBase|KoBase]] || 0.3.2&lt;br /&gt;
|-&lt;br /&gt;
| 09. Feb 2006 || [http://mail.rochester.edu/~asveikau/grouch/ Grouch] || (currently snapshot only)&lt;br /&gt;
|-&lt;br /&gt;
| 08. Feb 2006 || [http://notebook.cowgar.com/ NoteBook] || 0.3&lt;br /&gt;
|-&lt;br /&gt;
| 25. Jan 2006 || [http://gnustep.org/experience/Gorm.html Gorm] || 1.0.4&lt;br /&gt;
|-&lt;br /&gt;
| 15. Jan 2006 || [http://www.gnustep.org/experience/ProjectCenter.html ProjectCenter] || 0.4.3&lt;br /&gt;
|-&lt;br /&gt;
| 15. Jan 2006 || [http://sourceforge.net/projects/fortytwo/ 42] || 0.1.0&lt;br /&gt;
|-&lt;br /&gt;
| 08. Jan 2006 || [http://www.random-ideas.net/Software/WildMenus-jd.tar.gz WildMenus] || modified by Jiva DeVoe&lt;br /&gt;
|-&lt;br /&gt;
| 04. Jan 2006 || [http://sourceforge.net/projects/dimvisual/ DIMVisual] || 0.2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Older News ==&lt;br /&gt;
[[Application_News_2005|2005]],&lt;br /&gt;
[[Application_News_2004|2004]],&lt;br /&gt;
[[Application_News_2003|2003]],&lt;br /&gt;
[[Application_News_2002|2002]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=KoKit&amp;diff=2944</id>
		<title>KoKit</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=KoKit&amp;diff=2944"/>
		<updated>2006-02-01T16:35:19Z</updated>

		<summary type="html">&lt;p&gt;Comrade: spelling change&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;KoKit is a framework collection, that extends the functionality of GNUstep's [[Foundation]] and [[AppKit]]. Basically it's a collection of classes we use repeatedly, so instead of adding the source again and again, we decided to create KoKit.&lt;br /&gt;
&lt;br /&gt;
It currently consists of the following frameworks:&lt;br /&gt;
&lt;br /&gt;
* '''KoBase''' is the low-level framework in the KoKit framework collection. It provides some simple to use debugging aids, instance counting to discover and track memory leaks, and functions for easy C string manipulation.&lt;br /&gt;
&lt;br /&gt;
* '''KoFoundation''' is an extension to GNUstep's [[Foundation]] framework. It adds additional containers, such as LIFO (stack) and FIFO (queue), a signal handler and more.&lt;br /&gt;
&lt;br /&gt;
* '''KoAppKit''' is an extension to GNUstep's [[AppKit]] framework. It adds a collection of useful extensions and widgets that make GUI development a bit easier.&lt;br /&gt;
&lt;br /&gt;
* '''KoCrypt''' provides a collection of classes of cryptographic algorithms and categories for quick and easy access.&lt;br /&gt;
&lt;br /&gt;
* '''KoNet''' is a collection of classes that deal with BSD socket programming.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Image:Tryst.jpg|right|thumbnail|Example screenshot of a net service browser (TBrowser.app).]]&lt;br /&gt;
&lt;br /&gt;
* '''Tryst''' is a ''proof of concept'' implementation of [http://www.apple.com/ Apple]'s [http://www.apple.com/macosx/features/bonjour/ Bonjour] (formerly known as Rendezvous) for GNUstep.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Bonjour allows you to register a network service, such as a printer or file server, so that it can be found by name or browsed for by service type and domain.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Using Tryst, applications can discover what services are available on the network, along with all necessary access information such as name, IP address, and port number for a given service. &lt;br /&gt;
&lt;br /&gt;
[[Category:Frameworks]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Creating_document_based_applications&amp;diff=2900</id>
		<title>Creating document based applications</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Creating_document_based_applications&amp;diff=2900"/>
		<updated>2005-11-29T10:26:06Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Small language changes and punctuation update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Note: First version; subject to further revisions and changes.&lt;br /&gt;
--[[User:Quineska|ChrisArmstrong]] 07:09, 7 Jul 2005 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
[[OpenStep]] supports document-based applications, simplifing the process of creating applications whose behaviour is familiar to many users. [[GNUstep]] also provides this functionality to the developer. This guide aims to provide an overview of what is required in the creation and design of such an application.&lt;br /&gt;
&lt;br /&gt;
It is assumed you are familiar with GNUstep, and have some understanding as how to create [[Gorm]]'s interface files (often referred to as nibs), as well as some understanding of how they work.&lt;br /&gt;
&lt;br /&gt;
Importantly, such applications have certain components that are required, and should be considered as part of their design. When programming, classes that will be used as part of the [[AppKit]] are:&lt;br /&gt;
&lt;br /&gt;
==== NSDocument ====&lt;br /&gt;
&lt;br /&gt;
This class is central to the OpenStep document based model. These application's declare a new instance of a subclass of NSDocument for each “document” that is opened. You will subclass NSDocument to implement this.&lt;br /&gt;
&lt;br /&gt;
Each instance of your NSDocument subclass may have one or more windows associated with it. These are used as an interface for loading and saving a representation of your document type. Each window will have an “NSWindowController” instance associated with it, where NSDocument maintains a list of these.&lt;br /&gt;
&lt;br /&gt;
==== NSDocumentController ====&lt;br /&gt;
&lt;br /&gt;
This class acts a controller. It maintains a list of documents (instances of your NSDocument subclass) and is responsible for loading and instantiating new documents. It is usually not necessary to implement a subclass of this, but often it may be useful to implement special functionality (especially related to opening and creating documents at an application level).&lt;br /&gt;
&lt;br /&gt;
==== NSWindowController ====&lt;br /&gt;
&lt;br /&gt;
As mentioned above, NSWindowController instances are individually associated with one NSWindow instance, in such a way that a document maintains a list of window controllers that are reponsible for rendering the views associated with a document.&lt;br /&gt;
&lt;br /&gt;
You will most likely not have to subclass NSWindowController. Instead, you associate a nib file (the Gorm output) with the subclass of NSDocument, and NSDocumentController will load this nib file for each document that is created or loaded.&lt;br /&gt;
&lt;br /&gt;
For example, a text based application that is used for the editing of plain text files, may subclass NSDocument with a TextDocument class. Each instance of this class would have an NSWindowController instance associated with it, which in turn manages a window instance that is instantiated from a nib file. The NSDocumentController instance, as managed and instantiated by GNUstep, would be responsible for loading and saving documents in your application. It even prompts the user to save their documents when they try to quit the application.&lt;br /&gt;
&lt;br /&gt;
== File Components ==&lt;br /&gt;
&lt;br /&gt;
In building your application you will need to create a number of special files. From scratch, the following should be a rough guide to getting it working. These include the Makefile, your application's property list and the interface files.&lt;br /&gt;
&lt;br /&gt;
=== The Makefile ===&lt;br /&gt;
&lt;br /&gt;
For this type of application, no special makefile is needed: it just has to be a normal application. Project Builder should be able to spit out the required makefile and Gorm files that are needed for a generic application. I believe it is also capable of providing support for document-based applications. Otherwise use the following as a template:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GNUmakefile'''&lt;br /&gt;
&lt;br /&gt;
 include $(GNUSTEP_MAKEFILES)/common.make&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
 APP_NAME = DocumentApp&amp;lt;br&amp;gt;&lt;br /&gt;
 DocumentApp_OBJC_FILES =&amp;lt;br&amp;gt;&lt;br /&gt;
  MyDocument.m &amp;lt;br&amp;gt;&lt;br /&gt;
  main.m&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
 DocumentApp_RESOURCES = \ &amp;lt;br&amp;gt;&lt;br /&gt;
  Resources/Info-gnustep.plist \&amp;lt;br&amp;gt;&lt;br /&gt;
  Resources/DocumentApp.gorm \&amp;lt;br&amp;gt;&lt;br /&gt;
  Resources/MyDocument.gorm&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
 -include GNUmakefile.preamble&amp;lt;br&amp;gt;&lt;br /&gt;
 include $(GNUSTEP_MAKEFILES)/application.make&amp;lt;br&amp;gt;&lt;br /&gt;
 -include GNUmakefile.postamble&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more information as to customising this file, as well as setting up compiler options for third party libraries and includes, see the GNUstep makefile manual.&lt;br /&gt;
&lt;br /&gt;
===The application dictionary===&lt;br /&gt;
&lt;br /&gt;
For those that have edited this file in their project before, it is a dictionary with various values entered. For our purposes, we need an array within the main dictionary, called &amp;quot;NSTypes&amp;quot;. This is a array of unnamed dictionaries, with one dictionary for each type. &lt;br /&gt;
&lt;br /&gt;
I have provided an example for this file below. ProjectBuilder creates one as well. Please note that &amp;quot;TextEdit&amp;quot; does exist as an example application from NEXT I think, and again on MacOS X but I have constructed a much simpler version, used only for plain text files.&lt;br /&gt;
&lt;br /&gt;
Taking a look at the single dictionary entry in the NSTypes array, the following key-value pairs are needed:&lt;br /&gt;
* '''NSDocumentClass:''' This is (string) the subclass name you use in your code, the &amp;quot;objective-c name&amp;quot; of your document subclass. This is used by NSDocumentController's default implementation to create instances of your document type.&lt;br /&gt;
* '''NSName:''' The generic file type (string). This is completely arbitrary, and can be anything you like. For the purpose of conventions, it may be more appropriate not to use the &amp;quot;NS&amp;quot; or &amp;quot;GS&amp;quot; prefix (the latter of which I not sure), and instead use either your own, or no prefix at all.&lt;br /&gt;
* '''NSHumanReadableName:''' The human readable name of your document type (string)? TODO: explain where this is used.&lt;br /&gt;
* '''NSUnixExtensions:''' An array of strings, each containing a file extension connected to this document type on &amp;quot;unix&amp;quot; platforms. TODO: explain how &amp;quot;unix&amp;quot; is interpreted by GNUstep.&lt;br /&gt;
* '''NSDOSExtensions:''' An array of strings, each containing a file extenstion connected to this document type on &amp;quot;DOS&amp;quot; platforms (could be loosely interpreted as any MS platforms GNUstep runs on, i.e. Windows 2000/XP).&lt;br /&gt;
* '''NSRole:''' A string, either &amp;quot;Viewer&amp;quot; or &amp;quot;Editor&amp;quot;, depending on how your document operates on this file type.&lt;br /&gt;
* '''NSIcon:''' A icon name associated with this document type. TODO: Investigate how this works.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Info-gnustep.plist'''&lt;br /&gt;
 {&lt;br /&gt;
     ApplicationDescription = &amp;quot;A simple text editor for GNUstep.&amp;quot;;&lt;br /&gt;
     ApplicationName = TextEdit;&lt;br /&gt;
     ApplicationRelease = 0.10;&lt;br /&gt;
     Authors = ( &amp;quot;Christopher Armstrong&amp;quot; );&lt;br /&gt;
     Copyright = &amp;quot;Copyright (C) 2005 Christopher Armstrong&amp;quot;;&lt;br /&gt;
     CopyrightDescription = &amp;quot;Released under GPL.&amp;quot;;&lt;br /&gt;
     FullVersionID = 0.10;&lt;br /&gt;
     NSExecutable = TextEdit;&lt;br /&gt;
     NSMainNibFile = TextEdit.gorm;&lt;br /&gt;
     NSPrincipalClass = NSApplication;&lt;br /&gt;
     NSRole = Application;&lt;br /&gt;
     NSTypes = (&lt;br /&gt;
         {&lt;br /&gt;
                 NSDocumentClass = &amp;quot;TextDocument&amp;quot;;&lt;br /&gt;
                 NSName = &amp;quot;GSTextDocumentType&amp;quot;;&lt;br /&gt;
                 NSHumanReadableName = &amp;quot;Text Document&amp;quot;;&lt;br /&gt;
                 NSUnixExtensions = ( &amp;quot;txt&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;
                 NSDOSExtensions = ( &amp;quot;txt&amp;quot; );&lt;br /&gt;
                 NSRole = Editor;&lt;br /&gt;
         }&lt;br /&gt;
     );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more information on property list files, consult [[Property Lists]].&lt;br /&gt;
&lt;br /&gt;
=== Interface files ===&lt;br /&gt;
&lt;br /&gt;
Two interface files are needed: one for your main application, and another that will be instantiated with each instance of your document subclass. These both should be listed as resources in your makefile, (as shown the GNUmakefile example above). It may be helpful to name the document nib file after your class.&lt;br /&gt;
&lt;br /&gt;
==== Application Interface File ====&lt;br /&gt;
&lt;br /&gt;
The application one should just be a menu (though it could be more if necessary). When constructing it, take the following into account:&lt;br /&gt;
&lt;br /&gt;
* '''Use an &amp;quot;Application&amp;quot; template''': Use a standard Gorm template for an Application.&lt;br /&gt;
* '''Delete the NSWindow instance''': In the &amp;quot;Objects&amp;quot; pane, remove the NSWindow instance by going File-&amp;gt;Delete (unless you need a main window, which is beyond the scope of this document).&lt;br /&gt;
* '''Set NSOwner's class to &amp;quot;NSDocumentController&amp;quot;''': This is the custom class option of NSOwner in the property inspector. This ensures that the openDocument:, newDocument: messages, as sent to NSFirst, get picked up by NSDocumentController. Do not instantiate it (I believe you can't anyway).&lt;br /&gt;
* '''[Optional] Subclass NSDocumentController''':If you intend to subclass NSDocumentController, subclass it in the Classes pane. To make sure that this class is instantiated and used, make sure you instantiate it in Gorm or in your main.m file, and then set NSOwner to be of your custom subclass type.&lt;br /&gt;
* '''Add a &amp;quot;Document&amp;quot; menu''': Drag a Document menu from the palette onto your main menu. This already has the proper outlet and action linkage for each relevant message to be directed to NSFirst. Generic messages (such as openDocument:, not associated with any document instance) are forwarded to the shared instance of NSDocumentController (see it's reference documentation). When a document is active, more specific messages (such as close: or saveDocument:) are forwarded to the relevant document instance of your NSDocument subclass.&lt;br /&gt;
* '''[Optional] Add other menus''': Add any appropriate menus such as &amp;quot;Info&amp;quot; and &amp;quot;Format&amp;quot; which may be relevant to your application.&lt;br /&gt;
&lt;br /&gt;
==== Document Interface File(s) ====&lt;br /&gt;
&lt;br /&gt;
The document interface file is a window containing the view(s) required for the implementation of one instance of your document type. For example, in the case of a TextDocument type, a window instance with a NSTextView drawn on it is used for each document window. This interface file is instantiated every time a person creates a new document (the newDocument: message is sent to NSDocumentController) or opens an existing document (openDocument:).&lt;br /&gt;
&lt;br /&gt;
You will need to:&lt;br /&gt;
* '''Subclass NSDocument''' with your document type in Gorm. This is done in a couple of ways, see [[Gorm_Manual#Custom_classes|custom classes]]. It is up to you whether or not you let Gorm generate the class files, but make sure you add the appropriate outlets to your class in the source files (otherwise, I think your your program may segfault).&lt;br /&gt;
* '''Set NSOwner:''' Set your subclass as NSOwner's Custom class using the Property Inspector. ''DO NOT INSTANTIATE IT.''&lt;br /&gt;
&lt;br /&gt;
Another thing that you may want to consider is custom outlets. If you place certain views or controls on your window (including the window itself), you may want to refer to them directly in your code, e.g. the NSTextView in our TextEdit example is accessed directly, so that we can save it's contents to a file. To enable this, we add outlets to our class (see [[Gorm_Manual#Custom_classes|custom classes]]). We then connect NSOwner to the appropriate controls/views, and select the outlets in the Connections Property Inspector (see [[Gorm_Manual#Editing_the_interface|editing the interface]]).&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
Various things need to be done at a code level, to ensure that your NSDocument subclass is properly instantiated. This section aims to tell you what is necessary.&lt;br /&gt;
&lt;br /&gt;
=== NSDocument subclass ===&lt;br /&gt;
&lt;br /&gt;
When creating your subclass, you may have chosen to have Gorm create the class files. If not, you should create two files for your subclass: a header (.h) file and an implementation file (.m). The header file should take the following layout (we're using the TextEdit example again):&lt;br /&gt;
&lt;br /&gt;
 #ifndef TEXTDOCUMENT_H&lt;br /&gt;
 #define TEXTDOCUMENT_H &amp;lt;br&amp;gt;&lt;br /&gt;
 #include &amp;lt;AppKit/AppKit.h&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
 @class NSDocument; &amp;lt;br&amp;gt;&lt;br /&gt;
 /* The document type string, as specified in the property list [[#The_application_dictionary|NSTypes array]] */ &amp;lt;br&amp;gt;&lt;br /&gt;
 NSString * GSTextDocumentType = &amp;quot;GSTextDocumentType&amp;quot;;&lt;br /&gt;
 @interface TextDocument : NSDocument&lt;br /&gt;
 {&lt;br /&gt;
 @protected&lt;br /&gt;
     /* Outlets we added in our Gorm nib file */&lt;br /&gt;
     id * textView;&lt;br /&gt;
 }&lt;br /&gt;
 /* Basic methods used for loading and saving document data (respectively). */&lt;br /&gt;
 - (BOOL) loadDataRepresentation:(NSData*)representation ofType:(NSString*)type;&lt;br /&gt;
 - (NSData*) dataRepresentationOfType: (NSString*)type; &amp;lt;br&amp;gt;&lt;br /&gt;
 /* Information and events handling of GUI related changes */&lt;br /&gt;
 - (NSString*) windowNibName;&lt;br /&gt;
 - (void) windowControllerDidLoadNib:(NSWindowController*)windowController; &amp;lt;br&amp;gt;&lt;br /&gt;
 @end&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firstly, take note that we inherit from NSDocument. As a result, we need to override some methods for a basic (but working) implementation. &lt;br /&gt;
&lt;br /&gt;
==== loadDataRepresentation:ofType: and dataRepresentationOfType: ====&lt;br /&gt;
&lt;br /&gt;
The methods, loadDataRepresent:ofType: and dataRepresentationOfType: are used by NSDocumentController to load and save our files. The first method is called when the user trys to open a document (NSDocumentController gets the file name and copies it's data using an open panel). The method is passed the raw data in this file, as well as a string representing its type. It is important to note that this type string is the same one used in your property list. It is used by NSDocumentController to tell you what type it thinks you should open the data with. If this is not possible, or if there is an error trying to parse the data, your method returns FALSE/NO. Otherwise, you should store a local, meaningful representation of the data, which you can insert into your document window a little later (and return TRUE/YES).&lt;br /&gt;
&lt;br /&gt;
For example, in terms of the TextEdit example:&lt;br /&gt;
 - (BOOL) loadDataRepresentation:(NSData*) representation ofType:(NSString*)type&lt;br /&gt;
 {&lt;br /&gt;
    /*Check type information */&lt;br /&gt;
    if ([representation equalTo:GSTextDocumentType]==NO)&lt;br /&gt;
        return NO;&lt;br /&gt;
    /* Clean out our old representation if it still exists */&lt;br /&gt;
    if (fileContents) RELEASE(fileContents); &amp;lt;br&amp;gt;&lt;br /&gt;
    /* Allocate room for the new data, and try to initialise a string with it. */&lt;br /&gt;
    self-&amp;gt;fileContents = [NSString alloc];&lt;br /&gt;
    fileContents = [fileContents initWithBytes: [representation bytes]&lt;br /&gt;
                         length: [representation length]&lt;br /&gt;
                       encoding: NSASCIIStringEncoding]; &amp;lt;br&amp;gt;&lt;br /&gt;
    /* If this can't be done, return NO */&lt;br /&gt;
    if (!fileContents)&lt;br /&gt;
        return NO; &amp;lt;br&amp;gt;&lt;br /&gt;
    /* Otherwise, set our TextView to the string data. */&lt;br /&gt;
    [self-&amp;gt;textView setString: fileContents];&lt;br /&gt;
    return YES;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If this is not sufficient, or if your program can open the data in a more efficient manner, it may be worth looking into overriding -initWithContentsOfFile:ofType: and -initWithContentsOfURL:ofType:. Again, see the GUI manual for more details.&lt;br /&gt;
&lt;br /&gt;
dataRepresentationOfType: is used to save the data. Your method is expected to return an instance of NSData that contains what should be saved to a file, for the type specified. Again, the ''type'' variable should be checked to ensure that you can write data of that type. Return nil if the file cannot be saved as that type.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
 - (NSData*) dataRepresentationOfType:(NSString*)type&lt;br /&gt;
 {&lt;br /&gt;
     if ([type equalTo:GSTextDocumentType]==NO)&lt;br /&gt;
         return nil; &amp;lt;br&amp;gt;&lt;br /&gt;
     NSData stringData =  [[textView string] dataUsingEncoding:NSASCIIStringEncoding];  &lt;br /&gt;
     return stringData; &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If a more sophisticated save implementation is needed, consult the documentation for information on the writeTo* methods.&lt;br /&gt;
&lt;br /&gt;
==== windowNibName ====&lt;br /&gt;
&lt;br /&gt;
This method must be overriden to return the a string of the name of your nib file (without the file extension). More complex implementations will use other methods to load the interface files. TODO: information on what methods need to be overriden.&lt;br /&gt;
&lt;br /&gt;
==== windowControllerDidLoadNib: ====&lt;br /&gt;
&lt;br /&gt;
Use this method to add code that should be run as soon as ''windowController'' has been initialised. Your document may have many window controllers; each window controller taking possession of one window.&lt;br /&gt;
&lt;br /&gt;
In the TextEdit example, this method is used to copy the ''fileContents'' variable to the text view. It otherwise initialises the document window. &lt;br /&gt;
&lt;br /&gt;
Also note that you can override windowControllerWillLoadNib: to perform pre-interface loading initialisation.&lt;br /&gt;
&lt;br /&gt;
==== makeWindowControllers ====&lt;br /&gt;
&lt;br /&gt;
This is an optional method to override, which must be used if you have multiple window controllers per document. It is responsible for creating each window controller from it's interface file and then adding it to the document. Use the addWindowController: method.&lt;br /&gt;
&lt;br /&gt;
==== Other considerations ====&lt;br /&gt;
&lt;br /&gt;
* You need a way to notify NSDocument that your document has changed, so that NSDocumentController can enable the menu item to allow saving. This is done by a call to the updateChangeCount: method. For example, the TextDocument class adds itself as a delegate to the textView, for any notification of changes. It then calls updateChangeCount: in the delegate's method.&lt;br /&gt;
&lt;br /&gt;
* You may also wish to add a close: method (not the close method already in NSDocument, see below) to respond to the menu item permitting your document to close. This could perform cleanup operations before a call to [self close] is made e.g.&lt;br /&gt;
&lt;br /&gt;
 - (void) close:(id)sender /* Note this is not the method found in NSDocument (they differ by a parameter) */&lt;br /&gt;
 {&lt;br /&gt;
     [self close];&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== NSDocumentController ===&lt;br /&gt;
&lt;br /&gt;
This class can optionally be subclassed, to implement some specific functionality. For example, programs handling multiple document types may override newDocument: to create a window so that the user can select which document type to create.&lt;br /&gt;
&lt;br /&gt;
You should use separate implementation files and add the .m file to GNUmakefile.&lt;br /&gt;
&lt;br /&gt;
=== NSWindowController ===&lt;br /&gt;
&lt;br /&gt;
This class can also be optionally subclassed, to implement functionality specific to a window controller for a document type. You may need to override makeWindowControllers: in the NSDocument subclass in order to make sure your specific window controller is instantiated.&lt;br /&gt;
&lt;br /&gt;
You should use separate implemenation files and add the .m file to GNUmakefile.&lt;br /&gt;
&lt;br /&gt;
== Optional Additions ==&lt;br /&gt;
&lt;br /&gt;
=== Custom NSDocumentController and NSWindowController implementations ===&lt;br /&gt;
&lt;br /&gt;
See [[#NSWindowController|NSWindowController]] and [[#NSDocumentController|NSDocumentController]].&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Talk:Window_Maker&amp;diff=2879</id>
		<title>Talk:Window Maker</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Talk:Window_Maker&amp;diff=2879"/>
		<updated>2005-11-22T12:15:15Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Agree&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I was going to add:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;This said, questions specifically regarding Window Maker should be directed towards the developers of Window Maker (GNUstep and Window Maker collaborate, but they are separate projects). &amp;quot;&lt;br /&gt;
&lt;br /&gt;
so we don't keep getting Window Maker specific questions. What do people think?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agree - don't think this is contentious at all.&lt;br /&gt;
&lt;br /&gt;
 -Peter&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Talk:Glossary&amp;diff=2836</id>
		<title>Talk:Glossary</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Talk:Glossary&amp;diff=2836"/>
		<updated>2005-11-14T19:36:50Z</updated>

		<summary type="html">&lt;p&gt;Comrade: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There may be a call to mention both Instance and Class variables due to the fundamental different roles they play in class-instance style of object oriented programming. Additionally, they're implemented in fairly wildly different ways.&lt;br /&gt;
&amp;lt;pre&amp;gt;-Peter&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Class_variable&amp;diff=2834</id>
		<title>Class variable</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Class_variable&amp;diff=2834"/>
		<updated>2005-11-14T14:46:15Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Description of class variable analog&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Objective-C dialect which is implemented by the GNU Compiler Collection (gcc) does not explicitly support the concept, widely used in some other object-oriented languages, of class variables.&lt;br /&gt;
&lt;br /&gt;
Class variables are shared values or properties of a specific class. This is useful when encapsulating more complex class and instance behaviour which requires the class to keep track, say of numbers of instances created or other more complex behaviours.&lt;br /&gt;
&lt;br /&gt;
A way of implementing class variables is to declare static variables in the class's [[Implementation]] section, and define class accessor methods if the values need to be changed externally. Note that these statics are not true class variables and will not be inherited by subclasses, and will not be visible outside of the source file's scope.&lt;br /&gt;
&lt;br /&gt;
Compare with the concept of an [[Instance variable]].&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Instance_variable&amp;diff=2833</id>
		<title>Instance variable</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Instance_variable&amp;diff=2833"/>
		<updated>2005-11-14T14:25:47Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Clarifying that instance variables do not share values between instances&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Each instance of a class may have a local copy of one or more variables which are known as instance variables, and which may contain unique properties or values associated with that instance. These variables are not shared between instances of a class.&lt;br /&gt;
&lt;br /&gt;
Instance variables are declared in the class's [[Interface]] and become part of any objects which are members of, or inherit from, the class.&lt;br /&gt;
&lt;br /&gt;
Instance variables are also referred to as ivars. &lt;br /&gt;
&lt;br /&gt;
Compare with the concept of a [[Class variable]].&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Event&amp;diff=2832</id>
		<title>Event</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Event&amp;diff=2832"/>
		<updated>2005-11-14T14:11:55Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Actually, keys are stroked. English is very silly, I think. Other changes to clarify and remove &amp;quot;it&amp;quot; where possible.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Events are occurrences that the system recognizes, such as mouse clicks or keystrokes.&lt;br /&gt;
&lt;br /&gt;
When an event is received by an [[application]], the [[Responder|first responder]] in the [[Responder|responder chain]] is given the chance to deal with it. If the first responder doesn't know what to do with it, the event is passed on, up the responder chain. If no responder deals with the event, it is ignored.&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Identifying_the_target_platform&amp;diff=2828</id>
		<title>Identifying the target platform</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Identifying_the_target_platform&amp;diff=2828"/>
		<updated>2005-11-10T20:23:34Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Add &amp;quot;standard&amp;quot; macros and a tip for Makefiles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A common problem is identifying the target platform at compile-time so that specific code can be used, perhaps to work around a quirk, or to access a non-standard feature of the target platform.&lt;br /&gt;
&lt;br /&gt;
== Standard compiler platform macros ==&lt;br /&gt;
&lt;br /&gt;
The following table is a partial extract of [[http://predef.sourceforge.net/preos.html Pre-defined C/C++ Compiler Macros]], part of a useful resource to compiler macro definitions. &lt;br /&gt;
&lt;br /&gt;
Please update the table carefully with your platform or corrections:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
|+Platform macros&lt;br /&gt;
|-&lt;br /&gt;
! Platform !! Defined macro !! Other notes&lt;br /&gt;
|-&lt;br /&gt;
! FreeBSD&lt;br /&gt;
| __FreeBSD__ || Consider using the BSD macro&lt;br /&gt;
|-&lt;br /&gt;
! Linux&lt;br /&gt;
| linux or __linux || &lt;br /&gt;
|-&lt;br /&gt;
! MacOS X&lt;br /&gt;
| __MACOSX__ or __APPLE__ || &lt;br /&gt;
|-&lt;br /&gt;
! NetBSD&lt;br /&gt;
| __NetBSD__ || Consider using the BSD macro&lt;br /&gt;
|-&lt;br /&gt;
! OpenBSD&lt;br /&gt;
| __OpenBSD__ || Consider using the BSD macro&lt;br /&gt;
|-&lt;br /&gt;
! Solaris&lt;br /&gt;
| sun or __sun || SunOS versions &amp;amp;lt; 5 will not have __SVR4 or __svr4__ defined&lt;br /&gt;
|-&lt;br /&gt;
! Windows&lt;br /&gt;
| _WIN32 or __WIN32__ || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You can use #if wrappers like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#if defined (__FreeBSD__)&lt;br /&gt;
...&lt;br /&gt;
#elif defined (__linux) || defined (linux)&lt;br /&gt;
...&lt;br /&gt;
#else&lt;br /&gt;
...&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using GNUStep-Make's support ==&lt;br /&gt;
&lt;br /&gt;
Chris Vetter shared a tip on the use of your GNUmakefile.preamble with the following line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ADDITIONAL_OBJCFLAGS += -D$(GNUSTEP_HOST_OS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and then the #if wrappers will look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#if defined (freebsd)&lt;br /&gt;
...&lt;br /&gt;
#elif defined (netbsdelf)&lt;br /&gt;
...&lt;br /&gt;
#else&lt;br /&gt;
...&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Snippets&amp;diff=2827</id>
		<title>Snippets</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Snippets&amp;diff=2827"/>
		<updated>2005-11-10T19:44:52Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Add a snippet to help identify the target platform&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page links to sample code and snippets with tips &amp;amp; tricks.&lt;br /&gt;
&lt;br /&gt;
== Objective-C and OOP Concepts ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Foundation Kit ==&lt;br /&gt;
* [[NSArray]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application Kit ==&lt;br /&gt;
* [[NSDocument]]&lt;br /&gt;
* [[NSTableView]]&lt;br /&gt;
* [[NSTextField]]&lt;br /&gt;
* [[NSView]]&lt;br /&gt;
&lt;br /&gt;
== Makefiles and compiler environment ==&lt;br /&gt;
* [[Identifying the target platform]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Main_Page&amp;diff=1060</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Main_Page&amp;diff=1060"/>
		<updated>2005-09-06T21:18:44Z</updated>

		<summary type="html">&lt;p&gt;Comrade: DeSPAM. Sigh.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| style=&amp;quot;border:1px solid black; background-color:lavender; padding:10pt;&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
| '''GNUstep''' is a [[Portability|cross-platform]], object-oriented set of [[Frameworks|frameworks]] for desktop application [[Development tools|development]]. The set of frameworks, based on [[OpenStep]] (now [[Cocoa]]), enables developers to rapidly build sophisticated software by employing a large library of reusable software components. GNUstep is already used [[GNUstep in production|in production]] environments at several organizations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== About GNUstep ==&lt;br /&gt;
&lt;br /&gt;
'''[http://www.gnustep.org GNUstep home page]'''&lt;br /&gt;
&lt;br /&gt;
[[Blogs]] - Blogs concerning GNUstep&lt;br /&gt;
&lt;br /&gt;
[[Project development|Contact and Project development]]&lt;br /&gt;
&lt;br /&gt;
[[Architecture]]&lt;br /&gt;
&lt;br /&gt;
[[FAQ]]&lt;br /&gt;
&lt;br /&gt;
[[Application News ]]&lt;br /&gt;
&lt;br /&gt;
== Users ==&lt;br /&gt;
[[GNUstep_Installation_Process|GNUstep Installation Process]]&lt;br /&gt;
&lt;br /&gt;
[[Internationalisation]]&lt;br /&gt;
&lt;br /&gt;
[[GNUstep environments]]&lt;br /&gt;
&lt;br /&gt;
[[Wish list]]&lt;br /&gt;
&lt;br /&gt;
[[Artworks]]&lt;br /&gt;
&lt;br /&gt;
== Developers ==&lt;br /&gt;
&lt;br /&gt;
[[Development Subprojects]] ([[Themability]], [[Portability]], [[Package management]], [[I18n]], ...)&lt;br /&gt;
&lt;br /&gt;
[[Development tools]]&lt;br /&gt;
&lt;br /&gt;
[[Applications]]&lt;br /&gt;
&lt;br /&gt;
[[Frameworks]]&lt;br /&gt;
&lt;br /&gt;
[[Installation process]]&lt;br /&gt;
&lt;br /&gt;
[[Scripting]]&lt;br /&gt;
&lt;br /&gt;
[[Programming topics]] and [[Snippets]]&lt;br /&gt;
&lt;br /&gt;
== [[Glossary]] ==&lt;br /&gt;
&lt;br /&gt;
== About Wiki ==&lt;br /&gt;
&lt;br /&gt;
[http://www.possibility.com/epowiki/Wiki.jsp?page=HowToOrganizeWiki How To Organize Wiki]&lt;br /&gt;
&lt;br /&gt;
[http://meta.wikimedia.org/wiki/MediaWiki_development Wiki Dev Doc]&lt;br /&gt;
&lt;br /&gt;
[http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide User'sGuide]&lt;br /&gt;
&lt;br /&gt;
[http://meta.wikimedia.org/wiki/MediaWiki_FAQ FAQ]&lt;br /&gt;
&lt;br /&gt;
[http://wikipedia.sourceforge.net WikiPedia]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Deployment_on_Windows&amp;diff=2044</id>
		<title>Deployment on Windows</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Deployment_on_Windows&amp;diff=2044"/>
		<updated>2005-07-16T14:02:03Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Language cleanup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Preparation of your MinGW GNUstep environment==&lt;br /&gt;
&lt;br /&gt;
These directions seem to work but have been tested only on Lloyd Dupont's development machine so far - this has yet to be tested on a test machine without anything installed. (Please update this once someone's tested this!)&lt;br /&gt;
&lt;br /&gt;
First-off, it is recommended you build GNUstep from CVS yourself using [http://www.gnustep.org/resources/documentation/User/GNUstep/README.MinGW the MinGW README] or following the instructions for [[Installation on Windows]].&lt;br /&gt;
&lt;br /&gt;
It's a relatively long but painless process.&lt;br /&gt;
&lt;br /&gt;
Note: the installer &amp;quot;GNUstep-base-1.10.1-gui-0.9.4.exe&amp;quot; contains slightly buggy DLLs - please use a current CVS version!&lt;br /&gt;
&lt;br /&gt;
==Making sure that DLLs are available to your application==&lt;br /&gt;
&lt;br /&gt;
Once GNUstep is built, you'll need to do three things to deploy your application:&lt;br /&gt;
&lt;br /&gt;
1. Make sure that all the dependency DLLs that are installed in the MinGW GNUstep environment are in your application's directory or in the PATH (see [[Installation on Windows]] step 11 and 14: libintl, libiconv, etc) &lt;br /&gt;
&lt;br /&gt;
2. Make sure that all the DLLs in &amp;lt;GNUstep&amp;gt;/System/Tools are in your application's directory or in the PATH&lt;br /&gt;
&lt;br /&gt;
3. The content of &amp;lt;GNUstep&amp;gt;/System directory (with the exception of &amp;lt;GNUstep&amp;gt;/System/Tools) should be pointed to by one of the following environment variables:&lt;br /&gt;
&lt;br /&gt;
  GNUSTEP_SYSTEM_ROOT&lt;br /&gt;
  GNUSTEP_NETWORK_ROOT&lt;br /&gt;
  GNUSTEP_LOCAL_ROOT&lt;br /&gt;
&lt;br /&gt;
Hint: make all three variables point to the same directory to avoid all suprises. You don't need System/Tools in these as you have already copied the DLLs.&lt;br /&gt;
&lt;br /&gt;
The three variables are intended to support a more complex GNUstep environment than you may need for a single application deployement.&lt;br /&gt;
&lt;br /&gt;
If you don't want to mess with system environment variables or want to have multiple (side by side) installations, you could set these variables at application startup time with:&lt;br /&gt;
&lt;br /&gt;
  [NSProcessInfo initializeWithArguments: __argv&lt;br /&gt;
                                   count: __ argc&lt;br /&gt;
                             environment: (char**){&lt;br /&gt;
    &amp;quot;GNUSTEP_SYSTEM_ROOT=C:\AppLocalGSPath&amp;quot;,&lt;br /&gt;
    &amp;quot;GNUSTEP_NETWORK_ROOT=C:\AppLocalGSPath&amp;quot;,&lt;br /&gt;
    &amp;quot;GNUSTEP_LOCAL_ROOT=C:\AppLocalGSPath&amp;quot;,&lt;br /&gt;
    NULL} ];&lt;br /&gt;
&lt;br /&gt;
It is important to call this method early before any other part of the application triggers caching of incorrect GNUstep environment variables.&lt;br /&gt;
&lt;br /&gt;
Warning: simply using putenv might fail if, for some reason, the class NSProcessInfo has already been initialized - it will have cached the environment variables.&lt;br /&gt;
&lt;br /&gt;
Voila! Your GNUstep-based application can now be shipped without the user having to know about or install GNUstep - and you don't have the risk of an untested version of GNUstep being loaded by your application either.&lt;br /&gt;
&lt;br /&gt;
Happy GSCoding ;-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''based on a mail from Lloyd Dupont''&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=User:Aa&amp;diff=2014</id>
		<title>User:Aa</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=User:Aa&amp;diff=2014"/>
		<updated>2005-07-11T14:33:42Z</updated>

		<summary type="html">&lt;p&gt;Comrade: This user is some kind of spammer, can it be blocked?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This user is some kind of spammer, can it be blocked?&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=DBModeler&amp;diff=2013</id>
		<title>DBModeler</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=DBModeler&amp;diff=2013"/>
		<updated>2005-07-10T07:49:40Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Create DBModeler application page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About DBModeler.app ==&lt;br /&gt;
&lt;br /&gt;
DBModeler.app is based loosely on EOModeller.app and is used to create EOModels - definitions of mappings between the tables, columns and rows of a relational database to objects within a GNUstep program that uses GDL2 (GNUstep's EOF implementation). &lt;br /&gt;
&lt;br /&gt;
Existing EOModels may be opened and modified, new ones may be created manually, or even &amp;quot;reverse-engineered&amp;quot; from an existing database if DBModeler is able to connect to an existing database.&lt;br /&gt;
&lt;br /&gt;
The resulting EOModels can be used to allow simple database connectivity in GNUstep applications, tools, or within GNUstep Web applications without significant additional coding effort.&lt;br /&gt;
&lt;br /&gt;
== Current status ==&lt;br /&gt;
&lt;br /&gt;
GDL2 contains DBModeler.app in CVS. It is currently functional for basic EOModel creation, and new features are still being added. &lt;br /&gt;
&lt;br /&gt;
[[Image:DBModeler-snapshot.png|Snapshot of DBModeler.app in operation]]&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
* probably a few ;-)&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=File:DBModeler-snapshot.png&amp;diff=2012</id>
		<title>File:DBModeler-snapshot.png</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=File:DBModeler-snapshot.png&amp;diff=2012"/>
		<updated>2005-07-10T07:46:41Z</updated>

		<summary type="html">&lt;p&gt;Comrade: DBModeler.app in operation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DBModeler.app in operation&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Application_wish_list&amp;diff=870</id>
		<title>Application wish list</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Application_wish_list&amp;diff=870"/>
		<updated>2005-07-09T23:08:45Z</updated>

		<summary type="html">&lt;p&gt;Comrade: /* DatabaseModeller.app */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What applications do you want for GNUstep? Add below:&lt;br /&gt;
(Please check [All GNUstep Applications] before adding)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Old NeXTSTEP/OPENSTEP apps: http://www.levenez.com/NeXTSTEP/meApps.html&lt;br /&gt;
&lt;br /&gt;
__Frontend for different platform to www.granddictionnaire.com__&lt;br /&gt;
&lt;br /&gt;
-------------------------------&lt;br /&gt;
&lt;br /&gt;
== Keyboard switcher application ==&lt;br /&gt;
&lt;br /&gt;
== Web browser ==&lt;br /&gt;
&lt;br /&gt;
Seems to be a popular request :).&lt;br /&gt;
&lt;br /&gt;
* Could [http://www.mozilla.org/projects/camino/ Camino] (formerly known as Chimera) be the one (after backporting)?&lt;br /&gt;
* [http://www.apple.com/safari/ Apple's Safari] web browser uses KHTML and KJS software from the KDE open source project, updated and re-released [http://developer.apple.com/darwin/projects/webcore/index.html here], but needs Objective-C++ support in GCC.&lt;br /&gt;
-- Hasan --&lt;br /&gt;
&lt;br /&gt;
* I could port [http://ibn.com/~hdiwan/orchidWeb.html OrchidWeb] to GNUStep. I'd just need enough examples on developing the views from code to {do it.&lt;br /&gt;
Apparently, camino is written in Objective-C++, which GCC can't compile (although Apple is supposed to have contibuted the patch). Until gcc can compile mixed obj-c and c++, it can't be ported. There is a thread about this at [http://linuxfr.org/2003/03/10/11647.html] (it's in french).&lt;br /&gt;
* This seems very close... Stefan has began porting [http://mac.wms-network.de/gnustep/WebCore/blog/ Webcore to GNUstep]. Still some way to go, but a great breaktrough. This seems to be the most probable answer to the web browser request.&lt;br /&gt;
&lt;br /&gt;
== Project Management app ==&lt;br /&gt;
&lt;br /&gt;
Something like [http://mrproject.codefactory.se/screenshots.php MrProject]. It has to be simple, not overbloated as MS Project.&lt;br /&gt;
&lt;br /&gt;
== Google.app ==&lt;br /&gt;
&lt;br /&gt;
* Complete with ApplicationServices&lt;br /&gt;
* WebBrowser integration&lt;br /&gt;
* Using proper NS* classes for HTML retrieval&lt;br /&gt;
* Ability to select which Google server (www.google.ca, www.google.co.jp)&lt;br /&gt;
* Google News, Google Groups, Google Images too.&lt;br /&gt;
&lt;br /&gt;
== DMG.app? ==&lt;br /&gt;
&lt;br /&gt;
* Installer/extractor/viewer for DMG images.&lt;br /&gt;
* Create DMG packages&lt;br /&gt;
* Useful for OSX source packages&lt;br /&gt;
&lt;br /&gt;
''Note:'' The DMG format is Apple proprietary and undocumented. Basically, DMG support is only available under OSX and its unlikely to change.&lt;br /&gt;
&lt;br /&gt;
== Blender ==&lt;br /&gt;
&lt;br /&gt;
Blender has recently (since October 2002) gone GPL. Consisting of porting the Blender GUI/WM abstract library GHOST, using NSOpenGLContext, or a CoreGraphics implementation one day. Objective-C++ might be needed for implementing GHOST, but probably can be worked around easily enough. There is an OSX port, probably using CoreGraphics.&lt;br /&gt;
&lt;br /&gt;
[http://www.blender.org/ Blender Foundation Homepage]&lt;br /&gt;
&lt;br /&gt;
Most of Blender is written in C++ doesn't seem to use CoreGraphics but Apple's GL.&lt;br /&gt;
&lt;br /&gt;
== CSS/html editor ==&lt;br /&gt;
&lt;br /&gt;
A cool html/css editor - emphasis on the css structural side.&lt;br /&gt;
&lt;br /&gt;
Object oriented properties application to CSS element definitions, and insert those properties into HTML in web pages. Don't worry about WYSIWIG - that's what web browsers are for, displaying web pages. Just make a object-oriented CSS/HTML editor.&lt;br /&gt;
&lt;br /&gt;
Maybe port [http://www.w3.org/People/Berners-Lee/WorldWideWeb.html Nexus] for that?&lt;br /&gt;
&lt;br /&gt;
== OmniGraffle clone ==&lt;br /&gt;
&lt;br /&gt;
(I don't really know what this is, but people have said they want one. Someone please add a description! :)&lt;br /&gt;
&lt;br /&gt;
This is for diagram, UML ....&lt;br /&gt;
I 'm thinking to write it. But not *right now*.&lt;br /&gt;
It will have probably a Gorm-feel&lt;br /&gt;
&lt;br /&gt;
[http://www.omnigroup.com/applications/omnigraffle/ OmniGraffle] was a clone of Lighthouse Design's Diagram.app, which was a re-working of the NeXT Developer Example Sketch.app, adding rubber-banding / angular connection lines.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== OmniOutliner clone ==&lt;br /&gt;
&lt;br /&gt;
This is a really cool app which can be used for anything. Mostly i think it is used to organise your minds while being creative (some kind of knowledge manager).&lt;br /&gt;
&lt;br /&gt;
The inspiration for this was Jayson Adams' Millennium Software's NoteBook.app, which lives again as the (commercial) program [http://www.aquaminds.com/ NoteTaker].&lt;br /&gt;
&lt;br /&gt;
== A text editor ==&lt;br /&gt;
&lt;br /&gt;
A simple text editor that can read and write plain or rich text, including both simple word processing functionality (nothing too splashy, like frames) and optional programming features (like syntax highlighting -- not just coloring; controllable tabs; tab v. space indentation, multiple language support). Programming features could be provided by a bundle, but it would be good to for the app to be designed with that bundle in mind.&lt;br /&gt;
&lt;br /&gt;
This editor which is to guarantee me world domination includes a split view where the other pane locates and displays the corresponding end-tag/start-tag when programming.&lt;br /&gt;
&lt;br /&gt;
Ink is not that editor. :)&lt;br /&gt;
&lt;br /&gt;
[http://www.softpanorama.org/Editors/index.shtml Softpanorama] seems to give a good overview of editors&lt;br /&gt;
&lt;br /&gt;
''We have to distinguish between a text editor as programming tool (CodeEditor.app) and a text editor as a word processor (WordProcessor.app?). '' They are two different approaches to text editing and text processing.&lt;br /&gt;
&lt;br /&gt;
Source code editing view and associated inspector panels and preferences should be provided as a framework, so the SourceView should be reused in other apps. CodeEditor should be only some default wrapper for that framework.&lt;br /&gt;
&lt;br /&gt;
WordProcessor.app sould be an application that extends NSText system. (With easy-to-use paragraph style editing)&lt;br /&gt;
&lt;br /&gt;
How about interfacing with [http://www.scintilla.org Scintilla]?&lt;br /&gt;
-- Hasan --&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A simple DTP application ==&lt;br /&gt;
&lt;br /&gt;
A simple frame-based application for desktop publishing. Something like [http://www.calamus.net/ Calamus] ([http://www.calamus.net/man/index_us.htm here] is the documentation of tools and modules). Nothing fancy, just application that can lay out frames, control text flow, use paragraph styles and master pages.&lt;br /&gt;
&lt;br /&gt;
I'd rather see TeXView.app come back myself.... I think it's far more feasible (doing a decent page layout app is _hard_ just as Donald E. Knuth). Perhaps better still would be to take advantage of LyX's ``GUI-independence'' and provide a GNUstep front-end for it, http://www.lyx.org .&lt;br /&gt;
&lt;br /&gt;
No, nothing like LyX or TeX. I have in mind a ''visual'' page layout editing tool with features as described above (similar to PageMaker). LyX and TeX are a bit different approaches and should be alternatives to Frame based DTP application.&lt;br /&gt;
&lt;br /&gt;
 - Stefan&lt;br /&gt;
&lt;br /&gt;
I think a heavy-weight drawing package w/ page layout features would be a better solution here (this is the workflow I'm using on my NeXT Cube now), then it could be tied into an XML-based workflow in a fashion like to Apple's new Keynote, perhaps in a fashion like to Pages-by-Pages. To describe my workflow a bit---I now use Altsys Virtuoso on my NeXT Cube w/ Omega (Unicode-aware TeX variant) for most of my page layout. IME, if a document gets too large to manage w/ Altsys Virtuoso, it might as well go into TeX... Not that I'd mind seeing a replacement for PasteUp.app, I just think that a drawing program is more immediately important / useful.&lt;br /&gt;
&lt;br /&gt;
For simple DTP utility, I'd dearly love to see a re-creation of [http://members.aol.com/willadams/gnustep/apps/type/touchtype.html TouchType.app]&lt;br /&gt;
&lt;br /&gt;
 - William&lt;br /&gt;
&lt;br /&gt;
Maybe you should take a look at [http://www.texmacs.org/ TeXmacs]. Looks promising and is in great need of a GNUstep frontend.&lt;br /&gt;
&lt;br /&gt;
 - david.&lt;br /&gt;
&lt;br /&gt;
Interesting. I'd seen TeXMacs mentioned on comp.text.tex quite often, but hadn't realized it had gotten as far as it had. Interesting counterpoint to LyX.&lt;br /&gt;
 - William&lt;br /&gt;
&lt;br /&gt;
One really interesting thing would be to have a fame class which would useful enough so it could be used to put together a simple DTP Application but which would be flexible enough that it could be available to any application - the text control is a standard control for windows managers like MS Windows or Gnome. If there were an equivalent &amp;quot;flowing graphic control&amp;quot;, you'd have a powerful building block indeed (note that in MS windows, the text control is actually poor enough that no credible application can built around besides notepad).&lt;br /&gt;
Also, for a programming text editor, scintilla is great. One thing to consider is that for DTP/HTML editor, what you would want would be a *superset* of the scintilla interface. It would be great to add all the different features in such a way that you didn't have interfaces duplicating each other's functionalities.&lt;br /&gt;
&lt;br /&gt;
-- JosephSolbrig&lt;br /&gt;
&lt;br /&gt;
== Painting app (photoshop) ==&lt;br /&gt;
&lt;br /&gt;
Bitmap drawing app.&lt;br /&gt;
&lt;br /&gt;
Think Photoshop, not Gimp&lt;br /&gt;
&lt;br /&gt;
In fact, forget that. Something new.&lt;br /&gt;
&lt;br /&gt;
Something usable - can do Photoshop, but easy to learn. The Gimp can nearly do photoshop, but who can use it?&lt;br /&gt;
&lt;br /&gt;
It would be great if it consisted of two parts - a very small very useful image viewer/manager (eg gqview) and the actual editor plugin (the big part). So installing image-core would give a very small useful app, then adding image-edit would make it into photoshop.&lt;br /&gt;
&lt;br /&gt;
When opening an image file eg by clicking on it or running image-core thefile.jpg then only the core apps should start, so it starts real quick. If i right-click and choose edit or something .. THEN the other stuff is pulled in.&lt;br /&gt;
&lt;br /&gt;
Or whatever. Just an idea. But makes development path cool. Could also have a vector plugin, or whatever.&lt;br /&gt;
&lt;br /&gt;
Maybe we should wait, when (if?) gimp gets 'gegl'ed (http://gegl.org).&lt;br /&gt;
then having a decent photoshop like app would be as simple as writing a gui for the gegl foundation.&lt;br /&gt;
+ gives us a nice featureset + plugins!&lt;br /&gt;
&lt;br /&gt;
Maliwan project is aiming to achieve the same goal of GEGL. Right now GEGL isn't even half complete but we can still reimplement it base on GEGL's design. lastlife is waiting for you in irc if you want to discuss the idea. Maliwan is planned to be the heart of the BluTulip which is the actual application.&lt;br /&gt;
&lt;br /&gt;
== Calendar ==&lt;br /&gt;
&lt;br /&gt;
check  SKYRIX libs (Opengroupware).&lt;br /&gt;
 http://www.opengroupware.org/cvsweb/cvsweb.cgi/OpenGroupware.org/SOPE/skyrix-core/NGiCal/&lt;br /&gt;
&lt;br /&gt;
== CVS app ==&lt;br /&gt;
&lt;br /&gt;
Port CVL&lt;br /&gt;
&lt;br /&gt;
== Task management app ==&lt;br /&gt;
&lt;br /&gt;
Chronographer (lobbying by ludovic) + libical&lt;br /&gt;
or&lt;br /&gt;
~TaskManager (lobbying by Fabien) + libical&lt;br /&gt;
&lt;br /&gt;
Check SKYRIX libs (Opengroupware)&lt;br /&gt;
&lt;br /&gt;
== ICQ ==&lt;br /&gt;
&lt;br /&gt;
and other instant messengers.&lt;br /&gt;
check http://freshmeat.net/projects/fireapp/&lt;br /&gt;
&lt;br /&gt;
== DatabaseModeller.app ==&lt;br /&gt;
&lt;br /&gt;
See [[DBModeler]], currently a work in progress.&lt;br /&gt;
&lt;br /&gt;
== Database management ==&lt;br /&gt;
&lt;br /&gt;
A desktop software (Like [http://www.flex.ro/pgaccess/ PgAccess] for example) to manage database. This program could use the GDL2 (Gnustep Database Library). It could be a good exercice and demonstration of this very good library.&lt;br /&gt;
&lt;br /&gt;
== Video conferencing software ==&lt;br /&gt;
&lt;br /&gt;
There's [http://www.gnomemeeting.org/ Gnomemeeting] (excellent piece of software), but I don't like Gnome too much (all those dependencies).&lt;br /&gt;
&lt;br /&gt;
Update: Gnomemeeting 0.9.6 is supposed to work without Gnome libs (limited functionality).&lt;br /&gt;
&lt;br /&gt;
== CronniX - A cron front end ==&lt;br /&gt;
&lt;br /&gt;
http://www.koch-schmidt.de/cronnix/&lt;br /&gt;
&lt;br /&gt;
That won't be easily portable, as different OSs use a different cron setup. Eg. BSD has (and uses) both, /etc/crontab __and__ /var/cron/tabs/&amp;lt;username&amp;gt; ...&lt;br /&gt;
&lt;br /&gt;
== PfaEdit - A font editor ==&lt;br /&gt;
&lt;br /&gt;
(This is now called FontForge)&lt;br /&gt;
&lt;br /&gt;
http://pfaedit.sourceforge.net&lt;br /&gt;
&lt;br /&gt;
Actually, Cenon (see above) is able to do some limited font editing. Not to knock pfaedit, I use it a lot and think it's a way cool program. Wonder if the two could be merged somehow.&lt;br /&gt;
&lt;br /&gt;
== GuileServices / StepTalk Services ==&lt;br /&gt;
&lt;br /&gt;
On NeXTSTEP there was an application (service?) called [TickleServices|http://www.doubleu.com/TickleServices.html] that allowed you to write your own services in the Tcl language. Something along these lines, but using guile/steptalk would be a nice addition to gnustep.&lt;br /&gt;
&lt;br /&gt;
== Printer.app ==&lt;br /&gt;
&lt;br /&gt;
An application/framework for managing printers, printer properties and print queues. (CUPS frontend?)&lt;br /&gt;
&lt;br /&gt;
== DivX/XViD/DVD/VCD Player ==&lt;br /&gt;
&lt;br /&gt;
I see that there was at least an attempt to port mplayer at one point but it seems to be dead. Maybe VLC (http://www.videolan.org/) which does have an OSX version, could be ported.&lt;br /&gt;
&lt;br /&gt;
== Abiword (Word Processor) ==&lt;br /&gt;
&lt;br /&gt;
A port of the Cocoa version of [AbiWord|http://www.abisource.com] would be great, considering a word processor is a pretty vital application, and that Abiword is a pretty good one.&lt;br /&gt;
&lt;br /&gt;
== Spreadsheet ==&lt;br /&gt;
&lt;br /&gt;
A spreadsheet application would be great for GNUstep.  A clone of Lotus Improv or Lighthouse Design's Parasheet would be a nice thing for GNUstep to have.&lt;br /&gt;
&lt;br /&gt;
== Pixen (Pixel Art Tool) ==&lt;br /&gt;
&lt;br /&gt;
[Pixen|http://www.opensword.org] is a decent, open source pixel art tool and there aren't alot of free or professional programs like it. There is also a compliment tool by the same guys for mapping called Reptile.&lt;br /&gt;
&lt;br /&gt;
We're working on a GNUstep port now, in fact.&lt;br /&gt;
&lt;br /&gt;
== Growl! (Global notification system) ==&lt;br /&gt;
&lt;br /&gt;
[http://growl.info/ Growl!] uses distributed notification center to display a graphic message on screen. Every application can send messages to it, for example, when new emails arrive, buddies sign in the instant messager, a task end, etc. It is very easy to implement.&lt;br /&gt;
&lt;br /&gt;
== Digital Librarian-like ==&lt;br /&gt;
&lt;br /&gt;
I would really, really like a Digital Librarian for GNUstep. Basically, imagine an application that manage your documents the same way iTunes manage your music or iPhoto your photos... (to take well-known OSX apps as example ;-)&lt;br /&gt;
&lt;br /&gt;
It would provide 1) automatic management of the documents by projects/ideas/whatever metadata 2) index your documents to let you search quickly in it 3) handles bibliography&lt;br /&gt;
As a postgrad student I have a LOT of articles in PDF/PS/DVI/html on my hard drive, and such an application would be really nice to help managing that.&lt;br /&gt;
&lt;br /&gt;
A Digital Librarian screenshot: http://www.levenez.com/NeXTSTEP/Librarian.jpg&lt;br /&gt;
A screenshot of Vertex Librarian, a similar program for NeXTSTEP: http://www.levenez.com/NeXTSTEP/VertexLibrarian.jpg&lt;br /&gt;
&lt;br /&gt;
== nib2gmodel/nib2gorm without OPENSTEP/MacOSX ==&lt;br /&gt;
&lt;br /&gt;
I want;but I heard it is so hard to implementation. :-(&lt;br /&gt;
&lt;br /&gt;
== iTunes/Rhythmbox clone ==&lt;br /&gt;
&lt;br /&gt;
It would be nice to see a music or video player with real music/media management like [http://www.gnome.org/projects/rhythmbox/ Rhythmbox] or [http://www.apple.com/itunes/ iTunes]. iTunes has started to support management of movies and videoclips, so maybe media management is the way to go?&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Application_wish_list&amp;diff=848</id>
		<title>Application wish list</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Application_wish_list&amp;diff=848"/>
		<updated>2005-07-09T23:07:51Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Updated to reference DBModeler.app&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What applications do you want for GNUstep? Add below:&lt;br /&gt;
(Please check [All GNUstep Applications] before adding)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Old NeXTSTEP/OPENSTEP apps: http://www.levenez.com/NeXTSTEP/meApps.html&lt;br /&gt;
&lt;br /&gt;
__Frontend for different platform to www.granddictionnaire.com__&lt;br /&gt;
&lt;br /&gt;
-------------------------------&lt;br /&gt;
&lt;br /&gt;
== Keyboard switcher application ==&lt;br /&gt;
&lt;br /&gt;
== Web browser ==&lt;br /&gt;
&lt;br /&gt;
Seems to be a popular request :).&lt;br /&gt;
&lt;br /&gt;
* Could [http://www.mozilla.org/projects/camino/ Camino] (formerly known as Chimera) be the one (after backporting)?&lt;br /&gt;
* [http://www.apple.com/safari/ Apple's Safari] web browser uses KHTML and KJS software from the KDE open source project, updated and re-released [http://developer.apple.com/darwin/projects/webcore/index.html here], but needs Objective-C++ support in GCC.&lt;br /&gt;
-- Hasan --&lt;br /&gt;
&lt;br /&gt;
* I could port [http://ibn.com/~hdiwan/orchidWeb.html OrchidWeb] to GNUStep. I'd just need enough examples on developing the views from code to {do it.&lt;br /&gt;
Apparently, camino is written in Objective-C++, which GCC can't compile (although Apple is supposed to have contibuted the patch). Until gcc can compile mixed obj-c and c++, it can't be ported. There is a thread about this at [http://linuxfr.org/2003/03/10/11647.html] (it's in french).&lt;br /&gt;
* This seems very close... Stefan has began porting [http://mac.wms-network.de/gnustep/WebCore/blog/ Webcore to GNUstep]. Still some way to go, but a great breaktrough. This seems to be the most probable answer to the web browser request.&lt;br /&gt;
&lt;br /&gt;
== Project Management app ==&lt;br /&gt;
&lt;br /&gt;
Something like [http://mrproject.codefactory.se/screenshots.php MrProject]. It has to be simple, not overbloated as MS Project.&lt;br /&gt;
&lt;br /&gt;
== Google.app ==&lt;br /&gt;
&lt;br /&gt;
* Complete with ApplicationServices&lt;br /&gt;
* WebBrowser integration&lt;br /&gt;
* Using proper NS* classes for HTML retrieval&lt;br /&gt;
* Ability to select which Google server (www.google.ca, www.google.co.jp)&lt;br /&gt;
* Google News, Google Groups, Google Images too.&lt;br /&gt;
&lt;br /&gt;
== DMG.app? ==&lt;br /&gt;
&lt;br /&gt;
* Installer/extractor/viewer for DMG images.&lt;br /&gt;
* Create DMG packages&lt;br /&gt;
* Useful for OSX source packages&lt;br /&gt;
&lt;br /&gt;
''Note:'' The DMG format is Apple proprietary and undocumented. Basically, DMG support is only available under OSX and its unlikely to change.&lt;br /&gt;
&lt;br /&gt;
== Blender ==&lt;br /&gt;
&lt;br /&gt;
Blender has recently (since October 2002) gone GPL. Consisting of porting the Blender GUI/WM abstract library GHOST, using NSOpenGLContext, or a CoreGraphics implementation one day. Objective-C++ might be needed for implementing GHOST, but probably can be worked around easily enough. There is an OSX port, probably using CoreGraphics.&lt;br /&gt;
&lt;br /&gt;
[http://www.blender.org/ Blender Foundation Homepage]&lt;br /&gt;
&lt;br /&gt;
Most of Blender is written in C++ doesn't seem to use CoreGraphics but Apple's GL.&lt;br /&gt;
&lt;br /&gt;
== CSS/html editor ==&lt;br /&gt;
&lt;br /&gt;
A cool html/css editor - emphasis on the css structural side.&lt;br /&gt;
&lt;br /&gt;
Object oriented properties application to CSS element definitions, and insert those properties into HTML in web pages. Don't worry about WYSIWIG - that's what web browsers are for, displaying web pages. Just make a object-oriented CSS/HTML editor.&lt;br /&gt;
&lt;br /&gt;
Maybe port [http://www.w3.org/People/Berners-Lee/WorldWideWeb.html Nexus] for that?&lt;br /&gt;
&lt;br /&gt;
== OmniGraffle clone ==&lt;br /&gt;
&lt;br /&gt;
(I don't really know what this is, but people have said they want one. Someone please add a description! :)&lt;br /&gt;
&lt;br /&gt;
This is for diagram, UML ....&lt;br /&gt;
I 'm thinking to write it. But not *right now*.&lt;br /&gt;
It will have probably a Gorm-feel&lt;br /&gt;
&lt;br /&gt;
[http://www.omnigroup.com/applications/omnigraffle/ OmniGraffle] was a clone of Lighthouse Design's Diagram.app, which was a re-working of the NeXT Developer Example Sketch.app, adding rubber-banding / angular connection lines.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== OmniOutliner clone ==&lt;br /&gt;
&lt;br /&gt;
This is a really cool app which can be used for anything. Mostly i think it is used to organise your minds while being creative (some kind of knowledge manager).&lt;br /&gt;
&lt;br /&gt;
The inspiration for this was Jayson Adams' Millennium Software's NoteBook.app, which lives again as the (commercial) program [http://www.aquaminds.com/ NoteTaker].&lt;br /&gt;
&lt;br /&gt;
== A text editor ==&lt;br /&gt;
&lt;br /&gt;
A simple text editor that can read and write plain or rich text, including both simple word processing functionality (nothing too splashy, like frames) and optional programming features (like syntax highlighting -- not just coloring; controllable tabs; tab v. space indentation, multiple language support). Programming features could be provided by a bundle, but it would be good to for the app to be designed with that bundle in mind.&lt;br /&gt;
&lt;br /&gt;
This editor which is to guarantee me world domination includes a split view where the other pane locates and displays the corresponding end-tag/start-tag when programming.&lt;br /&gt;
&lt;br /&gt;
Ink is not that editor. :)&lt;br /&gt;
&lt;br /&gt;
[http://www.softpanorama.org/Editors/index.shtml Softpanorama] seems to give a good overview of editors&lt;br /&gt;
&lt;br /&gt;
''We have to distinguish between a text editor as programming tool (CodeEditor.app) and a text editor as a word processor (WordProcessor.app?). '' They are two different approaches to text editing and text processing.&lt;br /&gt;
&lt;br /&gt;
Source code editing view and associated inspector panels and preferences should be provided as a framework, so the SourceView should be reused in other apps. CodeEditor should be only some default wrapper for that framework.&lt;br /&gt;
&lt;br /&gt;
WordProcessor.app sould be an application that extends NSText system. (With easy-to-use paragraph style editing)&lt;br /&gt;
&lt;br /&gt;
How about interfacing with [http://www.scintilla.org Scintilla]?&lt;br /&gt;
-- Hasan --&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A simple DTP application ==&lt;br /&gt;
&lt;br /&gt;
A simple frame-based application for desktop publishing. Something like [http://www.calamus.net/ Calamus] ([http://www.calamus.net/man/index_us.htm here] is the documentation of tools and modules). Nothing fancy, just application that can lay out frames, control text flow, use paragraph styles and master pages.&lt;br /&gt;
&lt;br /&gt;
I'd rather see TeXView.app come back myself.... I think it's far more feasible (doing a decent page layout app is _hard_ just as Donald E. Knuth). Perhaps better still would be to take advantage of LyX's ``GUI-independence'' and provide a GNUstep front-end for it, http://www.lyx.org .&lt;br /&gt;
&lt;br /&gt;
No, nothing like LyX or TeX. I have in mind a ''visual'' page layout editing tool with features as described above (similar to PageMaker). LyX and TeX are a bit different approaches and should be alternatives to Frame based DTP application.&lt;br /&gt;
&lt;br /&gt;
 - Stefan&lt;br /&gt;
&lt;br /&gt;
I think a heavy-weight drawing package w/ page layout features would be a better solution here (this is the workflow I'm using on my NeXT Cube now), then it could be tied into an XML-based workflow in a fashion like to Apple's new Keynote, perhaps in a fashion like to Pages-by-Pages. To describe my workflow a bit---I now use Altsys Virtuoso on my NeXT Cube w/ Omega (Unicode-aware TeX variant) for most of my page layout. IME, if a document gets too large to manage w/ Altsys Virtuoso, it might as well go into TeX... Not that I'd mind seeing a replacement for PasteUp.app, I just think that a drawing program is more immediately important / useful.&lt;br /&gt;
&lt;br /&gt;
For simple DTP utility, I'd dearly love to see a re-creation of [http://members.aol.com/willadams/gnustep/apps/type/touchtype.html TouchType.app]&lt;br /&gt;
&lt;br /&gt;
 - William&lt;br /&gt;
&lt;br /&gt;
Maybe you should take a look at [http://www.texmacs.org/ TeXmacs]. Looks promising and is in great need of a GNUstep frontend.&lt;br /&gt;
&lt;br /&gt;
 - david.&lt;br /&gt;
&lt;br /&gt;
Interesting. I'd seen TeXMacs mentioned on comp.text.tex quite often, but hadn't realized it had gotten as far as it had. Interesting counterpoint to LyX.&lt;br /&gt;
 - William&lt;br /&gt;
&lt;br /&gt;
One really interesting thing would be to have a fame class which would useful enough so it could be used to put together a simple DTP Application but which would be flexible enough that it could be available to any application - the text control is a standard control for windows managers like MS Windows or Gnome. If there were an equivalent &amp;quot;flowing graphic control&amp;quot;, you'd have a powerful building block indeed (note that in MS windows, the text control is actually poor enough that no credible application can built around besides notepad).&lt;br /&gt;
Also, for a programming text editor, scintilla is great. One thing to consider is that for DTP/HTML editor, what you would want would be a *superset* of the scintilla interface. It would be great to add all the different features in such a way that you didn't have interfaces duplicating each other's functionalities.&lt;br /&gt;
&lt;br /&gt;
-- JosephSolbrig&lt;br /&gt;
&lt;br /&gt;
== Painting app (photoshop) ==&lt;br /&gt;
&lt;br /&gt;
Bitmap drawing app.&lt;br /&gt;
&lt;br /&gt;
Think Photoshop, not Gimp&lt;br /&gt;
&lt;br /&gt;
In fact, forget that. Something new.&lt;br /&gt;
&lt;br /&gt;
Something usable - can do Photoshop, but easy to learn. The Gimp can nearly do photoshop, but who can use it?&lt;br /&gt;
&lt;br /&gt;
It would be great if it consisted of two parts - a very small very useful image viewer/manager (eg gqview) and the actual editor plugin (the big part). So installing image-core would give a very small useful app, then adding image-edit would make it into photoshop.&lt;br /&gt;
&lt;br /&gt;
When opening an image file eg by clicking on it or running image-core thefile.jpg then only the core apps should start, so it starts real quick. If i right-click and choose edit or something .. THEN the other stuff is pulled in.&lt;br /&gt;
&lt;br /&gt;
Or whatever. Just an idea. But makes development path cool. Could also have a vector plugin, or whatever.&lt;br /&gt;
&lt;br /&gt;
Maybe we should wait, when (if?) gimp gets 'gegl'ed (http://gegl.org).&lt;br /&gt;
then having a decent photoshop like app would be as simple as writing a gui for the gegl foundation.&lt;br /&gt;
+ gives us a nice featureset + plugins!&lt;br /&gt;
&lt;br /&gt;
Maliwan project is aiming to achieve the same goal of GEGL. Right now GEGL isn't even half complete but we can still reimplement it base on GEGL's design. lastlife is waiting for you in irc if you want to discuss the idea. Maliwan is planned to be the heart of the BluTulip which is the actual application.&lt;br /&gt;
&lt;br /&gt;
== Calendar ==&lt;br /&gt;
&lt;br /&gt;
check  SKYRIX libs (Opengroupware).&lt;br /&gt;
 http://www.opengroupware.org/cvsweb/cvsweb.cgi/OpenGroupware.org/SOPE/skyrix-core/NGiCal/&lt;br /&gt;
&lt;br /&gt;
== CVS app ==&lt;br /&gt;
&lt;br /&gt;
Port CVL&lt;br /&gt;
&lt;br /&gt;
== Task management app ==&lt;br /&gt;
&lt;br /&gt;
Chronographer (lobbying by ludovic) + libical&lt;br /&gt;
or&lt;br /&gt;
~TaskManager (lobbying by Fabien) + libical&lt;br /&gt;
&lt;br /&gt;
Check SKYRIX libs (Opengroupware)&lt;br /&gt;
&lt;br /&gt;
== ICQ ==&lt;br /&gt;
&lt;br /&gt;
and other instant messengers.&lt;br /&gt;
check http://freshmeat.net/projects/fireapp/&lt;br /&gt;
&lt;br /&gt;
== DatabaseModeller.app ==&lt;br /&gt;
&lt;br /&gt;
See [DBModeler], currently a work in progress.&lt;br /&gt;
&lt;br /&gt;
== Database management ==&lt;br /&gt;
&lt;br /&gt;
A desktop software (Like [http://www.flex.ro/pgaccess/ PgAccess] for example) to manage database. This program could use the GDL2 (Gnustep Database Library). It could be a good exercice and demonstration of this very good library.&lt;br /&gt;
&lt;br /&gt;
== Video conferencing software ==&lt;br /&gt;
&lt;br /&gt;
There's [http://www.gnomemeeting.org/ Gnomemeeting] (excellent piece of software), but I don't like Gnome too much (all those dependencies).&lt;br /&gt;
&lt;br /&gt;
Update: Gnomemeeting 0.9.6 is supposed to work without Gnome libs (limited functionality).&lt;br /&gt;
&lt;br /&gt;
== CronniX - A cron front end ==&lt;br /&gt;
&lt;br /&gt;
http://www.koch-schmidt.de/cronnix/&lt;br /&gt;
&lt;br /&gt;
That won't be easily portable, as different OSs use a different cron setup. Eg. BSD has (and uses) both, /etc/crontab __and__ /var/cron/tabs/&amp;lt;username&amp;gt; ...&lt;br /&gt;
&lt;br /&gt;
== PfaEdit - A font editor ==&lt;br /&gt;
&lt;br /&gt;
(This is now called FontForge)&lt;br /&gt;
&lt;br /&gt;
http://pfaedit.sourceforge.net&lt;br /&gt;
&lt;br /&gt;
Actually, Cenon (see above) is able to do some limited font editing. Not to knock pfaedit, I use it a lot and think it's a way cool program. Wonder if the two could be merged somehow.&lt;br /&gt;
&lt;br /&gt;
== GuileServices / StepTalk Services ==&lt;br /&gt;
&lt;br /&gt;
On NeXTSTEP there was an application (service?) called [TickleServices|http://www.doubleu.com/TickleServices.html] that allowed you to write your own services in the Tcl language. Something along these lines, but using guile/steptalk would be a nice addition to gnustep.&lt;br /&gt;
&lt;br /&gt;
== Printer.app ==&lt;br /&gt;
&lt;br /&gt;
An application/framework for managing printers, printer properties and print queues. (CUPS frontend?)&lt;br /&gt;
&lt;br /&gt;
== DivX/XViD/DVD/VCD Player ==&lt;br /&gt;
&lt;br /&gt;
I see that there was at least an attempt to port mplayer at one point but it seems to be dead. Maybe VLC (http://www.videolan.org/) which does have an OSX version, could be ported.&lt;br /&gt;
&lt;br /&gt;
== Abiword (Word Processor) ==&lt;br /&gt;
&lt;br /&gt;
A port of the Cocoa version of [AbiWord|http://www.abisource.com] would be great, considering a word processor is a pretty vital application, and that Abiword is a pretty good one.&lt;br /&gt;
&lt;br /&gt;
== Spreadsheet ==&lt;br /&gt;
&lt;br /&gt;
A spreadsheet application would be great for GNUstep.  A clone of Lotus Improv or Lighthouse Design's Parasheet would be a nice thing for GNUstep to have.&lt;br /&gt;
&lt;br /&gt;
== Pixen (Pixel Art Tool) ==&lt;br /&gt;
&lt;br /&gt;
[Pixen|http://www.opensword.org] is a decent, open source pixel art tool and there aren't alot of free or professional programs like it. There is also a compliment tool by the same guys for mapping called Reptile.&lt;br /&gt;
&lt;br /&gt;
We're working on a GNUstep port now, in fact.&lt;br /&gt;
&lt;br /&gt;
== Growl! (Global notification system) ==&lt;br /&gt;
&lt;br /&gt;
[http://growl.info/ Growl!] uses distributed notification center to display a graphic message on screen. Every application can send messages to it, for example, when new emails arrive, buddies sign in the instant messager, a task end, etc. It is very easy to implement.&lt;br /&gt;
&lt;br /&gt;
== Digital Librarian-like ==&lt;br /&gt;
&lt;br /&gt;
I would really, really like a Digital Librarian for GNUstep. Basically, imagine an application that manage your documents the same way iTunes manage your music or iPhoto your photos... (to take well-known OSX apps as example ;-)&lt;br /&gt;
&lt;br /&gt;
It would provide 1) automatic management of the documents by projects/ideas/whatever metadata 2) index your documents to let you search quickly in it 3) handles bibliography&lt;br /&gt;
As a postgrad student I have a LOT of articles in PDF/PS/DVI/html on my hard drive, and such an application would be really nice to help managing that.&lt;br /&gt;
&lt;br /&gt;
A Digital Librarian screenshot: http://www.levenez.com/NeXTSTEP/Librarian.jpg&lt;br /&gt;
A screenshot of Vertex Librarian, a similar program for NeXTSTEP: http://www.levenez.com/NeXTSTEP/VertexLibrarian.jpg&lt;br /&gt;
&lt;br /&gt;
== nib2gmodel/nib2gorm without OPENSTEP/MacOSX ==&lt;br /&gt;
&lt;br /&gt;
I want;but I heard it is so hard to implementation. :-(&lt;br /&gt;
&lt;br /&gt;
== iTunes/Rhythmbox clone ==&lt;br /&gt;
&lt;br /&gt;
It would be nice to see a music or video player with real music/media management like [http://www.gnome.org/projects/rhythmbox/ Rhythmbox] or [http://www.apple.com/itunes/ iTunes]. iTunes has started to support management of movies and videoclips, so maybe media management is the way to go?&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Property_Lists&amp;diff=1139</id>
		<title>Property Lists</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Property_Lists&amp;diff=1139"/>
		<updated>2005-07-07T10:04:44Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Sentence flow cleanups&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NOTE: this document is still a work in progress. No responsibility is accepted for any problems arising from inaccuracies.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Property lists are used throughout GNUstep to store defaults, program settings, application meta information, and so on. MacOS X has begun to use XML based property lists, but GNUstep uses the classic property list format.(TODO: history of this style of property list). Support in GNUstep for XML property lists is still limited on some platforms; this situation should improve in the future as libxml platform build issues are resolved within GNUstep.&lt;br /&gt;
&lt;br /&gt;
A property list is a logical tree of arrays, dictionaries, strings and numbers. The arrays and dictionaries may contain other arrays and dictionaries as data elements, and structures may become quite rich and expressive when representing complex data relationships. TODO: limits of embedding array/dictionaries inside each other.&lt;br /&gt;
&lt;br /&gt;
== Dictionary ==&lt;br /&gt;
&lt;br /&gt;
A dictionary is a list of key-value pairs, where each item in the list has a name associated with it (key) and another type (value), which could be another dictionary, an array or often a string. It programmatically corresponds to NSDictionary/NSMutableDictionary. They take the following syntax:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    KeyName1 = Value1;&lt;br /&gt;
    AnotherKeyName = &amp;quot;Value2&amp;quot;;&lt;br /&gt;
    Something = ( &amp;quot;ArrayItem1&amp;quot;, &amp;quot;ArrayItem2&amp;quot;, &amp;quot;ArrayItem3&amp;quot; );&lt;br /&gt;
    Key4 = 0.10;&lt;br /&gt;
    KeyFive = { Dictionary2Key1 = &amp;quot;Something&amp;quot;; AnotherKey = &amp;quot;Somethingelse&amp;quot;; };&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
As can be seen, each key-value pair is seperated by a semi-colon. Within the pair, the key is seperated from the value with an &amp;quot;equals&amp;quot; (=) sign. The key name is arbitrary, and not put in inverted commas (&amp;quot;&amp;quot;). Shown above are:  an unknown type (could be some sort of string - TODO), a string, an array, a number and another dictionary  (respectively).&lt;br /&gt;
&lt;br /&gt;
== Array ==&lt;br /&gt;
&lt;br /&gt;
An array is a list of values, each of the same type (often arrays or dictionaries). Programmatically, it uses NSArray/NSMutableArray. It takes a syntax similar to the following:&lt;br /&gt;
&lt;br /&gt;
 ( Value1, Value2, Value3, Value4 )&amp;lt;br&amp;gt;&lt;br /&gt;
 or&amp;lt;br&amp;gt;&lt;br /&gt;
 (&lt;br /&gt;
    Value1,&lt;br /&gt;
    Value2,&lt;br /&gt;
    Value3,&lt;br /&gt;
    Value4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
Each value is seperated by commas. By the technical definition of an array, each value is of the same type (but I believe GNUstep permits different types TODO: check this).&lt;br /&gt;
&lt;br /&gt;
== Programming ==&lt;br /&gt;
&lt;br /&gt;
GNUstep permits such property list files (normally having a .plist extension) to be loaded and subsequently used in your applications or tools. FoundationKit - in our case gnustep-base - classes NSDictionary and NSArray are used as representations of the property list data structures. Check the base API documentation for more information on working with these types programmatically.&lt;br /&gt;
&lt;br /&gt;
NSString can be used to turn property lists in string form - either read from a file or constructed programmatically - to an equivalent data structure in memory. Again, see the API documentation for NSString (particularly the propertyList method).&lt;br /&gt;
&lt;br /&gt;
== Other tips ==&lt;br /&gt;
&lt;br /&gt;
* Property lists are much like C programming, where newlines and spaces and tabs are not so important to parsing.&lt;br /&gt;
* Some examples of property lists may include:&lt;br /&gt;
** ~/GNUstep/System/Defaults/.GNUstepDefaults (this is your defaults file for software; be careful when editing)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Property_Lists&amp;diff=838</id>
		<title>Property Lists</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Property_Lists&amp;diff=838"/>
		<updated>2005-07-07T09:55:57Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Spelling and sentence flow update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NOTE: this document is still a work in progress. No responsibility is accepted for any problems arising from inaccuracies.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Property lists are used throughout GNUstep to store defaults, program settings, application meta information, etc. MacOS X uses XML based property lists, but GNUstep uses another property list implementation also (TODO: history of this style of property list). Support for XML property lists is still wanting on some platforms; this situation should improve in the future.&lt;br /&gt;
&lt;br /&gt;
They are composed of a &amp;quot;tree of arrays and dictionary's, which may be embedded inside each other for several layers. TODO: limits of embedding array/dictionaries inside each other.&lt;br /&gt;
&lt;br /&gt;
== Dictionary ==&lt;br /&gt;
&lt;br /&gt;
A dictionary is a list of key-value pairs, where each item in the list has a name associated with it (key) and another type (value), which could be another dictionary, an array or often a string. It programmatically corresponds to NSDictionary/NSMutableDictionary. They take the following syntax:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    KeyName1 = Value1;&lt;br /&gt;
    AnotherKeyName = &amp;quot;Value2&amp;quot;;&lt;br /&gt;
    Something = ( &amp;quot;ArrayItem1&amp;quot;, &amp;quot;ArrayItem2&amp;quot;, &amp;quot;ArrayItem3&amp;quot; );&lt;br /&gt;
    Key4 = 0.10;&lt;br /&gt;
    KeyFive = { Dictionary2Key1 = &amp;quot;Something&amp;quot;; AnotherKey = &amp;quot;Somethingelse&amp;quot;; };&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
As can be seen, each key-value pair is seperated by a semi-colon. Within the pair, the key is seperated from the value with an &amp;quot;equals&amp;quot; (=) sign. The key name is arbitrary, and not put in inverted commas (&amp;quot;&amp;quot;). Shown above are:  an unknown type (could be some sort of string - TODO), a string, an array, a number and another dictionary  (respectively).&lt;br /&gt;
&lt;br /&gt;
== Array ==&lt;br /&gt;
&lt;br /&gt;
An array is a list of values, each of the same type (often arrays or dictionaries). Programmatically, it uses NSArray/NSMutableArray. It takes a syntax similar to the following:&lt;br /&gt;
&lt;br /&gt;
 ( Value1, Value2, Value3, Value4 )&amp;lt;br&amp;gt;&lt;br /&gt;
 or&amp;lt;br&amp;gt;&lt;br /&gt;
 (&lt;br /&gt;
    Value1,&lt;br /&gt;
    Value2,&lt;br /&gt;
    Value3,&lt;br /&gt;
    Value4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
Each value is seperated by commas. By the technical definition of an array, each value is of the same type (but I believe GNUstep permits different types TODO: check this).&lt;br /&gt;
&lt;br /&gt;
== Programming ==&lt;br /&gt;
&lt;br /&gt;
GNUstep permits such property list files (normally having a .plist extension) to be loaded and subsequently used in your applications or tools. FoundationKit - in our case gnustep-base - classes NSDictionary and NSArray are used as representations of the property list data structures. Check the base API documentation for more information on working with these types programmatically.&lt;br /&gt;
&lt;br /&gt;
NSString can be used to turn property lists in string form - either read from a file or constructed programmatically - to an equivalent data structure in memory. Again, see the API documentation for NSString (particularly the propertyList method).&lt;br /&gt;
&lt;br /&gt;
== Other tips ==&lt;br /&gt;
&lt;br /&gt;
* Property lists are much like C programming, where newlines and spaces and tabs are not so important to parsing.&lt;br /&gt;
* Some examples of property lists may include:&lt;br /&gt;
** ~/GNUstep/System/Defaults/.GNUstepDefaults (this is your defaults file for software; be careful when editing)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Development_tools&amp;diff=960</id>
		<title>Development tools</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Development_tools&amp;diff=960"/>
		<updated>2005-07-06T12:27:13Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Added unit testing frameworks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More abou development tools: http://www.gnustep.org/experience/DeveloperTools.html&lt;br /&gt;
&lt;br /&gt;
== Gorm - Graphical Object Relationship Modeller ==&lt;br /&gt;
&lt;br /&gt;
Gorm stands for &amp;quot;Graphical Object Relationship Modeller&amp;quot; and is GNUstep's easy-to-use interface designer. &lt;br /&gt;
&lt;br /&gt;
With Gorm designing tough and complex graphical interfaces for your applications can be done easily and quickl, using drag &amp;amp; drop, powerful inspectors and teamwork with ProjectCenter.&lt;br /&gt;
&lt;br /&gt;
Gorm allows developers to quickly create and edit graphical application interfaces using a whole lot of GUI elements: windows, menus, buttons, labels, sliders, tables, textfields, browsers, images, altert panels and more. Custom palettes can be dynamically loaded to add additional elements or functionality.&lt;br /&gt;
&lt;br /&gt;
After creating the interface, objects can be linked using mouse operations. Also Gorm features interactive testing of interfaces.&lt;br /&gt;
&lt;br /&gt;
Please see the following wiki sections to learn tips on how to effectively utilize Gorm:&lt;br /&gt;
&lt;br /&gt;
* [[Gorm Manual]]&lt;br /&gt;
* [[Gorm FAQ]]&lt;br /&gt;
* [[Gorm Installation On Windows]]&lt;br /&gt;
&lt;br /&gt;
Also see the following external links:&lt;br /&gt;
&lt;br /&gt;
* ''' [http://www.gnustep.org/experience/Gorm.html Official Gorm page] '''&lt;br /&gt;
&lt;br /&gt;
* '''[http://packages.debian.org/cgi-bin/search_packages.pl?keywords=gorm&amp;amp;searchon=names&amp;amp;version=all&amp;amp;exact=1&amp;amp;release=all  Debian Offical Release]'''&lt;br /&gt;
&lt;br /&gt;
* '''[http://www.freshports.org/devel/gorm FreeBSD Ports]'''&lt;br /&gt;
&lt;br /&gt;
== Project Center ==&lt;br /&gt;
''' [http://www.gnustep.org/experience/ProjectCenter.html Project Center] '''&lt;br /&gt;
&lt;br /&gt;
ProjectCenter is GNUstep's integrated developement environment (IDE). It is based in part on NeXT's original Project Builder. It assists you in starting new projects and lets you manage your project files using a intuitive and well ordered graphical user interface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other tools ==&lt;br /&gt;
&lt;br /&gt;
=== Unit Testing ===&lt;br /&gt;
&lt;br /&gt;
GNUstep is blessed with a number of unit test frameworks: &lt;br /&gt;
&lt;br /&gt;
* Traditionally, it has provided a [http://www.gnustep.org/resources/documentation/testdoc_toc.html testing environment] based around Guile, an implementation of Scheme that has been blessed as the preferred GNU scripting language. It has been hard to convince Objective-C programmers to write tests in this language, and the utility of the package has not lived up to expectations.&lt;br /&gt;
&lt;br /&gt;
* GNUstep now also contains a unit testing framework intended as general framework for testing the core GNUstep libraries, called [http://lists.gnu.org/archive/html/gnustep-dev/2005-06/msg00050.html Testsuite]. This may not be suitable for more general unit testing of applications as it's been designed to operate with little of the GNUstep environment actually running. ''Tip: use this if you're describing or fixing bugs or features in base, gui etc.''&lt;br /&gt;
&lt;br /&gt;
* [https://gna.org/projects/etoile Étoilé] contains a port to GNUstep of [http://unitkit.org/ UnitKit 1.1]. This is a straight-forward unit testing environment, suited to the needs of application developers. It also works under X-code on MacOS X.&lt;br /&gt;
&lt;br /&gt;
* [http://www.sente.ch/ Sen:te] have provided a unit testing environment called [http://www.sente.ch/software/ocunit/ OCUnit] which apparently works under GNUstep, although there are comments in the mailing lists about difficulty getting it working.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* [http://ide.roard.com/wakka.php?wiki=Main GNUstep IDE (idea)]&lt;br /&gt;
* [[Frameworks#Development|Official Development Frameworks]]&lt;br /&gt;
* [[Frameworks#Development_2|Development Frameworks]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Creating_document_based_applications&amp;diff=827</id>
		<title>Creating document based applications</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Creating_document_based_applications&amp;diff=827"/>
		<updated>2005-07-06T09:58:45Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Add property lists to the developer category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Note: this is a work in progress. Please bear with me as I add further information. &lt;br /&gt;
--[[User:Quineska|ChrisArmstrong]] 08:33, 5 Jul 2005 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
OpenStep can provide your application a document-based model. It helps to simplify the process of creating such applications. GNUstep is compatible with this paridgm as well; this document aims to provide an overview of what is required in the creation and design of such an application.&lt;br /&gt;
&lt;br /&gt;
It is assumed you are familiar with GNUstep, and have some understanding as how to create Gorm's nib files, as well as some understanding of how they work.&lt;br /&gt;
&lt;br /&gt;
Importantly, such applications have certain components that are required, and should be considered as part of their design. At a programmatic level, classes that will be used as part of the AppKit are:&lt;br /&gt;
&lt;br /&gt;
==== NSDocument ====&lt;br /&gt;
&lt;br /&gt;
This class is central to the OpenStep document based model. Such an application declares a new instance of a subclass of NSDocument for each “document” that is opened. It will be necessary to subclass NSDocument to implement this.&lt;br /&gt;
&lt;br /&gt;
Each instance of your NSDocument subclass may have one or more windows associated with it. These are used as an interface for loading and saving a representation of your document type. Each window will have an “NSWindowController” instance associated with it, where NSDocument maintains a list of these.&lt;br /&gt;
&lt;br /&gt;
==== NSDocumentController ====&lt;br /&gt;
&lt;br /&gt;
This class acts a controller. It maintains a list of documents (instances of your NSDocument subclass) and is responsible for loading and instantiating new documents. It is usually not necessary to implement a subclass of this, but often it may be useful to implement special functionality (especially related to open documents as a whole).&lt;br /&gt;
&lt;br /&gt;
==== NSWindowController ====&lt;br /&gt;
&lt;br /&gt;
As mentioned above, NSWindowController instances are individually associated with one NSWindow instance, in such a way that a document maintains a list of window controllers that are reponsible for rendering the views associated with a document.&lt;br /&gt;
&lt;br /&gt;
You will most likely not have to subclass NSWindowController. Instead, you associate a nib file (the Gorm output) with the subclass of NSDocument, and NSDocumentController will load this nib file for each document that is created or loaded.&lt;br /&gt;
&lt;br /&gt;
For example, a text based application that is used for the editing of plain text files, may subclass NSDocument with a TextDocument class. Each instance of this class would have an NSWindowController instance associated with it, which in turn manages a window instance that is instantiated from a nib file. The NSDocumentController instance, as managed and instatiated by GNUstep, would be responsible for loading and saving documents in your application. It even prompts the user to save their documents when they try to quit the application.&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
&lt;br /&gt;
In building your application you will need to create a number of components. From scratch, the following should be a rough guide to getting it working.&lt;br /&gt;
&lt;br /&gt;
=== The Makefile ===&lt;br /&gt;
&lt;br /&gt;
For this type of application, no special makefile is needed: it just has to be a normal application. Project Builder should be able to spit out the required makefile and Gorm files that are needed for a generic application. Otherwise use the following as a template:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GNUmakefile'''&lt;br /&gt;
&lt;br /&gt;
 include $(GNUSTEP_MAKEFILES)/common.make&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
 APP_NAME = DocumentApp&amp;lt;br&amp;gt;&lt;br /&gt;
 DocumentApp_OBJC_FILES =&amp;lt;br&amp;gt;&lt;br /&gt;
  MyDocument.m &amp;lt;br&amp;gt;&lt;br /&gt;
  main.m&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
 DocumentApp_RESOURCES = \ &amp;lt;br&amp;gt;&lt;br /&gt;
  Resources/Info-gnustep.plist \&amp;lt;br&amp;gt;&lt;br /&gt;
  Resources/DocumentApp.gorm \&amp;lt;br&amp;gt;&lt;br /&gt;
  Resources/MyDocument.gorm&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
 -include GNUmakefile.preamble&amp;lt;br&amp;gt;&lt;br /&gt;
 include $(GNUSTEP_MAKEFILES)/application.make&amp;lt;br&amp;gt;&lt;br /&gt;
 -include GNUmakefile.postamble&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more information as to customising this file, as well as setting up compiler options for third party libraries and includes, see the GNUstep makefile manual.&lt;br /&gt;
&lt;br /&gt;
=== The application dictionary - Info-gnustep.plist ===&lt;br /&gt;
&lt;br /&gt;
For those that have edited this file in their project before, it is a dictionary with various values entered. For our purposes, we need an array within the main dictionary, called &amp;quot;NSTypes&amp;quot;. This is a array of unnamed dictionaries, with one dictionary for each type. &lt;br /&gt;
&lt;br /&gt;
An entire example of this file, for a &amp;quot;theoretical&amp;quot; TextEdit application (please note that such an application does exist as an example application from Next I think, and again on MacOS X but I have constructed a much simpler version, used only for plain text files).&lt;br /&gt;
&lt;br /&gt;
Taking a look at the single dictionary entry in the NSTypes array, the following key-value pairs are needed:&lt;br /&gt;
* '''NSDocumentClass:''' This is (string) the subclass name you use in your code, the &amp;quot;objective-c name&amp;quot; of your document subclass. This is used by NSDocumentController's default implementation to create instances of your document type.&lt;br /&gt;
* '''NSName:''' The generic file type (string). This is completely arbitrary, and can be anything you like. For the purpose of conventions, it may be more appropriate not to use the &amp;quot;NS&amp;quot; or &amp;quot;GS&amp;quot; prefix (the latter of which I not sure), and instead use either your own, or no prefix at all.&lt;br /&gt;
* '''NSHumanReadableName:''' The human readable name of your document type (string)? TODO: explain where this is used.&lt;br /&gt;
* '''NSUnixExtensions:''' An array of strings, each containing a file extension connected to this document type on &amp;quot;unix&amp;quot; platforms. TODO: explain how &amp;quot;unix&amp;quot; is interpreted by GNUstep.&lt;br /&gt;
* '''NSDOSExtensions:''' An array of strings, each containing a file extenstion connected to this document type on &amp;quot;DOS&amp;quot; platforms (could be loosely interpreted as any MS platforms GNUstep runs on, i.e. Windows 2000/XP).&lt;br /&gt;
* '''NSRole:''' A string, either &amp;quot;Viewer&amp;quot; or &amp;quot;Editor&amp;quot;, depending on how your document operates on this file type.&lt;br /&gt;
* '''NSIcon:''' A icon name associated with this document type. TODO: Investigate how this works.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Info-gnustep.plist'''&lt;br /&gt;
 {&lt;br /&gt;
     ApplicationDescription = &amp;quot;A simple text editor for GNUstep.&amp;quot;;&lt;br /&gt;
     ApplicationName = TextEdit;&lt;br /&gt;
     ApplicationRelease = 0.10;&lt;br /&gt;
     Authors = ( &amp;quot;Christopher Armstrong &amp;lt;quineska@gamebox.net&amp;quot; );&lt;br /&gt;
     Copyright = &amp;quot;Copyright (C) 2005 Christopher Armstrong&amp;quot;;&lt;br /&gt;
     CopyrightDescription = &amp;quot;Released under GPL.&amp;quot;;&lt;br /&gt;
     FullVersionID = 0.10;&lt;br /&gt;
     NSExecutable = TextEdit;&lt;br /&gt;
     NSMainNibFile = TextEdit.gorm;&lt;br /&gt;
     NSPrincipalClass = NSApplication;&lt;br /&gt;
     NSRole = Application;&lt;br /&gt;
     NSTypes = (&lt;br /&gt;
         {&lt;br /&gt;
                 NSDocumentClass = &amp;quot;TextDocument&amp;quot;;&lt;br /&gt;
                 NSName = &amp;quot;GSTextDocumentType&amp;quot;;&lt;br /&gt;
                 NSHumanReadableName = &amp;quot;Text Document&amp;quot;;&lt;br /&gt;
                 NSUnixExtensions = ( &amp;quot;txt&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;
                 NSDOSExtensions = ( &amp;quot;txt&amp;quot; );&lt;br /&gt;
                 NSRole = Editor;&lt;br /&gt;
         }&lt;br /&gt;
     );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more information on property list files, consult [[Property Lists]].&lt;br /&gt;
&lt;br /&gt;
=== Interface file ===&lt;br /&gt;
&lt;br /&gt;
Two interface files are needed: one for your main application, and another that will be instantiated with each instance of your document subclass. These both should be listed as resources in your makefile, (as shown the GNUmakefile example above). It may be helpful to name the document nib file after your class.&lt;br /&gt;
&lt;br /&gt;
==== Application Interface File ====&lt;br /&gt;
&lt;br /&gt;
The application one should just be a menu (though it could be more if necessary). When constructing it, take the following into account:&lt;br /&gt;
&lt;br /&gt;
* Use a standard Gorm template for an application.&lt;br /&gt;
* Delete the window instance in the &amp;quot;Objects&amp;quot; pane (unless you need a main window, in which case I don't know how to operate).&lt;br /&gt;
* Set NSOwner's class to &amp;quot;NSDocumentController&amp;quot; (this is the custom class option of NSOwner in the property inspector). This ensures openDocument, newDocument, etc. messages, as sent to NSFirst, get picked up by NSDocumentController. Do not instantiate it (I believe you can't anyway).&lt;br /&gt;
* If you intend to subclass NSDocumentController, subclass it in the Classes pane. To make sure that this class is instantiated and used, make sure you instantiate it in Gorm or in your main.m file, and set NSOwner to be your subclass.&lt;br /&gt;
* Drag a Document menu from the palette onto your main menu. This already has the proper linkage for each relevant message for a document setup to be directed to NSFirst. In the case of generic messages (such as openDocument:, not associated with any document instance), these are forwarded to the shared instance of NSDocumentController (see it's reference documentation). When a document is active, more specific messages (such as close: or saveDocument:) are forwarded to the relevant document instance of your NSDocument subclass.&lt;br /&gt;
* Add any appropriate menus such as &amp;quot;Info&amp;quot; and &amp;quot;Format&amp;quot; which may be relevant to your application.&lt;br /&gt;
&lt;br /&gt;
==== Document Interface File ====&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Document_based_applications&amp;diff=2024</id>
		<title>Document based applications</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Document_based_applications&amp;diff=2024"/>
		<updated>2005-07-06T09:58:18Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Added to category Development&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Document based applications use NSDocument and NSDocumentController in their implementation. &lt;br /&gt;
&lt;br /&gt;
[[NSDocument]]&lt;br /&gt;
&lt;br /&gt;
[[Creating document based applications]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Property_Lists&amp;diff=835</id>
		<title>Property Lists</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Property_Lists&amp;diff=835"/>
		<updated>2005-07-06T09:57:29Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Added to category Development&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NOTE: '''If anything below is dead wrong, please fix immediately. It is a work in progress. I am constructing this based on my experience with GNUstep, NOT any reference documentation that may exist. I don't warrant it fit for any purpose whatsoever, nor shall I take any responsibility for any issues or losses or problems etc that may arise from its use. (Christopher Armstrong, --[[User:Quineska|ChrisArmstrong]] 08:38, 6 Jul 2005 (CEST))'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Property lists are used throughout GNUstep to store defaults, program settings, application meta information, etc. MacOS X uses XML based property lists, but GNUstep uses another property list implementation also (TODO: history of this style of property list).&lt;br /&gt;
&lt;br /&gt;
They are composed of a &amp;quot;tree of arrays and dictionary's, which may be embedded inside each other for several layers. TODO: limits of embedding array/dictionaries inside each other.&lt;br /&gt;
&lt;br /&gt;
== Dictionary ==&lt;br /&gt;
&lt;br /&gt;
A dictionary is a list of key-value pairs, where each item in the list has a name associated with it (key) and another type (value), which could be another dictionary, an array or often a string. It programmatically corresponds to NSDictionary/NSMutableDictionary. They take the following syntax:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    KeyName1 = Value1;&lt;br /&gt;
    AnotherKeyName = &amp;quot;Value2&amp;quot;;&lt;br /&gt;
    Something = ( &amp;quot;ArrayItem1&amp;quot;, &amp;quot;ArrayItem2&amp;quot;, &amp;quot;ArrayItem3&amp;quot; );&lt;br /&gt;
    Key4 = 0.10;&lt;br /&gt;
    KeyFive = { Dictionary2Key1 = &amp;quot;Something&amp;quot;; AnotherKey = &amp;quot;Somethingelse&amp;quot;; };&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
As can be seen, each key-value pair is seperated by a semi-colon. Within the pair, the key is seperated from the value with an &amp;quot;equals&amp;quot; (=) sign. The key name is arbitrary, and not put in inverted commas (&amp;quot;&amp;quot;). Shown above are a (unknown type, could be some sort of string - TODO), a string, an array, a number and another dictionary  (respectively).&lt;br /&gt;
&lt;br /&gt;
== Array ==&lt;br /&gt;
&lt;br /&gt;
An array is a list of values, each of the same type (often arrays or dictionaries). Programmatically, it uses NSArray/NSMutableArray. It takes a syntax similar to the following:&lt;br /&gt;
&lt;br /&gt;
( Value1, Value2, Value3, Value4 )&lt;br /&gt;
&lt;br /&gt;
Each value is seperated by commas. By the technical definition of an array, each value is of the same type (but I believe GNUstep permits different types).&lt;br /&gt;
&lt;br /&gt;
== Programming ==&lt;br /&gt;
&lt;br /&gt;
GNUstep permits such property list files (denoted with a .plist extenstion) to be loaded and subsequently used in your applications or tools. NSDictionary and NSArray are used as representations of the above in the Foundation library (gnustep-base).&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Category:Development&amp;diff=2039</id>
		<title>Category:Development</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Category:Development&amp;diff=2039"/>
		<updated>2005-07-06T09:56:50Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Reverted - I don't understand categories ;-)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Category:Development&amp;diff=822</id>
		<title>Category:Development</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Category:Development&amp;diff=822"/>
		<updated>2005-07-06T09:54:43Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Add property lists to the developer category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Property Lists]]&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Developer_Guides&amp;diff=834</id>
		<title>Developer Guides</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Developer_Guides&amp;diff=834"/>
		<updated>2005-07-06T08:51:24Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Reordered into alpha order, added the Property lists topic&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Coding for portability ==&lt;br /&gt;
&lt;br /&gt;
Writing code that will compile and then run on different platforms can be surprisingly easy. [[Writing portable code]] describes some straight-forward steps to take to make your program easy to port to new platforms.&lt;br /&gt;
&lt;br /&gt;
== Document based application design ==&lt;br /&gt;
&lt;br /&gt;
One of the most common use-patterns of applications on modern platforms is that of document-based applications - applications which can have several active user-controlled contexts. &lt;br /&gt;
&lt;br /&gt;
Some familar examples might be a word processor where the user may have multiple document windows concurrently, or a web browser which allows a user to have a number of different browser windows open at the same time.&lt;br /&gt;
&lt;br /&gt;
[[Document based applications]] provides information and tips on how to code this style of application.&lt;br /&gt;
&lt;br /&gt;
== Using property lists ==&lt;br /&gt;
&lt;br /&gt;
A regular issue that programmers face is storing structured configuration information, and reading it back. GNUstep has a standard mechanism that can be used for this task, amongst others: [[Property lists]].&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Developer_Guides&amp;diff=821</id>
		<title>Developer Guides</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Developer_Guides&amp;diff=821"/>
		<updated>2005-07-05T21:26:55Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Added portability section and provided more context&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Document based application design ==&lt;br /&gt;
&lt;br /&gt;
One of the most common use-patterns of applications on modern platforms is that of document-based applications - applications which can have several active user-controlled contexts. &lt;br /&gt;
&lt;br /&gt;
Some familar examples might be a word processor where the user may have multiple document windows concurrently, or a web browser which allows a user to have a number of different browser windows open at the same time.&lt;br /&gt;
&lt;br /&gt;
[[Document based applications]] provides information and tips on how to code this style of application.&lt;br /&gt;
&lt;br /&gt;
== Coding for portability ==&lt;br /&gt;
&lt;br /&gt;
Writing code that will compile and then run on different platforms can be surprisingly easy. [[Writing portable code]] describes some straight-forward steps to take to make your program easy to port to new platforms.&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.gnustep.org/index.php?title=Talk:Document_based_applications&amp;diff=2028</id>
		<title>Talk:Document based applications</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gnustep.org/index.php?title=Talk:Document_based_applications&amp;diff=2028"/>
		<updated>2005-07-05T21:07:19Z</updated>

		<summary type="html">&lt;p&gt;Comrade: Ideas for page enhancement&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For these kinds of programming topics, I'd suggest more explanation about how the application looks like, and perhaps some real-world code, more than just snippets (snippets are good for small things, but not big ideas like this where there are some gotchas). -Comrade&lt;/div&gt;</summary>
		<author><name>Comrade</name></author>
	</entry>
</feed>